+class AbstractSqlMigrationReader : public AbstractSqlMigrator {
+public:
+ AbstractSqlMigrationReader();
+
+ virtual bool readMo(QuasselUserMO &user) = 0;
+ virtual bool readMo(IdentityMO &identity) = 0;
+ virtual bool readMo(IdentityNickMO &identityNick) = 0;
+ virtual bool readMo(NetworkMO &network) = 0;
+ virtual bool readMo(BufferMO &buffer) = 0;
+ virtual bool readMo(SenderMO &sender) = 0;
+ virtual bool readMo(BacklogMO &backlog) = 0;
+ virtual bool readMo(IrcServerMO &ircserver) = 0;
+ virtual bool readMo(UserSettingMO &userSetting) = 0;
+
+ bool migrateTo(AbstractSqlMigrationWriter *writer);
+
+private:
+ void abortMigration(const QString &errorMsg = QString());
+ bool finalizeMigration();
+
+ template<typename T> bool transferMo(MigrationObject moType, T &mo);
+
+ AbstractSqlMigrationWriter *_writer;
+};
+
+class AbstractSqlMigrationWriter : public AbstractSqlMigrator {
+public:
+ virtual bool writeMo(const QuasselUserMO &user) = 0;
+ virtual bool writeMo(const IdentityMO &identity) = 0;
+ virtual bool writeMo(const IdentityNickMO &identityNick) = 0;
+ virtual bool writeMo(const NetworkMO &network) = 0;
+ virtual bool writeMo(const BufferMO &buffer) = 0;
+ virtual bool writeMo(const SenderMO &sender) = 0;
+ virtual bool writeMo(const BacklogMO &backlog) = 0;
+ virtual bool writeMo(const IrcServerMO &ircserver) = 0;
+ virtual bool writeMo(const UserSettingMO &userSetting) = 0;
+
+ inline bool migrateFrom(AbstractSqlMigrationReader *reader) { return reader->migrateTo(this); }
+
+ // called after migration process
+ virtual inline bool postProcess() { return true; }
+ friend class AbstractSqlMigrationReader;
+};