--- /dev/null
+ALTER SEQUENCE sender_senderid_seq CACHE 1000
--- /dev/null
+ALTER SEQUENCE backlog_messageid_seq CACHE 1000
if(!transferMo(UserSetting, userSettingMo))
return false;
+ if(!_writer->postProcess())
+ abortMigration();
return finalizeMigration();
}
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);
#include <QSqlQuery>
#include <QSqlError>
+class AbstractSqlMigrationReader;
+class AbstractSqlMigrationWriter;
+
class AbstractSqlStorage : public Storage {
Q_OBJECT
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() {};
inline QString queryString(const QString &queryName) { return queryString(queryName, 0); }
QStringList setupQueries();
- bool setup(const QVariantMap &settings = QVariantMap());
QStringList upgradeQueries(int ver);
bool upgradeDb();
QSqlQuery *_query;
};
-class AbstractSqlMigrationWriter;
class AbstractSqlMigrationReader : public AbstractSqlMigrator {
public:
AbstractSqlMigrationReader();
inline bool migrateFrom(AbstractSqlMigrationReader *reader) { return reader->migrateTo(this); }
+ // called after migration process
+ virtual inline bool postProcess() { return true; }
friend class AbstractSqlMigrationReader;
};
}
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());
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();
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;
+}
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
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);
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
SqliteStorage(QObject *parent = 0);
virtual ~SqliteStorage();
+ virtual AbstractSqlMigrationReader *createMigrationReader();
+
public slots:
/* General */
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 inline bool commit() { return logDb().commit(); }
};
-
+inline AbstractSqlMigrationReader *SqliteStorage::createMigrationReader() {
+ return new SqliteMigrationReader();
+}
#endif