summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsfan5 <sfan5@live.de>2022-01-15 17:28:59 +0100
committersfan5 <sfan5@live.de>2022-01-17 21:49:18 +0100
commit42839fa1db85ab6ce61c5a185f91919a5a9c067c (patch)
tree3e28f2bb0df82f536c6c0fc2c5b31c90b2ce43a6 /src
parentb02b381af26c792d7f7feaa93198bb7efb2512de (diff)
downloadminetest-42839fa1db85ab6ce61c5a185f91919a5a9c067c.tar.gz
minetest-42839fa1db85ab6ce61c5a185f91919a5a9c067c.tar.bz2
minetest-42839fa1db85ab6ce61c5a185f91919a5a9c067c.zip
Optimize folder handling in 'files' mod storage backend
This regressed in bf22569019749e421e8ffe0a73cff988a9a9c846.
Diffstat (limited to 'src')
-rw-r--r--src/database/database-files.cpp63
1 files changed, 26 insertions, 37 deletions
diff --git a/src/database/database-files.cpp b/src/database/database-files.cpp
index 9021ae61b..7c0dbac28 100644
--- a/src/database/database-files.cpp
+++ b/src/database/database-files.cpp
@@ -430,35 +430,28 @@ void ModMetadataDatabaseFiles::beginSave()
void ModMetadataDatabaseFiles::endSave()
{
+ if (m_modified.empty())
+ return;
+
if (!fs::CreateAllDirs(m_storage_dir)) {
- errorstream << "ModMetadataDatabaseFiles: Unable to save. '" << m_storage_dir
- << "' tree cannot be created." << std::endl;
+ errorstream << "ModMetadataDatabaseFiles: Unable to save. '"
+ << m_storage_dir << "' cannot be created." << std::endl;
+ return;
+ }
+ if (!fs::IsDir(m_storage_dir)) {
+ errorstream << "ModMetadataDatabaseFiles: Unable to save. '"
+ << m_storage_dir << "' is not a directory." << std::endl;
return;
}
for (auto it = m_modified.begin(); it != m_modified.end();) {
const std::string &modname = *it;
- if (!fs::PathExists(m_storage_dir)) {
- if (!fs::CreateAllDirs(m_storage_dir)) {
- errorstream << "ModMetadataDatabaseFiles[" << modname
- << "]: Unable to save. '" << m_storage_dir
- << "' tree cannot be created." << std::endl;
- ++it;
- continue;
- }
- } else if (!fs::IsDir(m_storage_dir)) {
- errorstream << "ModMetadataDatabaseFiles[" << modname << "]: Unable to save. '"
- << m_storage_dir << "' is not a directory." << std::endl;
- ++it;
- continue;
- }
-
const Json::Value &json = m_mod_meta[modname];
if (!fs::safeWriteToFile(m_storage_dir + DIR_DELIM + modname, fastWriteJson(json))) {
errorstream << "ModMetadataDatabaseFiles[" << modname
- << "]: failed write file." << std::endl;
+ << "]: failed to write file." << std::endl;
++it;
continue;
}
@@ -484,29 +477,25 @@ void ModMetadataDatabaseFiles::listMods(std::vector<std::string> *res)
Json::Value *ModMetadataDatabaseFiles::getOrCreateJson(const std::string &modname)
{
auto found = m_mod_meta.find(modname);
- if (found == m_mod_meta.end()) {
- fs::CreateAllDirs(m_storage_dir);
+ if (found != m_mod_meta.end())
+ return &found->second;
- Json::Value meta(Json::objectValue);
+ Json::Value meta(Json::objectValue);
- std::string path = m_storage_dir + DIR_DELIM + modname;
- if (fs::PathExists(path)) {
- std::ifstream is(path.c_str(), std::ios_base::binary);
+ std::string path = m_storage_dir + DIR_DELIM + modname;
+ if (fs::PathExists(path)) {
+ std::ifstream is(path.c_str(), std::ios_base::binary);
- Json::CharReaderBuilder builder;
- builder.settings_["collectComments"] = false;
- std::string errs;
+ Json::CharReaderBuilder builder;
+ builder.settings_["collectComments"] = false;
+ std::string errs;
- if (!Json::parseFromStream(builder, is, &meta, &errs)) {
- errorstream << "ModMetadataDatabaseFiles[" << modname
- << "]: failed read data (Json decoding failure). Message: "
- << errs << std::endl;
- return nullptr;
- }
+ if (!Json::parseFromStream(builder, is, &meta, &errs)) {
+ errorstream << "ModMetadataDatabaseFiles[" << modname
+ << "]: failed to decode data: " << errs << std::endl;
+ return nullptr;
}
-
- return &(m_mod_meta[modname] = meta);
- } else {
- return &found->second;
}
+
+ return &(m_mod_meta[modname] = meta);
}