summaryrefslogtreecommitdiffhomepage
path: root/migration/migration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'migration/migration.cpp')
-rw-r--r--migration/migration.cpp50
1 files changed, 50 insertions, 0 deletions
diff --git a/migration/migration.cpp b/migration/migration.cpp
index a196d762..06cd5b93 100644
--- a/migration/migration.cpp
+++ b/migration/migration.cpp
@@ -1,3 +1,5 @@
+#include <cstdlib>
+
#include "migration.hpp"
#include "options/options.hpp"
@@ -5,16 +7,56 @@
#include <QString>
#include <QSettings>
+#include <QChar>
+
#include <QDebug>
#include <memory>
+// individual migrations are run in the UI thread. they can be interactive if necessary.
+
namespace migrations {
namespace detail {
void migrator::register_migration(migration* m)
{
+ const QString date = m->unique_date();
+
+ for (migration* m2 : migrations())
+ if (m2->unique_date() == date)
+ std::abort();
+
+ if (date.size() != 11)
+ abort();
+
+ if (date[8] != QChar('_'))
+ abort();
+
+ const QString year = date.left(4);
+ const QString month = date.mid(4, 2);
+ const QString day = date.mid(6, 2);
+ const QString serial = date.mid(9, 2);
+
+ bool ok = true;
+
+ if (year < "2016")
+ abort();
+
+ const int month_ = to_int(month, ok), day_ = to_int(day, ok);
+
+ (void) to_int(year, ok);
+ (void) to_int(serial, ok);
+
+ if (!ok)
+ abort();
+
+ if (month_ < 1 || month_ > 12)
+ abort();
+
+ if (day_ < 1 || day_ > 31)
+ abort();
+
migrations().push_back(m);
}
@@ -66,6 +108,14 @@ migrator::vec migrator::sorted_migrations()
return list;
}
+int migrator::to_int(const QString& str, bool& ok)
+{
+ bool tmp = false;
+ const int ret = int(str.toUInt(&tmp));
+ ok &= tmp;
+ return ret;
+}
+
std::vector<QString> migrator::run()
{
vec migrations = sorted_migrations();