diff --git a/include/transport/sqlite3backend.h b/include/transport/sqlite3backend.h index c0426fc0..8ad432f6 100644 --- a/include/transport/sqlite3backend.h +++ b/include/transport/sqlite3backend.h @@ -84,6 +84,8 @@ class SQLite3Backend : public StorageBackend void updateBuddy(long userId, const BuddyInfo &buddyInfo); void removeBuddy(long id) {} + void getUserSetting(long userId, const std::string &variable, int &type, std::string &value); + void beginTransaction(); void commitTransaction(); @@ -97,6 +99,8 @@ class SQLite3Backend : public StorageBackend // statements sqlite3_stmt *m_setUser; sqlite3_stmt *m_getUser; + sqlite3_stmt *m_getUserSetting; + sqlite3_stmt *m_setUserSetting; sqlite3_stmt *m_removeUser; sqlite3_stmt *m_removeUserBuddies; sqlite3_stmt *m_removeUserSettings; diff --git a/include/transport/storagebackend.h b/include/transport/storagebackend.h index d3736e52..1b4051a6 100644 --- a/include/transport/storagebackend.h +++ b/include/transport/storagebackend.h @@ -108,6 +108,8 @@ class StorageBackend virtual void updateBuddy(long userId, const BuddyInfo &buddyInfo) = 0; virtual void removeBuddy(long id) = 0; + virtual void getUserSetting(long userId, const std::string &variable, int &type, std::string &value) = 0; + virtual void beginTransaction() = 0; virtual void commitTransaction() = 0; diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index 3a9f8496..5971e68b 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -29,6 +29,7 @@ namespace Transport { class User; class Component; class StorageBackend; +class StorageResponder; /// Manages online XMPP Users. @@ -80,6 +81,7 @@ class UserManager { std::map m_users; Component *m_component; StorageBackend *m_storageBackend; + StorageResponder *m_storageResponder; }; } diff --git a/src/sqlite3backend.cpp b/src/sqlite3backend.cpp index 043fcef4..9a2c4b03 100644 --- a/src/sqlite3backend.cpp +++ b/src/sqlite3backend.cpp @@ -85,6 +85,8 @@ SQLite3Backend::~SQLite3Backend(){ FINALIZE_STMT(m_updateBuddy); FINALIZE_STMT(m_getBuddies); FINALIZE_STMT(m_getBuddiesSettings); + FINALIZE_STMT(m_getUserSetting); + FINALIZE_STMT(m_setUserSetting); sqlite3_close(m_db); } } @@ -110,6 +112,8 @@ bool SQLite3Backend::connect() { 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_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 (?,?,?,?)"); return true; } @@ -157,7 +161,7 @@ bool SQLite3Backend::createDatabase() { " user_id int(10) NOT NULL," " var varchar(50) NOT NULL," " type int(4) NOT NULL," - " value varchar(255) NOT NULL," + " value varchar(4095) NOT NULL," " PRIMARY KEY (user_id, var)" ");"); @@ -355,6 +359,24 @@ bool SQLite3Backend::removeUser(long id) { return true; } +void SQLite3Backend::getUserSetting(long id, const std::string &variable, int &type, std::string &value) { + BEGIN(m_getUserSetting); + BIND_INT(m_getUserSetting, id); + BIND_STR(m_getUserSetting, variable); + if(sqlite3_step(m_setUser) != SQLITE_ROW) { + BEGIN(m_setUserSetting); + BIND_INT(m_setUserSetting, id); + BIND_STR(m_setUserSetting, variable); + BIND_INT(m_setUserSetting, type); + BIND_STR(m_setUserSetting, value); + EXECUTE_STATEMENT(m_setUserSetting, "m_setUserSetting"); + } + else { + type = GET_INT(m_getUserSetting); + value = GET_STR(m_getUserSetting); + } +} + void SQLite3Backend::beginTransaction() { exec("BEGIN TRANSACTION;"); } diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 63cfb23a..cfafb8f0 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -24,6 +24,7 @@ #include "transport/storagebackend.h" #include "transport/conversationmanager.h" #include "transport/rostermanager.h" +#include "storageresponder.h" namespace Transport { @@ -33,6 +34,9 @@ UserManager::UserManager(Component *component, StorageBackend *storageBackend) { m_component = component; m_storageBackend = storageBackend; + m_storageResponder = new StorageResponder(component->getIQRouter(), m_storageBackend, this); + m_storageResponder->start(); + component->onUserPresenceReceived.connect(bind(&UserManager::handlePresence, this, _1)); m_component->getStanzaChannel()->onMessageReceived.connect(bind(&UserManager::handleMessageReceived, this, _1)); m_component->getStanzaChannel()->onPresenceReceived.connect(bind(&UserManager::handleGeneralPresenceReceived, this, _1)); @@ -40,6 +44,8 @@ UserManager::UserManager(Component *component, StorageBackend *storageBackend) { } UserManager::~UserManager(){ + m_storageResponder->stop(); + delete m_storageResponder; } void UserManager::addUser(User *user) {