From: Marcus Eggenberger Date: Sat, 2 Feb 2008 17:26:50 +0000 (+0000) Subject: Backlogdata is now made persistent every 10 minutes. X-Git-Tag: 0.2.0-alpha1~142 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=59579d82e3a16a815a197a4300c8ef279275ccfc Backlogdata is now made persistent every 10 minutes. Found a bug while implementing: backlog data isn't replayed right now. Gonna Fix that right now. Please DO NOT use this revision or r437. Stay tuned. --- diff --git a/src/core/abstractsqlstorage.cpp b/src/core/abstractsqlstorage.cpp index bc18cafb..825dda8d 100644 --- a/src/core/abstractsqlstorage.cpp +++ b/src/core/abstractsqlstorage.cpp @@ -102,6 +102,16 @@ bool AbstractSqlStorage::init(const QVariantMap &settings) { return true; } +void AbstractSqlStorage::sync() { + QHash, QSqlQuery *>::iterator iter = _queryCache.begin(); + while(iter != _queryCache.end()) { + delete *iter; + iter = _queryCache.erase(iter); + } + + logDb().commit(); +} + QString AbstractSqlStorage::queryString(const QString &queryName, int version) { if(version == 0) version = schemaVersion(); diff --git a/src/core/abstractsqlstorage.h b/src/core/abstractsqlstorage.h index 70026999..6fefb787 100644 --- a/src/core/abstractsqlstorage.h +++ b/src/core/abstractsqlstorage.h @@ -40,6 +40,7 @@ public: protected: bool init(const QVariantMap &settings = QVariantMap()); + virtual void sync(); QSqlDatabase logDb(); diff --git a/src/core/core.cpp b/src/core/core.cpp index 2024387e..4826c3ec 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -49,6 +49,10 @@ Core::Core() : storage(0) { startTime = QDateTime::currentDateTime(); // for uptime :) + + connect(&_storageSyncTimer, SIGNAL(timeout()), + this, SLOT(syncStorage())); + _storageSyncTimer.start(10 * 60 * 1000); // in msecs } void Core::init() { @@ -95,6 +99,11 @@ Core::~Core() { qDeleteAll(sessions); } +void Core::syncStorage() { + QMutexLocker locker(&mutex); + return instance()->storage->sync(); +} + void Core::restoreState() { if(instance()->sessions.count()) { qWarning() << qPrintable(tr("Calling restoreState() even though active sessions exist!")); diff --git a/src/core/core.h b/src/core/core.h index 51237ec7..091c0f71 100644 --- a/src/core/core.h +++ b/src/core/core.h @@ -25,6 +25,7 @@ #include #include #include +#include #include #include @@ -130,6 +131,12 @@ class Core : public QObject { */ static QList requestBuffers(UserId user, QDateTime since = QDateTime()); + public slots: + //! Make storage data persistent + /** \note This method is threadsafe. + */ + void syncStorage(); + signals: //! Sent when a BufferInfo is updated in storage. void bufferInfoUpdated(UserId user, const BufferInfo &info); @@ -158,6 +165,7 @@ class Core : public QObject { UserId guiUser; QHash sessions; Storage *storage; + QTimer _storageSyncTimer; QTcpServer server; // TODO: implement SSL QHash blocksizes; diff --git a/src/core/storage.h b/src/core/storage.h index 30c1c0bd..6470b405 100644 --- a/src/core/storage.h +++ b/src/core/storage.h @@ -60,7 +60,14 @@ class Storage : public QObject { * \return True if and only if the storage provider was initialized successfully. */ virtual bool init(const QVariantMap &settings = QVariantMap()) = 0; - + + //! Makes temp data persistent + /** This Method is periodically called by the Quassel Core to make temporary + * data persistant. This reduces the data loss drastically in the + * unlikely case of a Core crash. + */ + virtual void sync() = 0; + // TODO: Add functions for configuring the backlog handling, i.e. defining auto-cleanup settings etc /* User handling */ diff --git a/version.inc b/version.inc index 51bdc10a..17086882 100644 --- a/version.inc +++ b/version.inc @@ -5,7 +5,7 @@ quasselVersion = "0.2.0-pre"; quasselDate = "2008-02-02"; - quasselBuild = 437; + quasselBuild = 438; //! Minimum client build number the core needs clientBuildNeeded = 435;