From 4e85fab19a4524019c5450c229b130eb4616a090 Mon Sep 17 00:00:00 2001 From: eeff <33566201+eeff@users.noreply.github.com> Date: Wed, 13 Jul 2022 11:00:01 +0800 Subject: [PATCH] feat(persistence): migrate setting persistence to sqlite --- src/adapter/storage.c | 6 +-- src/persist/persist.c | 91 ++++++++++++++++++++++--------------------- src/persist/persist.h | 30 +++++++------- 3 files changed, 64 insertions(+), 63 deletions(-) diff --git a/src/adapter/storage.c b/src/adapter/storage.c index 2fc8edab..79b11a38 100644 --- a/src/adapter/storage.c +++ b/src/adapter/storage.c @@ -26,7 +26,7 @@ void adapter_storage_setting(neu_persister_t *persister, const char *node, const char *setting) { - neu_persister_store_adapter_setting(persister, node, setting); + neu_persister_store_node_setting(persister, node, setting); } void adapter_storage_add_group(neu_persister_t *persister, const char *node, @@ -70,8 +70,8 @@ void adapter_storage_tag(neu_persister_t *persister, neu_adapter_t *adapter, int adapter_load_setting(neu_persister_t *persister, const char *node, char **setting) { - int rv = neu_persister_load_adapter_setting(persister, node, - (const char **) setting); + int rv = neu_persister_load_node_setting(persister, node, + (const char **) setting); if (0 != rv) { nlog_info("load %s setting fail", node); return -1; diff --git a/src/persist/persist.c b/src/persist/persist.c index b0a21a98..0de12587 100644 --- a/src/persist/persist.c +++ b/src/persist/persist.c @@ -1077,60 +1077,61 @@ int neu_persister_delete_group_config(neu_persister_t *persister, return rv; } -int neu_persister_store_adapter_setting(neu_persister_t *persister, - const char * adapter_name, - const char * setting) +int neu_persister_store_node_setting(neu_persister_t *persister, + const char *node_name, const char *setting) { - char path[PATH_MAX_SIZE] = { 0 }; + return neu_persister_sql_exec( + persister, + "INSERT OR REPLACE INTO settings (node_name, setting) VALUES (%Q, %Q)", + node_name, setting); +} - int n = persister_adapter_dir(path, sizeof(path), persister, adapter_name); - if (sizeof(path) == n) { - nlog_error("persister path too long: %s", path); - return -1; - } - if (0 != create_dir(path)) { - nlog_error("persister failed to create dir: %s", path); - return -1; +int neu_persister_load_node_setting(neu_persister_t * persister, + const char * node_name, + const char **const setting) +{ + int rv = 0; + sqlite3_stmt *stmt = NULL; + const char * query = "SELECT setting FROM settings WHERE node_name=?"; + + if (SQLITE_OK != + sqlite3_prepare_v2(persister->db, query, -1, &stmt, NULL)) { + nlog_error("prepare `%s` with `%s` fail: %s", query, node_name, + sqlite3_errmsg(persister->db)); + return NEU_ERR_EINTERNAL; } - n = path_cat(path, n, sizeof(path), "settings.json"); - if (sizeof(path) == n) { - nlog_error("persister path too long: %s", path); - return -1; + if (SQLITE_OK != sqlite3_bind_text(stmt, 1, node_name, -1, NULL)) { + nlog_error("bind `%s` with `%s` fail: %s", query, node_name, + sqlite3_errmsg(persister->db)); + rv = NEU_ERR_EINTERNAL; + goto end; } - int rv = write_file_string(path, setting); + if (SQLITE_ROW != sqlite3_step(stmt)) { + nlog_warn("SQL `%s` with `%s` fail: %s", query, node_name, + sqlite3_errmsg(persister->db)); + rv = NEU_ERR_EINTERNAL; + goto end; + } + char *s = strdup((char *) sqlite3_column_text(stmt, 0)); + if (NULL == s) { + nlog_error("strdup fail"); + rv = NEU_ERR_EINTERNAL; + goto end; + } + + *setting = s; + +end: + sqlite3_finalize(stmt); return rv; } -int neu_persister_load_adapter_setting(neu_persister_t * persister, - const char * adapter_name, - const char **const setting) +int neu_persister_delete_node_setting(neu_persister_t *persister, + const char * node_name) { - char path[PATH_MAX_SIZE] = { 0 }; - - int n = persister_adapter_dir(path, sizeof(path), persister, adapter_name); - if (sizeof(path) == n) { - nlog_error("persister path too long: %s", path); - return -1; - } - - n = path_cat(path, n, sizeof(path), "settings.json"); - if (sizeof(path) == n) { - nlog_error("persister path too long: %s", path); - return -1; - } - - int rv = read_file_string(path, (char **) setting); - - return rv; -} - -int neu_persister_delete_adapter_setting(neu_persister_t *persister, - const char * adapter_name) -{ - (void) persister; - (void) adapter_name; - return 0; + return neu_persister_sql_exec( + persister, "DELETE FROM settings WHERE node_name=%Q", node_name); } diff --git a/src/persist/persist.h b/src/persist/persist.h index 7c9c9ec4..f6ed6260 100644 --- a/src/persist/persist.h +++ b/src/persist/persist.h @@ -241,33 +241,33 @@ int neu_persister_delete_group_config(neu_persister_t *persister, const char * group_config_name); /** - * Persist adapter setting. + * Persist node setting. * @param persister persiter object. * @param adapter_name name of the adapter who owns the setting. - * @param setting adapter setting string. + * @param setting node setting string. * @return 0 on success, non-zero otherwise */ -int neu_persister_store_adapter_setting(neu_persister_t *persister, - const char * adapter_name, - const char * setting); +int neu_persister_store_node_setting(neu_persister_t *persister, + const char * node_name, + const char * setting); /** - * Load adapter setting. + * Load node setting. * @param persister persiter object. - * @param adapter_name name of the adapter. - * @param[out] setting used to return adapter setting string. + * @param node_name name of the node. + * @param[out] setting used to return node setting string. * @return 0 on success, non-zero otherwise */ -int neu_persister_load_adapter_setting(neu_persister_t * persister, - const char * adapter_name, - const char **const setting); +int neu_persister_load_node_setting(neu_persister_t * persister, + const char * node_name, + const char **const setting); /** - * Delete adapter setting. + * Delete node setting. * @param persister persiter object. - * @param adapter_name name of the adapter. + * @param node_name name of the node. * @return 0 on success, none-zero on failure */ -int neu_persister_delete_adapter_setting(neu_persister_t *persister, - const char * adapter_name); +int neu_persister_delete_node_setting(neu_persister_t *persister, + const char * node_name); #ifdef __cplusplus }