From 3d2aa79ccbaaf341c44c492097ba714e89ec518d Mon Sep 17 00:00:00 2001 From: HanzZ Date: Sat, 13 Aug 2011 17:26:56 +0200 Subject: [PATCH] mysql removeUser --- include/transport/mysqlbackend.h | 14 ++--- include/transport/storagebackend.h | 2 +- spectrum/src/main.cpp | 2 + src/mysqlbackend.cpp | 85 ++++++++++++++++++++---------- 4 files changed, 68 insertions(+), 35 deletions(-) diff --git a/include/transport/mysqlbackend.h b/include/transport/mysqlbackend.h index 63b90784..3559ae2f 100644 --- a/include/transport/mysqlbackend.h +++ b/include/transport/mysqlbackend.h @@ -100,7 +100,7 @@ class MySQLBackend : public StorageBackend bool execute(); - bool fetch(); + int fetch(); // Pushes new data used as input for the statement. template @@ -135,13 +135,13 @@ class MySQLBackend : public StorageBackend MYSQL_STMT *m_getUserSetting; MYSQL_STMT *m_setUserSetting; MYSQL_STMT *m_updateUserSetting; - MYSQL_STMT *m_removeUser; - MYSQL_STMT *m_removeUserBuddies; - MYSQL_STMT *m_removeUserSettings; - MYSQL_STMT *m_removeUserBuddiesSettings; - MYSQL_STMT *m_addBuddy; + Statement *m_removeUser; + Statement *m_removeUserBuddies; + Statement *m_removeUserSettings; + Statement *m_removeUserBuddiesSettings; + Statement *m_addBuddy; MYSQL_STMT *m_updateBuddy; - MYSQL_STMT *m_updateBuddySetting; + Statement *m_updateBuddySetting; MYSQL_STMT *m_getBuddies; MYSQL_STMT *m_getBuddiesSettings; }; diff --git a/include/transport/storagebackend.h b/include/transport/storagebackend.h index 221cbdd8..89e5cb2f 100644 --- a/include/transport/storagebackend.h +++ b/include/transport/storagebackend.h @@ -27,7 +27,7 @@ namespace Transport { /// Represents all data needed to be stored in database. struct UserInfo { - long id; ///< id of user used as primary key in database + int id; ///< id of user used as primary key in database std::string jid; ///< barejid of XMPP user std::string uin; ///< legacy network username std::string password; ///< password for legacy network diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 613971b4..a2ccf920 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -86,12 +86,14 @@ int main(int argc, char **argv) storageBackend = new SQLite3Backend(&config); if (!storageBackend->connect()) { std::cerr << "Can't connect to database.\n"; + return -1; } } else if (CONFIG_STRING(&config, "database.type") == "mysql") { storageBackend = new MySQLBackend(&config); if (!storageBackend->connect()) { std::cerr << "Can't connect to database.\n"; + return -1; } } diff --git a/src/mysqlbackend.cpp b/src/mysqlbackend.cpp index e53e52b3..46a0a30b 100644 --- a/src/mysqlbackend.cpp +++ b/src/mysqlbackend.cpp @@ -104,7 +104,7 @@ MySQLBackend::Statement::Statement(MYSQL *conn, const std::string &format, const memset(&m_params.back(), 0, sizeof(MYSQL_BIND)); m_params.back().buffer_type= MYSQL_TYPE_LONG; - m_params.back().buffer= (unsigned long *) malloc(sizeof(unsigned long)); + m_params.back().buffer= (int *) malloc(sizeof(int)); m_params.back().is_null= 0; m_params.back().length= (unsigned long *) malloc(sizeof(unsigned long)); break; @@ -123,7 +123,7 @@ MySQLBackend::Statement::Statement(MYSQL *conn, const std::string &format, const } } - for (int i = m_resultOffset; i < format.length(); i++) { + for (int i = m_resultOffset; i >= 0 && i < format.length(); i++) { switch (format.at(i)) { case 's': m_results.resize(m_results.size() + 1); @@ -140,7 +140,7 @@ MySQLBackend::Statement::Statement(MYSQL *conn, const std::string &format, const memset(&m_results.back(), 0, sizeof(MYSQL_BIND)); m_results.back().buffer_type= MYSQL_TYPE_LONG; - m_results.back().buffer= (unsigned long *) malloc(sizeof(unsigned long)); + m_results.back().buffer= (int *) malloc(sizeof(int)); m_results.back().is_null= 0; m_results.back().length= (unsigned long *) malloc(sizeof(unsigned long)); break; @@ -185,9 +185,8 @@ MySQLBackend::Statement::~Statement() { bool MySQLBackend::Statement::execute() { // If statement has some input and doesn't have any output, we have // to clear the offset now, because operator>> will not be called. - if (m_resultOffset != 0 && m_offset + 1 == m_params.size()) { - m_offset = 0; - } + m_offset = 0; + m_resultOffset = 0; if (mysql_stmt_execute(m_stmt)) { LOG4CXX_ERROR(logger, m_string << " " << mysql_error(m_conn)); @@ -196,7 +195,7 @@ bool MySQLBackend::Statement::execute() { return true; } -bool MySQLBackend::Statement::fetch() { +int MySQLBackend::Statement::fetch() { return mysql_stmt_fetch(m_stmt); } @@ -204,10 +203,10 @@ template MySQLBackend::Statement& MySQLBackend::Statement::operator << (const T& t) { if (m_offset >= m_params.size()) return *this; - T *data = (T *) m_params[m_offset].buffer; - *data = t; + int *data = (int *) m_params[m_offset].buffer; + *data = (int) t; - LOG4CXX_INFO(logger, "adding " << m_offset << ":" << t); + LOG4CXX_INFO(logger, "adding " << m_offset << ":" << (int) t); m_offset++; return *this; } @@ -230,6 +229,7 @@ MySQLBackend::Statement& MySQLBackend::Statement::operator >> (T& t) { if (!m_results[m_resultOffset].is_null) { T *data = (T *) m_results[m_resultOffset].buffer; t = *data; + std::cout << "getting " << m_resultOffset << " " << (int) t << "\n"; } if (++m_resultOffset == m_results.size()) @@ -238,7 +238,7 @@ MySQLBackend::Statement& MySQLBackend::Statement::operator >> (T& t) { } MySQLBackend::Statement& MySQLBackend::Statement::operator >> (std::string& t) { - std::cout << "getting " << m_offset << " " << m_resultOffset << "\n"; + std::cout << "getting " << m_resultOffset << "\n"; if (m_resultOffset > m_results.size()) return *this; @@ -261,18 +261,18 @@ MySQLBackend::~MySQLBackend(){ // FINALIZE_STMT(m_setUser); delete m_setUser; delete m_getUser; - FINALIZE_STMT(m_removeUser); - FINALIZE_STMT(m_removeUserBuddies); - FINALIZE_STMT(m_removeUserSettings); - FINALIZE_STMT(m_removeUserBuddiesSettings); - FINALIZE_STMT(m_addBuddy); + delete m_removeUser; + delete m_removeUserBuddies; + delete m_removeUserSettings; + delete m_removeUserBuddiesSettings; + delete m_addBuddy; FINALIZE_STMT(m_updateBuddy); FINALIZE_STMT(m_getBuddies); FINALIZE_STMT(m_getBuddiesSettings); FINALIZE_STMT(m_getUserSetting); FINALIZE_STMT(m_setUserSetting); FINALIZE_STMT(m_updateUserSetting); - FINALIZE_STMT(m_updateBuddySetting); + delete m_updateBuddySetting; mysql_close(&m_conn); } @@ -296,16 +296,16 @@ bool MySQLBackend::connect() { m_setUser = new Statement(&m_conn, "sssssb", "INSERT INTO " + m_prefix + "users (jid, uin, password, language, encoding, last_login, vip) VALUES (?, ?, ?, ?, ?, NOW(), ?)"); m_getUser = new Statement(&m_conn, "s|isssssb", "SELECT id, jid, uin, password, encoding, language, vip FROM " + m_prefix + "users WHERE jid=?"); - PREP_STMT(m_removeUser, "DELETE FROM " + m_prefix + "users WHERE id=?"); - PREP_STMT(m_removeUserBuddies, "DELETE FROM " + m_prefix + "buddies WHERE user_id=?"); - PREP_STMT(m_removeUserSettings, "DELETE FROM " + m_prefix + "users_settings WHERE user_id=?"); - PREP_STMT(m_removeUserBuddiesSettings, "DELETE FROM " + m_prefix + "buddies_settings WHERE user_id=?"); + m_removeUser = new Statement(&m_conn, "i", "DELETE FROM " + m_prefix + "users WHERE id=?"); + m_removeUserBuddies = new Statement(&m_conn, "i", "DELETE FROM " + m_prefix + "buddies WHERE user_id=?"); + m_removeUserSettings = new Statement(&m_conn, "i", "DELETE FROM " + m_prefix + "users_settings WHERE user_id=?"); + m_removeUserBuddiesSettings = new Statement(&m_conn, "i", "DELETE FROM " + m_prefix + "buddies_settings WHERE user_id=?"); - PREP_STMT(m_addBuddy, "INSERT INTO " + m_prefix + "buddies (user_id, uin, subscription, groups, nickname, flags) VALUES (?, ?, ?, ?, ?, ?)"); + m_addBuddy = new Statement(&m_conn, "issssi", "INSERT INTO " + m_prefix + "buddies (user_id, uin, subscription, groups, nickname, flags) VALUES (?, ?, ?, ?, ?, ?)"); PREP_STMT(m_updateBuddy, "UPDATE " + m_prefix + "buddies SET groups=?, nickname=?, flags=?, subscription=? WHERE user_id=? AND uin=?"); PREP_STMT(m_getBuddies, "SELECT id, uin, subscription, nickname, groups, flags FROM " + m_prefix + "buddies WHERE user_id=? ORDER BY id ASC"); PREP_STMT(m_getBuddiesSettings, "SELECT buddy_id, type, var, value FROM " + m_prefix + "buddies_settings WHERE user_id=? ORDER BY buddy_id ASC"); - PREP_STMT(m_updateBuddySetting, "INSERT INTO " + m_prefix + "buddies_settings (user_id, buddy_id, var, type, value) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE value=?"); + m_updateBuddySetting = new Statement(&m_conn, "iisiss", "INSERT INTO " + m_prefix + "buddies_settings (user_id, buddy_id, var, type, value) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE value=?"); PREP_STMT(m_getUserSetting, "SELECT type, value FROM " + m_prefix + "users_settings WHERE user_id=? AND var=?"); PREP_STMT(m_setUserSetting, "INSERT INTO " + m_prefix + "users_settings (user_id, var, type, value) VALUES (?,?,?,?)"); @@ -386,11 +386,13 @@ void MySQLBackend::setUser(const UserInfo &user) { } bool MySQLBackend::getUser(const std::string &barejid, UserInfo &user) { + user.id = -1; *m_getUser << barejid; if (!m_getUser->execute()) return false; - m_getUser->fetch(); + if (m_getUser->fetch() == MYSQL_NO_DATA) + return false; *m_getUser >> user.id >> user.jid >> user.uin >> user.password >> user.encoding >> user.language >> user.vip; std::cout << user.id << " " << user.jid << " " << user.uin << " " << user.password << " " << user.encoding << " " << user.language << " " << user.vip << "\n"; @@ -402,7 +404,20 @@ void MySQLBackend::setUserOnline(long id, bool online) { } long MySQLBackend::addBuddy(long userId, const BuddyInfo &buddyInfo) { - return 1; +// "INSERT INTO " + m_prefix + "buddies (user_id, uin, subscription, groups, nickname, flags) VALUES (?, ?, ?, ?, ?, ?)" + *m_addBuddy << userId << buddyInfo.legacyName << buddyInfo.subscription; + *m_addBuddy << (buddyInfo.groups.size() == 0 ? "" : buddyInfo.groups[0]); + *m_addBuddy << buddyInfo.alias << buddyInfo.flags; + + m_addBuddy->execute(); + + long id = (long) mysql_insert_id(&m_conn); + +// INSERT OR REPLACE INTO " + m_prefix + "buddies_settings (user_id, buddy_id, var, type, value) VALUES (?, ?, ?, ?, ?) + *m_updateBuddySetting << userId << id << buddyInfo.settings.find("icon_hash")->first << (int) TYPE_STRING << buddyInfo.settings.find("icon_hash")->second.s; + m_updateBuddySetting->execute(); + + return id; } void MySQLBackend::updateBuddy(long userId, const BuddyInfo &buddyInfo) { @@ -414,6 +429,22 @@ bool MySQLBackend::getBuddies(long id, std::list &roster) { } bool MySQLBackend::removeUser(long id) { + + *m_removeUser << (int) id; + if (!m_removeUser->execute()) + return false; + + *m_removeUserSettings << (int) id; + if (!m_removeUserSettings->execute()) + return false; + + *m_removeUserBuddies << (int) id; + if (!m_removeUserBuddies->execute()) + return false; + + *m_removeUserBuddiesSettings << (int) id; + if (!m_removeUserBuddiesSettings->execute()) + return false; return true; } @@ -427,11 +458,11 @@ void MySQLBackend::updateUserSetting(long id, const std::string &variable, const } void MySQLBackend::beginTransaction() { -// exec("BEGIN TRANSACTION;"); + exec("START TRANSACTION;"); } void MySQLBackend::commitTransaction() { -// exec("COMMIT TRANSACTION;"); + exec("COMMIT;"); } }