diff --git a/src/common/repository/sqlite/SettingsDb.cxx b/src/common/repository/sqlite/SettingsDb.cxx index 736927b55..54903e1f6 100644 --- a/src/common/repository/sqlite/SettingsDb.cxx +++ b/src/common/repository/sqlite/SettingsDb.cxx @@ -24,6 +24,7 @@ #include "repository/CompositeKeyValueRepositoryNoop.hxx" #include "repository/CompositeKVRJsonAdapter.hxx" #include "repository/KeyValueRepositoryConfigfile.hxx" +#include "repository/KeyValueRepositoryPropertyFile.hxx" #include "KeyValueRepositorySqlite.hxx" #include "SqliteStatement.hxx" #include "FSNode.hxx" @@ -74,42 +75,90 @@ void SettingsDb::initialize() } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void SettingsDb::initializeDb() { +void SettingsDb::initializeDb() const +{ FilesystemNode legacyConfigFile{myDatabaseDirectory}; legacyConfigFile /= "stellarc"; FilesystemNode legacyConfigDatabase{myDatabaseDirectory}; legacyConfigDatabase /= "settings.sqlite3"; - if (legacyConfigDatabase.exists() && legacyConfigDatabase.isFile()) { - Logger::info("importing old settings from " + legacyConfigDatabase.getPath()); + FilesystemNode legacyPropertyFile{myDatabaseDirectory}; + legacyPropertyFile /= "stella.pro"; - try { - SqliteStatement( - *myDb, - "ATTACH DATABASE ? AS old_db" - ) - .bind(1, legacyConfigDatabase.getPath()) - .step(); + if (legacyConfigDatabase.exists() && legacyConfigDatabase.isFile()) + importOldSettingsDB(legacyConfigDatabase); + else if (legacyConfigFile.exists() && legacyConfigFile.isFile()) + importStellarc(legacyConfigFile); - myDb->exec("INSERT INTO `settings` SELECT * FROM `old_db`.`settings`"); - myDb->exec("DETACH DATABASE `old_db`"); - } - catch (const SqliteError& err) { - Logger::error(err.what()); - } - } - else if (legacyConfigFile.exists() && legacyConfigFile.isFile()) { - Logger::info("importing old settings from " + legacyConfigFile.getPath()); - - mySettingsRepository->save(KeyValueRepositoryConfigfile(legacyConfigFile).load()); - } + if (legacyPropertyFile.exists() && legacyPropertyFile.isFile()) + importOldPropset(legacyPropertyFile); myDb->setUserVersion(CURRENT_VERSION); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -void SettingsDb::migrate() { +void SettingsDb::importStellarc(const FilesystemNode& node) const +{ + Logger::info("importing old settings from " + node.getPath()); + + mySettingsRepository->save(KeyValueRepositoryConfigfile(node).load()); +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void SettingsDb::importOldSettingsDB(const FilesystemNode& node) const { + Logger::info("importing old settings from " + node.getPath()); + + try { + SqliteStatement( + *myDb, + "ATTACH DATABASE ? AS old_db" + ) + .bind(1, node.getPath()) + .step(); + + myDb->exec("INSERT INTO `settings` SELECT * FROM `old_db`.`settings`"); + myDb->exec("DETACH DATABASE `old_db`"); + } + catch (const SqliteError& err) { + Logger::error(err.what()); + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void SettingsDb::importOldPropset(const FilesystemNode& node) const +{ + Logger::info("importing old game properties from " + node.getPath()); + + stringstream in; + + try { + node.read(in); + } + catch (const runtime_error& err) { + Logger::error(err.what()); + + return; + } + catch (...) { + Logger::error("import failed"); + + return; + } + + while (true) { + auto props = KeyValueRepositoryPropertyFile::load(in); + + if (props.size() == 0) break; + if ((props.find("Cart.MD5") == props.end()) || props["Cart.MD5"].toString() == "") continue; + + myPropertyRepository->get(props["Cart.MD5"].toString())->save(props); + } +} + +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +void SettingsDb::migrate() const +{ Int32 version = myDb->getUserVersion(); switch (version) { case 1: diff --git a/src/common/repository/sqlite/SettingsDb.hxx b/src/common/repository/sqlite/SettingsDb.hxx index 655e576ec..2352f05d1 100644 --- a/src/common/repository/sqlite/SettingsDb.hxx +++ b/src/common/repository/sqlite/SettingsDb.hxx @@ -22,6 +22,7 @@ #include "SqliteDatabase.hxx" #include "repository/KeyValueRepository.hxx" #include "repository/CompositeKeyValueRepository.hxx" +#include "FSNode.hxx" class SettingsDb { @@ -39,9 +40,12 @@ class SettingsDb private: - void initializeDb(); + void initializeDb() const; + void importStellarc(const FilesystemNode& node) const; + void importOldSettingsDB(const FilesystemNode& node) const; + void importOldPropset(const FilesystemNode& node) const; - void migrate(); + void migrate() const; private: