/// Get a list of keys for a given domain. Status scanDatabaseKeys(const std::string& domain, std::vector<std::string>& keys, const std::string& prefix, size_t max) { if (domain.empty()) { return Status(1, "Missing domain"); } if (RegistryFactory::get().external()) { // External registries (extensions) do not have databases active. // It is not possible to use an extension-based database. PluginRequest request = {{"action", "scan"}, {"domain", domain}, {"prefix", prefix}, {"max", std::to_string(max)}}; PluginResponse response; auto status = Registry::call("database", request, response); for (const auto& item : response) { if (item.count("k") > 0) { keys.push_back(item.at("k")); } } return status; } ReadLock lock(kDatabaseReset); if (!DatabasePlugin::kDBInitialized) { throw std::runtime_error("Cannot scan database values: " + prefix); } else { auto plugin = getDatabasePlugin(); return plugin->scan(domain, keys, prefix, max); } }
Status getDatabaseValue(const std::string& domain, const std::string& key, std::string& value) { if (domain.empty()) { return Status(1, "Missing domain"); } if (RegistryFactory::get().external()) { // External registries (extensions) do not have databases active. // It is not possible to use an extension-based database. PluginRequest request = { {"action", "get"}, {"domain", domain}, {"key", key}}; PluginResponse response; auto status = Registry::call("database", request, response); if (status.ok()) { // Set value from the internally-known "v" key. if (response.size() > 0 && response[0].count("v") > 0) { value = response[0].at("v"); } } return status; } ReadLock lock(kDatabaseReset); if (!DatabasePlugin::kDBInitialized) { throw std::runtime_error("Cannot get database value: " + key); } else { auto plugin = getDatabasePlugin(); return plugin->get(domain, key, value); } }
Status deleteDatabaseRange(const std::string& domain, const std::string& low, const std::string& high) { if (domain.empty()) { return Status(1, "Missing domain"); } if (RegistryFactory::get().external()) { // External registries (extensions) do not have databases active. // It is not possible to use an extension-based database. PluginRequest request = {{"action", "remove_range"}, {"domain", domain}, {"key", low}, {"key_high", high}}; return Registry::call("database", request); } ReadLock lock(kDatabaseReset); if (!DatabasePlugin::kDBInitialized) { throw std::runtime_error("Cannot delete database values: " + low + " - " + high); } else { auto plugin = getDatabasePlugin(); return plugin->removeRange(domain, low, high); } }
/// Get a list of keys for a given domain. Status scanDatabaseKeys(const std::string& domain, std::vector<std::string>& keys, const std::string& prefix, size_t max) { if (RegistryFactory::get().external()) { // External registries (extensions) do not have databases active. // It is not possible to use an extension-based database. PluginRequest request = {{"action", "scan"}, {"domain", domain}, {"prefix", prefix}, {"max", std::to_string(max)}}; PluginResponse response; auto status = Registry::call("database", request, response); for (const auto& item : response) { if (item.count("k") > 0) { keys.push_back(item.at("k")); } } return status; } else { auto plugin = getDatabasePlugin(); return plugin->scan(domain, keys, prefix, max); } }
Status deleteDatabaseValue(const std::string& domain, const std::string& key) { if (RegistryFactory::get().external()) { // External registries (extensions) do not have databases active. // It is not possible to use an extension-based database. PluginRequest request = { {"action", "remove"}, {"domain", domain}, {"key", key}}; return Registry::call("database", request); } else { auto plugin = getDatabasePlugin(); return plugin->remove(domain, key); } }
Status setDatabaseValue(const std::string& domain, const std::string& key, const std::string& value) { if (Registry::external()) { // External registries (extensions) do not have databases active. // It is not possible to use an extension-based database. PluginRequest request = { {"action", "put"}, {"domain", domain}, {"key", key}, {"value", value}}; return Registry::call("database", request); } else { auto plugin = getDatabasePlugin(); return plugin->put(domain, key, value); } }
Status getDatabaseValue(const std::string& domain, const std::string& key, std::string& value) { if (RegistryFactory::get().external()) { // External registries (extensions) do not have databases active. // It is not possible to use an extension-based database. PluginRequest request = { {"action", "get"}, {"domain", domain}, {"key", key}}; PluginResponse response; auto status = Registry::call("database", request, response); if (status.ok()) { // Set value from the internally-known "v" key. if (response.size() > 0 && response[0].count("v") > 0) { value = response[0].at("v"); } } return status; } else { auto plugin = getDatabasePlugin(); return plugin->get(domain, key, value); } }
Status setDatabaseValue(const std::string& domain, const std::string& key, const std::string& value) { if (domain.empty()) { return Status(1, "Missing domain"); } if (RegistryFactory::get().external()) { // External registries (extensions) do not have databases active. // It is not possible to use an extension-based database. PluginRequest request = { {"action", "put"}, {"domain", domain}, {"key", key}, {"value", value}}; return Registry::call("database", request); } ReadLock lock(kDatabaseReset); if (!DatabasePlugin::kDBInitialized) { throw std::runtime_error("Cannot set database value: " + key); } else { auto plugin = getDatabasePlugin(); return plugin->put(domain, key, value); } }