From bb1a8e4c36e2254ede53b230c0f422900dddd26a Mon Sep 17 00:00:00 2001 From: HanzZ Date: Mon, 13 Jun 2011 23:31:06 +0200 Subject: [PATCH] Spectrum can work without database now :) --- include/transport/usermanager.h | 2 +- spectrum/src/main.cpp | 20 +++++++++++++------- spectrum/src/sample.cfg | 1 + src/config.cpp | 1 + src/rostermanager.cpp | 2 +- src/usermanager.cpp | 32 ++++++++++++++++++++++---------- 6 files changed, 39 insertions(+), 19 deletions(-) diff --git a/include/transport/usermanager.h b/include/transport/usermanager.h index 153be1bf..e327240b 100644 --- a/include/transport/usermanager.h +++ b/include/transport/usermanager.h @@ -41,7 +41,7 @@ class UserManager { /// Creates new UserManager. /// \param component Component which's presence will be handled /// \param storageBackend Storage backend used to fetch UserInfos - UserManager(Component *component, StorageBackend *storageBackend); + UserManager(Component *component, StorageBackend *storageBackend = NULL); /// Destroys UserManager. ~UserManager(); diff --git a/spectrum/src/main.cpp b/spectrum/src/main.cpp index 33201230..ef22af03 100644 --- a/spectrum/src/main.cpp +++ b/spectrum/src/main.cpp @@ -55,15 +55,21 @@ int main(int argc, char **argv) Component transport(&eventLoop, &config, NULL); Logger logger(&transport); - SQLite3Backend sql(&config); - logger.setStorageBackend(&sql); - if (!sql.connect()) { - std::cerr << "Can't connect to database.\n"; + StorageBackend *storageBackend = NULL; + + if (CONFIG_STRING(&config, "database.type") == "sqlite3") { + storageBackend = new SQLite3Backend(&config); + logger.setStorageBackend(storageBackend); + if (!storageBackend->connect()) { + std::cerr << "Can't connect to database.\n"; + } } - UserManager userManager(&transport, &sql); - UserRegistration userRegistration(&transport, &userManager, &sql); - logger.setUserRegistration(&userRegistration); + UserManager userManager(&transport, storageBackend); + if (storageBackend) { + UserRegistration userRegistration(&transport, &userManager, storageBackend); + logger.setUserRegistration(&userRegistration); + } logger.setUserManager(&userManager); NetworkPluginServer plugin(&transport, &config, &userManager); diff --git a/spectrum/src/sample.cfg b/spectrum/src/sample.cfg index 4f85c132..84067742 100644 --- a/spectrum/src/sample.cfg +++ b/spectrum/src/sample.cfg @@ -14,5 +14,6 @@ protocol=prpl-jabber #protocol=prpl-icq [database] +type = sqlite3 # or "none" without database backend database = test.sql prefix=icq diff --git a/src/config.cpp b/src/config.cpp index 24f57dfe..22931b1a 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -48,6 +48,7 @@ bool Config::load(const std::string &configfile, boost::program_options::options ("registration.username_field", value()->default_value(""), "Label for username field") ("registration.username_mask", value()->default_value(""), "Username mask") ("registration.encoding", value()->default_value("en"), "Default encoding in registration form") + ("database.type", value()->default_value("none"), "Database type.") ("database.database", value()->default_value(""), "Database used to store data") ("database.prefix", value()->default_value(""), "Prefix of tables in database") ; diff --git a/src/rostermanager.cpp b/src/rostermanager.cpp index 8177ca35..b2f34b28 100644 --- a/src/rostermanager.cpp +++ b/src/rostermanager.cpp @@ -161,7 +161,7 @@ void RosterManager::handleSubscription(Swift::Presence::ref presence) { } void RosterManager::setStorageBackend(StorageBackend *storageBackend) { - if (m_rosterStorage) { + if (m_rosterStorage || !storageBackend) { return; } m_rosterStorage = new RosterStorage(m_user, storageBackend); diff --git a/src/usermanager.cpp b/src/usermanager.cpp index 57463705..7e138d45 100644 --- a/src/usermanager.cpp +++ b/src/usermanager.cpp @@ -33,9 +33,12 @@ UserManager::UserManager(Component *component, StorageBackend *storageBackend) { m_onlineBuddies = 0; m_component = component; m_storageBackend = storageBackend; + m_storageResponder = NULL; - m_storageResponder = new StorageResponder(component->getIQRouter(), m_storageBackend, this); - m_storageResponder->start(); + if (m_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)); @@ -44,8 +47,10 @@ UserManager::UserManager(Component *component, StorageBackend *storageBackend) { } UserManager::~UserManager(){ - m_storageResponder->stop(); - delete m_storageResponder; + if (m_storageResponder) { + m_storageResponder->stop(); + delete m_storageResponder; + } } void UserManager::addUser(User *user) { @@ -93,15 +98,17 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { m_component->getStanzaChannel()->sendPresence(response); UserInfo res; - bool registered = m_storageBackend->getUser(userkey, res); - if (registered) { - m_storageBackend->setUserOnline(res.id, false); + if (m_storageBackend) { + bool registered = m_storageBackend->getUser(userkey, res); + if (registered) { + m_storageBackend->setUserOnline(res.id, false); + } } return; } UserInfo res; - bool registered = m_storageBackend->getUser(userkey, res); + bool registered = m_storageBackend ? m_storageBackend->getUser(userkey, res) : false; if (m_component->inServerMode()) { if (!registered) { @@ -111,8 +118,13 @@ void UserManager::handlePresence(Swift::Presence::ref presence) { if (res.uin.find_last_of("%") != std::string::npos) { res.uin.replace(res.uin.find_last_of("%"), 1, "@"); } - m_storageBackend->setUser(res); - registered = m_storageBackend->getUser(userkey, res); + if (m_storageBackend) { + m_storageBackend->setUser(res); + registered = m_storageBackend->getUser(userkey, res); + } + else { + registered = true; + } } res.password = m_component->getUserRegistryPassword(userkey); }