From 5e5714fb2abf8feaf9cc4a27a26e86f2f9c45b30 Mon Sep 17 00:00:00 2001 From: Marcus Eggenberger Date: Sun, 1 Mar 2009 12:49:43 +0100 Subject: [PATCH] updating sequences after mirgration --- .../14/setup_110_alter_sender_seq.sql | 1 + .../14/setup_120_alter_messageid_seq.sql | 1 + src/core/abstractsqlstorage.cpp | 4 +- src/core/abstractsqlstorage.h | 12 +++++- src/core/core.cpp | 22 +++++++++++ src/core/postgresqlstorage.cpp | 28 ++++++++++++++ src/core/postgresqlstorage.h | 38 +++++++++++-------- src/core/sqlitestorage.h | 16 +++----- 8 files changed, 93 insertions(+), 29 deletions(-) create mode 100644 src/core/SQL/PostgreSQL/14/setup_110_alter_sender_seq.sql create mode 100644 src/core/SQL/PostgreSQL/14/setup_120_alter_messageid_seq.sql diff --git a/src/core/SQL/PostgreSQL/14/setup_110_alter_sender_seq.sql b/src/core/SQL/PostgreSQL/14/setup_110_alter_sender_seq.sql new file mode 100644 index 00000000..1b846652 --- /dev/null +++ b/src/core/SQL/PostgreSQL/14/setup_110_alter_sender_seq.sql @@ -0,0 +1 @@ +ALTER SEQUENCE sender_senderid_seq CACHE 1000 diff --git a/src/core/SQL/PostgreSQL/14/setup_120_alter_messageid_seq.sql b/src/core/SQL/PostgreSQL/14/setup_120_alter_messageid_seq.sql new file mode 100644 index 00000000..d38574e4 --- /dev/null +++ b/src/core/SQL/PostgreSQL/14/setup_120_alter_messageid_seq.sql @@ -0,0 +1 @@ +ALTER SEQUENCE backlog_messageid_seq CACHE 1000 diff --git a/src/core/abstractsqlstorage.cpp b/src/core/abstractsqlstorage.cpp index 3d339ec2..618c929b 100644 --- a/src/core/abstractsqlstorage.cpp +++ b/src/core/abstractsqlstorage.cpp @@ -398,6 +398,8 @@ bool AbstractSqlMigrationReader::migrateTo(AbstractSqlMigrationWriter *writer) { if(!transferMo(UserSetting, userSettingMo)) return false; + if(!_writer->postProcess()) + abortMigration(); return finalizeMigration(); } @@ -449,7 +451,7 @@ bool AbstractSqlMigrationReader::transferMo(MigrationObject moType, T &mo) { return false; } - qDebug() << qPrintable(QString("Transfering %1...").arg(AbstractSqlMigrator::migrationObject(moType))); + qDebug() << qPrintable(QString("Transferring %1...").arg(AbstractSqlMigrator::migrationObject(moType))); int i = 0; QFile file; file.open(stdout, QIODevice::WriteOnly); diff --git a/src/core/abstractsqlstorage.h b/src/core/abstractsqlstorage.h index e14abd92..28942913 100644 --- a/src/core/abstractsqlstorage.h +++ b/src/core/abstractsqlstorage.h @@ -27,6 +27,9 @@ #include #include +class AbstractSqlMigrationReader; +class AbstractSqlMigrationWriter; + class AbstractSqlStorage : public Storage { Q_OBJECT @@ -34,7 +37,12 @@ public: AbstractSqlStorage(QObject *parent = 0); virtual ~AbstractSqlStorage(); + virtual inline AbstractSqlMigrationReader *createMigrationReader() { return 0; } + virtual inline AbstractSqlMigrationWriter *createMigrationWriter() { return 0; } + +public slots: virtual State init(const QVariantMap &settings = QVariantMap()); + virtual bool setup(const QVariantMap &settings = QVariantMap()); protected: inline virtual void sync() {}; @@ -45,7 +53,6 @@ protected: inline QString queryString(const QString &queryName) { return queryString(queryName, 0); } QStringList setupQueries(); - bool setup(const QVariantMap &settings = QVariantMap()); QStringList upgradeQueries(int ver); bool upgradeDb(); @@ -257,7 +264,6 @@ private: QSqlQuery *_query; }; -class AbstractSqlMigrationWriter; class AbstractSqlMigrationReader : public AbstractSqlMigrator { public: AbstractSqlMigrationReader(); @@ -297,6 +303,8 @@ public: inline bool migrateFrom(AbstractSqlMigrationReader *reader) { return reader->migrateTo(this); } + // called after migration process + virtual inline bool postProcess() { return true; } friend class AbstractSqlMigrationReader; }; diff --git a/src/core/core.cpp b/src/core/core.cpp index c7827934..5dd97210 100644 --- a/src/core/core.cpp +++ b/src/core/core.cpp @@ -140,6 +140,28 @@ Core::Core() } void Core::init() { + CoreSettings cs2; + QVariantMap connectionProperties = cs2.storageSettings().toMap()["ConnectionProperties"].toMap(); + qDebug() << connectionProperties; + SqliteMigrationReader *reader = new SqliteMigrationReader(); + qDebug() << "reader:" << reader->init(); + PostgreSqlMigrationWriter *writer = new PostgreSqlMigrationWriter(); + qDebug() << "writer:" << writer->init(connectionProperties); + qDebug() << qPrintable(QString("Migrating Storage backend %1 to %2...").arg(reader->displayName(), writer->displayName())); + if(reader->migrateTo(writer)) + qDebug() << "Migration finished!"; + return; + + + + + + + + + + + CoreSettings cs; _configured = initStorage(cs.storageSettings().toMap()); diff --git a/src/core/postgresqlstorage.cpp b/src/core/postgresqlstorage.cpp index c37bab43..96a60d3c 100644 --- a/src/core/postgresqlstorage.cpp +++ b/src/core/postgresqlstorage.cpp @@ -59,6 +59,14 @@ QVariantMap PostgreSqlStorage::setupKeys() const { return map; } +bool PostgreSqlStorage::setup(const QVariantMap &settings) { + bool success = AbstractSqlStorage::setup(settings); + if(success) { + logDb().exec(QString("ALTER USER %1 SET standard_conforming_strings TO on").arg(userName())); + } + return success; +} + void PostgreSqlStorage::setConnectionProperties(const QVariantMap &properties) { _userName = properties["Username"].toString(); _password = properties["Password"].toString(); @@ -1613,3 +1621,23 @@ bool PostgreSqlMigrationWriter::writeMo(const UserSettingMO &userSetting) { bindValue(2, userSetting.settingvalue); return exec(); } + +bool PostgreSqlMigrationWriter::postProcess() { + QSqlDatabase db = logDb(); + QList sequences; + sequences << Sequence("backlog", "messageid") + << Sequence("identity", "identityid") + << Sequence("identity_nick", "nickid") + << Sequence("ircserver", "serverid") + << Sequence("network", "networkid") + << Sequence("quasseluser", "userid") + << Sequence("sender", "senderid"); + QList::const_iterator iter; + for(iter = sequences.constBegin(); iter != sequences.constEnd(); iter++) { + resetQuery(); + newQuery(QString("SELECT setval('%1_%2_seq', max(%2)) FROM %1").arg(iter->table, iter->field), db); + if(!exec()) + return false; + } + return true; +} diff --git a/src/core/postgresqlstorage.h b/src/core/postgresqlstorage.h index f78422a0..16fc1c81 100644 --- a/src/core/postgresqlstorage.h +++ b/src/core/postgresqlstorage.h @@ -33,13 +33,15 @@ public: PostgreSqlStorage(QObject *parent = 0); virtual ~PostgreSqlStorage(); + virtual AbstractSqlMigrationWriter *createMigrationWriter(); + public slots: /* General */ - - bool isAvailable() const; - QString displayName() const; - QString description() const; - QVariantMap setupKeys() const; + virtual bool isAvailable() const; + virtual QString displayName() const; + virtual QString description() const; + virtual QVariantMap setupKeys() const; + virtual bool setup(const QVariantMap &settings = QVariantMap()); // TODO: Add functions for configuring the backlog handling, i.e. defining auto-cleanup settings etc @@ -147,16 +149,6 @@ class PostgreSqlMigrationWriter : public PostgreSqlStorage, public AbstractSqlMi public: PostgreSqlMigrationWriter(); - -// virtual bool writeUser(const QuasselUserMO &user); -// virtual bool writeSender(const SenderMO &sender); -// virtual bool writeIdentity(const IdentityMO &identity); -// virtual bool writeIdentityNick(const IdentityNickMO &identityNick); -// virtual bool writeNetwork(const NetworkMO &network); -// virtual bool writeBuffer(const BufferMO &buffer); -// virtual bool writeBacklog(const BacklogMO &backlog); -// virtual bool writeIrcServer(const IrcServerMO &ircserver); -// virtual bool writeUserSetting(const UserSettingMO &userSetting); virtual bool writeMo(const QuasselUserMO &user); virtual bool writeMo(const SenderMO &sender); @@ -170,10 +162,26 @@ public: 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) {} + }; }; +inline AbstractSqlMigrationWriter *PostgreSqlStorage::createMigrationWriter() { + return new PostgreSqlMigrationWriter(); +} + + + #endif diff --git a/src/core/sqlitestorage.h b/src/core/sqlitestorage.h index 3f213067..1185f9dc 100644 --- a/src/core/sqlitestorage.h +++ b/src/core/sqlitestorage.h @@ -34,6 +34,8 @@ public: SqliteStorage(QObject *parent = 0); virtual ~SqliteStorage(); + virtual AbstractSqlMigrationReader *createMigrationReader(); + public slots: /* General */ @@ -125,16 +127,6 @@ class SqliteMigrationReader : public SqliteStorage, public AbstractSqlMigrationR public: SqliteMigrationReader(); -// virtual bool readUser(QuasselUserMO &user); -// virtual bool readSender(SenderMO &sender); -// virtual bool readIdentity(IdentityMO &identity); -// virtual bool readIdentityNick(IdentityNickMO &identityNick); -// virtual bool readNetwork(NetworkMO &network); -// virtual bool readBuffer(BufferMO &buffer); -// virtual bool readBacklog(BacklogMO &backlog); -// virtual bool readIrcServer(IrcServerMO &ircserver); -// virtual bool readUserSetting(UserSettingMO &userSetting); - virtual bool readMo(QuasselUserMO &user); virtual bool readMo(SenderMO &sender); virtual bool readMo(IdentityMO &identity); @@ -153,6 +145,8 @@ protected: virtual inline bool commit() { return logDb().commit(); } }; - +inline AbstractSqlMigrationReader *SqliteStorage::createMigrationReader() { + return new SqliteMigrationReader(); +} #endif -- 2.20.1