aboutsummaryrefslogtreecommitdiff
path: root/src/database
diff options
context:
space:
mode:
authorJude Melton-Houghton <jwmhjwmh@gmail.com>2022-11-15 10:45:12 -0500
committerGitHub <noreply@github.com>2022-11-15 16:45:12 +0100
commitcd8a7fe47298be12620cab62be8cf0816fabb095 (patch)
treed667a204294e382cdf1d08ce8a77096778fc7fdd /src/database
parent1a045da0dd7f086a6ca689620aeb0fa28a1f6ce6 (diff)
downloadminetest-cd8a7fe47298be12620cab62be8cf0816fabb095.tar.xz
Add MetaDataRef:get_keys (#12841)
Diffstat (limited to 'src/database')
-rw-r--r--src/database/database-dummy.cpp11
-rw-r--r--src/database/database-dummy.h1
-rw-r--r--src/database/database-files.cpp15
-rw-r--r--src/database/database-files.h1
-rw-r--r--src/database/database-sqlite3.cpp20
-rw-r--r--src/database/database-sqlite3.h2
-rw-r--r--src/database/database.h1
7 files changed, 51 insertions, 0 deletions
diff --git a/src/database/database-dummy.cpp b/src/database/database-dummy.cpp
index ee88c6684..a8daaca88 100644
--- a/src/database/database-dummy.cpp
+++ b/src/database/database-dummy.cpp
@@ -92,6 +92,17 @@ bool Database_Dummy::getModEntries(const std::string &modname, StringMap *storag
return true;
}
+bool Database_Dummy::getModKeys(const std::string &modname, std::vector<std::string> *storage)
+{
+ const auto mod_pair = m_mod_meta_database.find(modname);
+ if (mod_pair != m_mod_meta_database.cend()) {
+ storage->reserve(storage->size() + mod_pair->second.size());
+ for (const auto &pair : mod_pair->second)
+ storage->push_back(pair.first);
+ }
+ return true;
+}
+
bool Database_Dummy::getModEntry(const std::string &modname,
const std::string &key, std::string *value)
{
diff --git a/src/database/database-dummy.h b/src/database/database-dummy.h
index 86c680ef1..b77911d55 100644
--- a/src/database/database-dummy.h
+++ b/src/database/database-dummy.h
@@ -38,6 +38,7 @@ public:
void listPlayers(std::vector<std::string> &res);
bool getModEntries(const std::string &modname, StringMap *storage);
+ bool getModKeys(const std::string &modname, std::vector<std::string> *storage);
bool getModEntry(const std::string &modname,
const std::string &key, std::string *value);
bool hasModEntry(const std::string &modname, const std::string &key);
diff --git a/src/database/database-files.cpp b/src/database/database-files.cpp
index eff08de12..0b94b28f2 100644
--- a/src/database/database-files.cpp
+++ b/src/database/database-files.cpp
@@ -396,6 +396,21 @@ bool ModMetadataDatabaseFiles::getModEntries(const std::string &modname, StringM
return true;
}
+bool ModMetadataDatabaseFiles::getModKeys(const std::string &modname,
+ std::vector<std::string> *storage)
+{
+ Json::Value *meta = getOrCreateJson(modname);
+ if (!meta)
+ return false;
+
+ std::vector<std::string> keys = meta->getMemberNames();
+ storage->reserve(storage->size() + keys.size());
+ for (std::string &key : keys)
+ storage->push_back(std::move(key));
+
+ return true;
+}
+
bool ModMetadataDatabaseFiles::getModEntry(const std::string &modname,
const std::string &key, std::string *value)
{
diff --git a/src/database/database-files.h b/src/database/database-files.h
index 089e071fe..2f74cc2e1 100644
--- a/src/database/database-files.h
+++ b/src/database/database-files.h
@@ -79,6 +79,7 @@ public:
virtual ~ModMetadataDatabaseFiles() = default;
virtual bool getModEntries(const std::string &modname, StringMap *storage);
+ virtual bool getModKeys(const std::string &modname, std::vector<std::string> *storage);
virtual bool getModEntry(const std::string &modname,
const std::string &key, std::string *value);
virtual bool hasModEntry(const std::string &modname, const std::string &key);
diff --git a/src/database/database-sqlite3.cpp b/src/database/database-sqlite3.cpp
index 0406fadc8..5511a46de 100644
--- a/src/database/database-sqlite3.cpp
+++ b/src/database/database-sqlite3.cpp
@@ -775,6 +775,7 @@ ModMetadataDatabaseSQLite3::~ModMetadataDatabaseSQLite3()
FINALIZE_STATEMENT(m_stmt_set)
FINALIZE_STATEMENT(m_stmt_has)
FINALIZE_STATEMENT(m_stmt_get)
+ FINALIZE_STATEMENT(m_stmt_get_keys)
FINALIZE_STATEMENT(m_stmt_get_all)
}
@@ -796,6 +797,7 @@ void ModMetadataDatabaseSQLite3::createDatabase()
void ModMetadataDatabaseSQLite3::initStatements()
{
PREPARE_STATEMENT(get_all, "SELECT `key`, `value` FROM `entries` WHERE `modname` = ?");
+ PREPARE_STATEMENT(get_keys, "SELECT `key` FROM `entries` WHERE `modname` = ?");
PREPARE_STATEMENT(get,
"SELECT `value` FROM `entries` WHERE `modname` = ? AND `key` = ? LIMIT 1");
PREPARE_STATEMENT(has,
@@ -825,6 +827,24 @@ bool ModMetadataDatabaseSQLite3::getModEntries(const std::string &modname, Strin
return true;
}
+bool ModMetadataDatabaseSQLite3::getModKeys(const std::string &modname,
+ std::vector<std::string> *storage)
+{
+ verifyDatabase();
+
+ str_to_sqlite(m_stmt_get_keys, 1, modname);
+ while (sqlite3_step(m_stmt_get_keys) == SQLITE_ROW) {
+ const char *key_data = (const char *) sqlite3_column_blob(m_stmt_get_keys, 0);
+ size_t key_len = sqlite3_column_bytes(m_stmt_get_keys, 0);
+ storage->emplace_back(key_data, key_len);
+ }
+ sqlite3_vrfy(sqlite3_errcode(m_database), SQLITE_DONE);
+
+ sqlite3_reset(m_stmt_get_keys);
+
+ return true;
+}
+
bool ModMetadataDatabaseSQLite3::getModEntry(const std::string &modname,
const std::string &key, std::string *value)
{
diff --git a/src/database/database-sqlite3.h b/src/database/database-sqlite3.h
index 566f6cebb..20488f0f0 100644
--- a/src/database/database-sqlite3.h
+++ b/src/database/database-sqlite3.h
@@ -240,6 +240,7 @@ public:
virtual ~ModMetadataDatabaseSQLite3();
virtual bool getModEntries(const std::string &modname, StringMap *storage);
+ virtual bool getModKeys(const std::string &modname, std::vector<std::string> *storage);
virtual bool getModEntry(const std::string &modname,
const std::string &key, std::string *value);
virtual bool hasModEntry(const std::string &modname, const std::string &key);
@@ -258,6 +259,7 @@ protected:
private:
sqlite3_stmt *m_stmt_get_all = nullptr;
+ sqlite3_stmt *m_stmt_get_keys = nullptr;
sqlite3_stmt *m_stmt_get = nullptr;
sqlite3_stmt *m_stmt_has = nullptr;
sqlite3_stmt *m_stmt_set = nullptr;
diff --git a/src/database/database.h b/src/database/database.h
index 0f22deebc..bf5a3da2b 100644
--- a/src/database/database.h
+++ b/src/database/database.h
@@ -92,6 +92,7 @@ public:
virtual ~ModMetadataDatabase() = default;
virtual bool getModEntries(const std::string &modname, StringMap *storage) = 0;
+ virtual bool getModKeys(const std::string &modname, std::vector<std::string> *storage) = 0;
virtual bool hasModEntry(const std::string &modname, const std::string &key) = 0;
virtual bool getModEntry(const std::string &modname,
const std::string &key, std::string *value) = 0;