initial support for private storage

This commit is contained in:
HanzZ 2011-05-19 17:53:31 +02:00
parent a1eba9bedb
commit c0a01941fc
5 changed files with 37 additions and 1 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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<std::string, User *> m_users;
Component *m_component;
StorageBackend *m_storageBackend;
StorageResponder *m_storageResponder;
};
}

View file

@ -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;");
}

View file

@ -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) {