diff options
| author | Jude Melton-Houghton <jwmhjwmh@gmail.com> | 2022-11-15 10:45:12 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-11-15 16:45:12 +0100 |
| commit | cd8a7fe47298be12620cab62be8cf0816fabb095 (patch) | |
| tree | d667a204294e382cdf1d08ce8a77096778fc7fdd /src/database | |
| parent | 1a045da0dd7f086a6ca689620aeb0fa28a1f6ce6 (diff) | |
| download | minetest-cd8a7fe47298be12620cab62be8cf0816fabb095.tar.xz | |
Add MetaDataRef:get_keys (#12841)
Diffstat (limited to 'src/database')
| -rw-r--r-- | src/database/database-dummy.cpp | 11 | ||||
| -rw-r--r-- | src/database/database-dummy.h | 1 | ||||
| -rw-r--r-- | src/database/database-files.cpp | 15 | ||||
| -rw-r--r-- | src/database/database-files.h | 1 | ||||
| -rw-r--r-- | src/database/database-sqlite3.cpp | 20 | ||||
| -rw-r--r-- | src/database/database-sqlite3.h | 2 | ||||
| -rw-r--r-- | src/database/database.h | 1 |
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; |
