X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcore%2Fpostgresqlstorage.h;h=4d18d1141ae8dc73ce60a3557a19add89961b4eb;hp=d83b4cc56645889632e3a6e6f756f8cee4f41710;hb=62b7bed21f011037a34d7a4ea797d79fbdeff687;hpb=029c6d402af7b00b320dd5ce48f230783a88957a diff --git a/src/core/postgresqlstorage.h b/src/core/postgresqlstorage.h index d83b4cc5..4d18d114 100644 --- a/src/core/postgresqlstorage.h +++ b/src/core/postgresqlstorage.h @@ -33,22 +33,25 @@ public: PostgreSqlStorage(QObject *parent = 0); virtual ~PostgreSqlStorage(); + virtual AbstractSqlMigrationWriter *createMigrationWriter(); + public slots: /* General */ + virtual bool isAvailable() const; + virtual QString displayName() const; + virtual QString description() const; + virtual QStringList setupKeys() const; + virtual QVariantMap setupDefaults() const; - bool isAvailable() const; - QString displayName() const; - QString description() const; - QVariantMap setupKeys() const; - // TODO: Add functions for configuring the backlog handling, i.e. defining auto-cleanup settings etc /* User handling */ virtual UserId addUser(const QString &user, const QString &password); - virtual void updateUser(UserId user, const QString &password); + virtual bool updateUser(UserId user, const QString &password); virtual void renameUser(UserId user, const QString &newName); virtual UserId validateUser(const QString &user, const QString &password); + virtual UserId getUserId(const QString &username); virtual UserId internalUser(); virtual void delUser(UserId user); virtual void setUserSetting(UserId userId, const QString &settingName, const QVariant &data); @@ -78,7 +81,7 @@ public slots: virtual void setAwayMessage(UserId user, NetworkId networkId, const QString &awayMsg); virtual QString userModes(UserId user, NetworkId networkId); virtual void setUserModes(UserId user, NetworkId networkId, const QString &userModes); - + /* Buffer handling */ virtual BufferInfo bufferInfo(UserId user, const NetworkId &networkId, BufferInfo::Type type, const QString &buffer = "", bool create = true); virtual BufferInfo getBufferInfo(UserId user, const BufferId &bufferId); @@ -91,12 +94,13 @@ public slots: virtual QHash bufferLastSeenMsgIds(UserId user); /* Message handling */ - - virtual MsgId logMessage(Message msg); + virtual bool logMessage(Message &msg); + virtual bool logMessages(MessageList &msgs); virtual QList requestMsgs(UserId user, BufferId bufferId, MsgId first = -1, MsgId last = -1, int limit = -1); virtual QList requestAllMsgs(UserId user, MsgId first = -1, MsgId last = -1, int limit = -1); protected: + virtual void initDbSession(QSqlDatabase &db); virtual void setConnectionProperties(const QVariantMap &properties); inline virtual QString driverName() { return "QPSQL"; } inline virtual QString hostName() { return _hostName; } @@ -108,12 +112,19 @@ protected: virtual bool updateSchemaVersion(int newVersion); virtual bool setupSchemaVersion(int version); void safeExec(QSqlQuery &query); + bool beginReadOnlyTransaction(QSqlDatabase &db); -private: - bool isValidNetwork(UserId user, const NetworkId &networkId); - bool isValidBuffer(const UserId &user, const BufferId &bufferId); + bool prepareQuery(const QString &handle, const QString &query, const QSqlDatabase &db); + QSqlQuery executePreparedQuery(const QString &handle, const QVariantList ¶ms, const QSqlDatabase &db); + QSqlQuery executePreparedQuery(const QString &handle, const QVariant ¶m, const QSqlDatabase &db); + void deallocateQuery(const QString &handle, const QSqlDatabase &db); + + inline void savePoint(const QString &handle, const QSqlDatabase &db) { db.exec(QString("SAVEPOINT %1").arg(handle)); } + inline void rollbackSavePoint(const QString &handle, const QSqlDatabase &db) { db.exec(QString("ROLLBACK TO SAVEPOINT %1").arg(handle)); } + inline void releaseSavePoint(const QString &handle, const QSqlDatabase &db) { db.exec(QString("RELEASE SAVEPOINT %1").arg(handle)); } +private: void bindNetworkInfo(QSqlQuery &query, const NetworkInfo &info); void bindServerInfo(QSqlQuery &query, const Network::Server &server); @@ -122,10 +133,53 @@ private: QString _databaseName; QString _userName; QString _password; - - static int _maxRetryCount; + + typedef QHash QueryHash; + QHash _preparedQueries; // one query hash per db connection + QMutex _queryHashMutex; + }; inline void PostgreSqlStorage::safeExec(QSqlQuery &query) { query.exec(); } + +// ======================================== +// PostgreSqlMigration +// ======================================== +class PostgreSqlMigrationWriter : public PostgreSqlStorage, public AbstractSqlMigrationWriter { + Q_OBJECT + +public: + PostgreSqlMigrationWriter(); + + virtual bool writeMo(const QuasselUserMO &user); + virtual bool writeMo(const SenderMO &sender); + virtual bool writeMo(const IdentityMO &identity); + virtual bool writeMo(const IdentityNickMO &identityNick); + virtual bool writeMo(const NetworkMO &network); + virtual bool writeMo(const BufferMO &buffer); + virtual bool writeMo(const BacklogMO &backlog); + virtual bool writeMo(const IrcServerMO &ircserver); + virtual bool writeMo(const UserSettingMO &userSetting); + + bool prepareQuery(MigrationObject mo); + + virtual bool postProcess(); + +protected: + virtual inline bool transaction() { return logDb().transaction(); } + virtual inline void rollback() { logDb().rollback(); } + virtual inline bool commit() { return logDb().commit(); } + +private: + // helper struct + struct Sequence { + QLatin1String table; + QLatin1String field; + Sequence(const char *table, const char *field) : table(table), field(field) {} + }; + + QSet _validIdentities; +}; + #endif