summaryrefslogtreecommitdiff
path: root/modules/database/db_flatfile.cpp
diff options
context:
space:
mode:
authorMichael Stapelberg <stapelberg@users.noreply.github.com>2022-07-27 18:40:49 +0200
committerGitHub <noreply@github.com>2022-07-27 17:40:49 +0100
commita5425e3bf3cb0e0c798608f83813f9c56a9e2695 (patch)
tree0a03da75008f3f32891125fb200770a3f3918c04 /modules/database/db_flatfile.cpp
parent2062eb23f083e9b831ea0e9e2ee2989a219e0851 (diff)
database: write to temporary file and rename.
This decreases the likelihood of ending up with a zero-byte (or missing) anope.db. Co-authored-by: Michael Stapelberg <michael@robustirc.net>
Diffstat (limited to 'modules/database/db_flatfile.cpp')
-rw-r--r--modules/database/db_flatfile.cpp14
1 files changed, 6 insertions, 8 deletions
diff --git a/modules/database/db_flatfile.cpp b/modules/database/db_flatfile.cpp
index 132616392..2d00162c5 100644
--- a/modules/database/db_flatfile.cpp
+++ b/modules/database/db_flatfile.cpp
@@ -312,10 +312,7 @@ class DBFlatFile : public Module, public Pipe
else
db_name = Anope::DataDir + "/" + Config->GetModule(this)->Get<const Anope::string>("database", "anope.db");
- if (Anope::IsFile(db_name))
- rename(db_name.c_str(), (db_name + ".tmp").c_str());
-
- std::fstream *fs = databases[s_type->GetOwner()] = new std::fstream(db_name.c_str(), std::ios_base::out | std::ios_base::trunc | std::ios_base::binary);
+ std::fstream *fs = databases[s_type->GetOwner()] = new std::fstream((db_name + ".tmp").c_str(), std::ios_base::out | std::ios_base::trunc | std::ios_base::binary);
if (!fs->is_open())
Log(this) << "Unable to open " << db_name << " for writing";
@@ -349,14 +346,15 @@ class DBFlatFile : public Module, public Pipe
this->Write("Unable to write database " + db_name);
f->close();
-
- if (Anope::IsFile((db_name + ".tmp").c_str()))
- rename((db_name + ".tmp").c_str(), db_name.c_str());
}
else
{
f->close();
- unlink((db_name + ".tmp").c_str());
+#ifdef _WIN32
+ /* Windows rename() fails if the file already exists. */
+ remove(db_name.c_str());
+#endif
+ rename((db_name + ".tmp").c_str(), db_name.c_str());
}
delete f;