updating sequences after mirgration
authorMarcus Eggenberger <egs@quassel-irc.org>
Sun, 1 Mar 2009 11:49:43 +0000 (12:49 +0100)
committerMarcus Eggenberger <egs@quassel-irc.org>
Tue, 3 Mar 2009 19:57:05 +0000 (20:57 +0100)
src/core/SQL/PostgreSQL/14/setup_110_alter_sender_seq.sql [new file with mode: 0644]
src/core/SQL/PostgreSQL/14/setup_120_alter_messageid_seq.sql [new file with mode: 0644]
src/core/abstractsqlstorage.cpp
src/core/abstractsqlstorage.h
src/core/core.cpp
src/core/postgresqlstorage.cpp
src/core/postgresqlstorage.h
src/core/sqlitestorage.h

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 (file)
index 0000000..1b84665
--- /dev/null
@@ -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 (file)
index 0000000..d38574e
--- /dev/null
@@ -0,0 +1 @@
+ALTER SEQUENCE backlog_messageid_seq CACHE 1000
index 3d339ec..618c929 100644 (file)
@@ -398,6 +398,8 @@ bool AbstractSqlMigrationReader::migrateTo(AbstractSqlMigrationWriter *writer) {
   if(!transferMo(UserSetting, userSettingMo))
     return false;
 
   if(!transferMo(UserSetting, userSettingMo))
     return false;
 
+  if(!_writer->postProcess())
+    abortMigration();
   return finalizeMigration();
 }
 
   return finalizeMigration();
 }
 
@@ -449,7 +451,7 @@ bool AbstractSqlMigrationReader::transferMo(MigrationObject moType, T &mo) {
     return false;
   }
 
     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);
   int i = 0;
   QFile file;
   file.open(stdout, QIODevice::WriteOnly);
index e14abd9..2894291 100644 (file)
@@ -27,6 +27,9 @@
 #include <QSqlQuery>
 #include <QSqlError>
 
 #include <QSqlQuery>
 #include <QSqlError>
 
+class AbstractSqlMigrationReader;
+class AbstractSqlMigrationWriter;
+
 class AbstractSqlStorage : public Storage {
   Q_OBJECT
 
 class AbstractSqlStorage : public Storage {
   Q_OBJECT
 
@@ -34,7 +37,12 @@ public:
   AbstractSqlStorage(QObject *parent = 0);
   virtual ~AbstractSqlStorage();
 
   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 State init(const QVariantMap &settings = QVariantMap());
+  virtual bool setup(const QVariantMap &settings = QVariantMap());
 
 protected:
   inline virtual void sync() {};
 
 protected:
   inline virtual void sync() {};
@@ -45,7 +53,6 @@ protected:
   inline QString queryString(const QString &queryName) { return queryString(queryName, 0); }
 
   QStringList setupQueries();
   inline QString queryString(const QString &queryName) { return queryString(queryName, 0); }
 
   QStringList setupQueries();
-  bool setup(const QVariantMap &settings = QVariantMap());
 
   QStringList upgradeQueries(int ver);
   bool upgradeDb();
 
   QStringList upgradeQueries(int ver);
   bool upgradeDb();
@@ -257,7 +264,6 @@ private:
   QSqlQuery *_query;
 };
 
   QSqlQuery *_query;
 };
 
-class AbstractSqlMigrationWriter;
 class AbstractSqlMigrationReader : public AbstractSqlMigrator {
 public:
   AbstractSqlMigrationReader();
 class AbstractSqlMigrationReader : public AbstractSqlMigrator {
 public:
   AbstractSqlMigrationReader();
@@ -297,6 +303,8 @@ public:
 
   inline bool migrateFrom(AbstractSqlMigrationReader *reader) { return reader->migrateTo(this); }
 
 
   inline bool migrateFrom(AbstractSqlMigrationReader *reader) { return reader->migrateTo(this); }
 
+  // called after migration process
+  virtual inline bool postProcess() { return true; }
   friend class AbstractSqlMigrationReader;
 };
 
   friend class AbstractSqlMigrationReader;
 };
 
index c782793..5dd9721 100644 (file)
@@ -140,6 +140,28 @@ Core::Core()
 }
 
 void Core::init() {
 }
 
 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());
 
   CoreSettings cs;
   _configured = initStorage(cs.storageSettings().toMap());
 
index c37bab4..96a60d3 100644 (file)
@@ -59,6 +59,14 @@ QVariantMap PostgreSqlStorage::setupKeys() const {
   return map;
 }
 
   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();
 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();
 }
   bindValue(2, userSetting.settingvalue);
   return exec();
 }
+
+bool PostgreSqlMigrationWriter::postProcess() {
+  QSqlDatabase db = logDb();
+  QList<Sequence> 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<Sequence>::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;
+}
index f78422a..16fc1c8 100644 (file)
@@ -33,13 +33,15 @@ public:
   PostgreSqlStorage(QObject *parent = 0);
   virtual ~PostgreSqlStorage();
 
   PostgreSqlStorage(QObject *parent = 0);
   virtual ~PostgreSqlStorage();
 
+  virtual AbstractSqlMigrationWriter *createMigrationWriter();
+
 public slots:
   /* General */
 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
 
 
   // 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();
 
 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);
 
   virtual bool writeMo(const QuasselUserMO &user);
   virtual bool writeMo(const SenderMO &sender);
@@ -170,10 +162,26 @@ public:
 
   bool prepareQuery(MigrationObject mo);
 
 
   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(); }
 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
 #endif
index 3f21306..1185f9d 100644 (file)
@@ -34,6 +34,8 @@ public:
   SqliteStorage(QObject *parent = 0);
   virtual ~SqliteStorage();
 
   SqliteStorage(QObject *parent = 0);
   virtual ~SqliteStorage();
 
+  virtual AbstractSqlMigrationReader *createMigrationReader();
+
 public slots:
   /* General */
 
 public slots:
   /* General */
 
@@ -125,16 +127,6 @@ class SqliteMigrationReader : public SqliteStorage, public AbstractSqlMigrationR
 public:
   SqliteMigrationReader();
 
 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);
   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(); }
 };
 
   virtual inline bool commit() { return logDb().commit(); }
 };
 
-
+inline AbstractSqlMigrationReader *SqliteStorage::createMigrationReader() {
+  return new SqliteMigrationReader();
+}
 
 #endif
 
 #endif