summaryrefslogtreecommitdiffhomepage
path: root/migration/migration.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'migration/migration.cpp')
-rw-r--r--migration/migration.cpp145
1 files changed, 83 insertions, 62 deletions
diff --git a/migration/migration.cpp b/migration/migration.cpp
index b92d6384..f4b1739b 100644
--- a/migration/migration.cpp
+++ b/migration/migration.cpp
@@ -20,17 +20,31 @@
#include <memory>
+using namespace options::globals;
+
// individual migrations are run in the UI thread. they can be interactive if necessary.
-namespace migrations {
+namespace migrations::detail {
+
-namespace detail {
+std::vector<mptr>& migrator::migration_list()
+{
+ static std::vector<mptr> v;
+ return v;
+}
-void migrator::register_migration(migration* m)
+std::vector<mfun>& migrator::migration_thunks()
+{
+ static std::vector<mfun> v;
+ return v;
+}
+
+
+void migrator::register_migration(mptr const& m)
{
const QString date = m->unique_date();
- for (migration* m2 : migrations())
+ for (mptr const& m2 : migration_list())
if (m2->unique_date() == date)
std::abort();
@@ -47,15 +61,13 @@ void migrator::register_migration(migration* m)
bool ok = true;
- if (year < "2016")
- abort();
-
- const int month_ = to_int(month, ok), day_ = to_int(day, ok);
+ const int year_ = to_int(year, ok),
+ month_ = to_int(month, ok),
+ day_ = to_int(day, ok);
- (void) to_int(year, ok);
- (void) to_int(serial, ok);
+ (void)to_int(serial, ok);
- if (!ok)
+ if (!ok || year_ < 1970)
abort();
if (month_ < 1 || month_ > 12)
@@ -64,20 +76,45 @@ void migrator::register_migration(migration* m)
if (day_ < 1 || day_ > 31)
abort();
- migrations().push_back(m);
+ migration_list().push_back(m);
}
-std::vector<migration*>& migrator::migrations()
+void migrator::eval_thunks()
{
- static std::vector<migration*> ret;
- return ret;
+ for (auto& fun : migration_thunks())
+ {
+ mptr m = fun();
+ register_migration(m);
+ }
+ if (!migration_thunks().empty())
+ sort_migrations();
+ migration_thunks().clear();
+}
+
+void migrator::add_migration_thunk(mfun& thunk)
+{
+ migration_thunks().push_back(thunk);
+}
+
+std::vector<mptr>& migrator::migrations()
+{
+ eval_thunks();
+ return migration_list();
+}
+
+void migrator::sort_migrations()
+{
+ std::sort(migration_list().begin(), migration_list().end(),
+ [](const mptr x, const mptr y) {
+ return x->unique_date() < y->unique_date();
+ });
}
QString migrator::last_migration_time()
{
QString ret;
- options::group::with_settings_object([&](QSettings& s) {
+ with_settings_object([&](QSettings& s) {
s.beginGroup("migrations");
ret = s.value("last-migration-at", "19700101_00").toString();
s.endGroup();
@@ -88,9 +125,9 @@ QString migrator::last_migration_time()
QString migrator::time_after_migrations()
{
- const std::vector<migration*> list = sorted_migrations();
+ const std::vector<mptr>& list = migrations();
- if (list.size() == 0u)
+ if (list.empty())
return QStringLiteral("19700101_00");
QString ret = list[list.size() - 1]->unique_date();
@@ -101,28 +138,18 @@ QString migrator::time_after_migrations()
void migrator::set_last_migration_time(const QString& val)
{
- options::group::with_settings_object([&](QSettings& s) {
+ with_settings_object([&](QSettings& s) {
s.beginGroup("migrations");
const QString old_value = s.value("last-migration-at", "").toString();
if (val != old_value)
{
s.setValue("last-migration-at", val);
- options::group::mark_ini_modified();
+ options::globals::detail::mark_ini_modified();
}
s.endGroup();
});
}
-std::vector<migration*> migrator::sorted_migrations()
-{
- std::vector<migration*> list(migrations());
-
- using mm = migration*;
-
- std::sort(list.begin(), list.end(), [](const mm x, const mm y) { return x->unique_date() < y->unique_date(); });
- return list;
-}
-
int migrator::to_int(const QString& str, bool& ok)
{
bool tmp = false;
@@ -133,61 +160,55 @@ int migrator::to_int(const QString& str, bool& ok)
std::vector<QString> migrator::run()
{
- std::vector<migration*> migrations = sorted_migrations();
std::vector<QString> done;
const QString last_migration = last_migration_time();
- for (migration* m_ : migrations)
- {
- migration& m(*m_);
-
- const QString date = m.unique_date();
-
- if (date <= last_migration)
- continue;
-
- if (m.should_run())
+ with_settings_object([&](QSettings&) {
+ for (mptr const& m : migrations())
{
- m.run();
- done.push_back(m.name());
+ const QString date = m->unique_date();
+
+ if (date <= last_migration)
+ continue;
+
+ if (m->should_run())
+ {
+ const QByteArray name = m->name().toUtf8();
+ const QByteArray date = m->unique_date().toUtf8();
+ qDebug() << "migrate:" << date.constData() << name.constData();
+ m->run();
+ done.push_back(m->name());
+ }
}
- }
-
- mark_config_as_not_needing_migration();
-
- if (done.size())
- {
- for (const QString& name : done)
- {
- const QByteArray data = name.toUtf8();
- qDebug() << "migrate:" << data.constData();
- }
- }
+ mark_profile_as_not_needing_migration();
+ });
return done;
}
-}
+} // ns migrations::detail
+
+namespace migrations {
-migration::migration() {}
-migration::~migration() {}
+migration::migration() = default;
+migration::~migration() = default;
-} // ns
+} // ns migrations
std::vector<QString> run_migrations()
{
return migrations::detail::migrator::run();
}
-void mark_config_as_not_needing_migration()
+void mark_profile_as_not_needing_migration()
{
using m = migrations::detail::migrator;
- m::mark_config_as_not_needing_migration();
+ m::mark_profile_as_not_needing_migration();
}
-void migrations::detail::migrator::mark_config_as_not_needing_migration()
+void migrations::detail::migrator::mark_profile_as_not_needing_migration()
{
set_last_migration_time(time_after_migrations());
}