diff options
author | Jude Melton-Houghton <jwmhjwmh@gmail.com> | 2022-01-27 16:24:30 -0500 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-01-27 22:24:30 +0100 |
commit | fc161e757c14a0d0b86e69fb5ec631fae8b448de (patch) | |
tree | d9fc31818916ab8f40238420e1e672fea5e121d9 /src/client/client.cpp | |
parent | 47735c273c96e582f6e9bceee223270ad2a99236 (diff) | |
download | hax-minetest-server-fc161e757c14a0d0b86e69fb5ec631fae8b448de.tar.gz hax-minetest-server-fc161e757c14a0d0b86e69fb5ec631fae8b448de.zip |
Automatically migrate client mod storage (#11960)
Diffstat (limited to 'src/client/client.cpp')
-rw-r--r-- | src/client/client.cpp | 28 |
1 files changed, 28 insertions, 0 deletions
diff --git a/src/client/client.cpp b/src/client/client.cpp index d4c271bab..935a82653 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -50,6 +50,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "clientmap.h" #include "clientmedia.h" #include "version.h" +#include "database/database-files.h" #include "database/database-sqlite3.h" #include "serialization.h" #include "guiscalingfilter.h" @@ -140,6 +141,33 @@ Client::Client( m_cache_save_interval = g_settings->getU16("server_map_save_interval"); } +void Client::migrateModStorage() +{ + std::string mod_storage_dir = porting::path_user + DIR_DELIM + "client"; + std::string old_mod_storage = mod_storage_dir + DIR_DELIM + "mod_storage"; + if (fs::IsDir(old_mod_storage)) { + infostream << "Migrating client mod storage to SQLite3 database" << std::endl; + { + ModMetadataDatabaseFiles files_db(mod_storage_dir); + std::vector<std::string> mod_list; + files_db.listMods(&mod_list); + for (const std::string &modname : mod_list) { + infostream << "Migrating client mod storage for mod " << modname << std::endl; + StringMap meta; + files_db.getModEntries(modname, &meta); + for (const auto &pair : meta) { + m_mod_storage_database->setModEntry(modname, pair.first, pair.second); + } + } + } + if (!fs::Rename(old_mod_storage, old_mod_storage + ".bak")) { + // Execution cannot move forward if the migration does not complete. + throw BaseException("Could not finish migrating client mod storage"); + } + infostream << "Finished migration of client mod storage" << std::endl; + } +} + void Client::loadMods() { // Don't load mods twice. |