diff options
Diffstat (limited to 'src/database/sqlite/sqlite_health.c')
-rw-r--r-- | src/database/sqlite/sqlite_health.c | 1274 |
1 files changed, 357 insertions, 917 deletions
diff --git a/src/database/sqlite/sqlite_health.c b/src/database/sqlite/sqlite_health.c index de156cfe5d..51e38d05aa 100644 --- a/src/database/sqlite/sqlite_health.c +++ b/src/database/sqlite/sqlite_health.c @@ -6,8 +6,8 @@ #include "health/health_internals.h" #define MAX_HEALTH_SQL_SIZE 2048 -#define SQLITE3_BIND_STRING_OR_NULL(res, key, param) \ - ((key) ? sqlite3_bind_text(res, param, string2str(key), -1, SQLITE_STATIC) : sqlite3_bind_null(res, param)) +#define SQLITE3_BIND_STRING_OR_NULL(res, param, key) \ + ((key) ? sqlite3_bind_text((res), (param), string2str(key), -1, SQLITE_STATIC) : sqlite3_bind_null((res), (param))) #define SQLITE3_COLUMN_STRINGDUP_OR_NULL(res, param) \ ({ \ @@ -26,84 +26,38 @@ static void sql_health_alarm_log_update(RRDHOST *host, ALARM_ENTRY *ae) { - sqlite3_stmt *res = NULL; + static __thread sqlite3_stmt *res = NULL; int rc; - if (unlikely(!db_meta)) { - if (default_rrd_memory_mode == RRD_MEMORY_MODE_DBENGINE) - error_report("HEALTH [%s]: Database has not been initialized", rrdhost_hostname(host)); - return; - } + REQUIRE_DB(db_meta); - rc = sqlite3_prepare_v2(db_meta, SQL_UPDATE_HEALTH_LOG, -1, &res, 0); - if (unlikely(rc != SQLITE_OK)) { - error_report("HEALTH [%s]: Failed to prepare statement for SQL_UPDATE_HEALTH_LOG", rrdhost_hostname(host)); + if (!PREPARE_COMPILED_STATEMENT(db_meta, SQL_UPDATE_HEALTH_LOG, &res)) return; - } - - rc = sqlite3_bind_int64(res, 1, (sqlite3_int64) ae->updated_by_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind updated_by_id parameter for SQL_UPDATE_HEALTH_LOG"); - goto failed; - } - rc = sqlite3_bind_int64(res, 2, (sqlite3_int64) ae->flags); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind flags parameter for SQL_UPDATE_HEALTH_LOG"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 3, (sqlite3_int64) ae->exec_run_timestamp); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind exec_run_timestamp parameter for SQL_UPDATE_HEALTH_LOG"); - goto failed; - } - - rc = sqlite3_bind_int(res, 4, ae->exec_code); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind exec_code parameter for SQL_UPDATE_HEALTH_LOG"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 5, (sqlite3_int64) ae->unique_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind unique_id parameter for SQL_UPDATE_HEALTH_LOG"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 6, (sqlite3_int64) ae->alarm_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind unique_id parameter for SQL_UPDATE_HEALTH_LOG"); - goto failed; - } - - rc = sqlite3_bind_blob(res, 7, &ae->transition_id, sizeof(ae->transition_id), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind host_id for SQL_UPDATE_HEALTH_LOG."); - goto failed; - } + int param = 0; + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) ae->updated_by_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) ae->flags)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) ae->exec_run_timestamp)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int(res, ++param, ae->exec_code)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) ae->unique_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) ae->alarm_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, &ae->transition_id, sizeof(ae->transition_id), SQLITE_STATIC)); + param = 0; rc = execute_insert(res); if (unlikely(rc != SQLITE_DONE)) { error_report("HEALTH [%s]: Failed to update health log, rc = %d", rrdhost_hostname(host), rc); } -failed: - if (unlikely(sqlite3_finalize(res) != SQLITE_OK)) - error_report("HEALTH [%s]: Failed to finalize the prepared statement for updating health log.", rrdhost_hostname(host)); +done: + REPORT_BIND_FAIL(res, param); + SQLITE_RESET(res); } /* Health related SQL queries Inserts an entry in the table */ -#define SQL_INSERT_HEALTH_LOG \ - "INSERT INTO health_log (host_id, alarm_id, " \ - "config_hash_id, name, chart, exec, recipient, units, chart_context, last_transition_id, chart_name) " \ - "VALUES (@host_id,@alarm_id, @config_hash_id,@name,@chart,@exec,@recipient,@units,@chart_context," \ - "@last_transition_id,@chart_name) ON CONFLICT (host_id, alarm_id) DO UPDATE " \ - "SET last_transition_id = excluded.last_transition_id, chart_name = excluded.chart_name, " \ - "config_hash_id=excluded.config_hash_id RETURNING health_log_id" #define SQL_INSERT_HEALTH_LOG_DETAIL \ "INSERT INTO health_log_detail (health_log_id, unique_id, alarm_id, alarm_event_id, " \ @@ -113,256 +67,95 @@ failed: "@non_clear_duration,@flags,@exec_run_timestamp,@delay_up_to_timestamp, @info,@exec_code,@new_status,@old_status," \ "@delay,@new_value,@old_value,@last_repeat,@transition_id,@global_id,@summary)" -static void sql_health_alarm_log_insert(RRDHOST *host, ALARM_ENTRY *ae) { - sqlite3_stmt *res = NULL; +static void sql_health_alarm_log_insert_detail(RRDHOST *host, uint64_t health_log_id, ALARM_ENTRY *ae) +{ + static __thread sqlite3_stmt *res = NULL; int rc; - uint64_t health_log_id = 0; - if (unlikely(!db_meta)) { - if (default_rrd_memory_mode == RRD_MEMORY_MODE_DBENGINE) - error_report("HEALTH [%s]: Database has not been initialized", rrdhost_hostname(host)); + if (!PREPARE_COMPILED_STATEMENT(db_meta, SQL_INSERT_HEALTH_LOG_DETAIL, &res)) return; - } - - rc = sqlite3_prepare_v2(db_meta, SQL_INSERT_HEALTH_LOG, -1, &res, 0); - if (unlikely(rc != SQLITE_OK)) { - error_report("HEALTH [%s]: Failed to prepare statement for SQL_INSERT_HEALTH_LOG", rrdhost_hostname(host)); - return; - } - - rc = sqlite3_bind_blob(res, 1, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind host_id for SQL_INSERT_HEALTH_LOG."); - goto failed; - } - - rc = sqlite3_bind_int64(res, 2, (sqlite3_int64) ae->alarm_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind alarm_id parameter for SQL_INSERT_HEALTH_LOG"); - goto failed; - } - - rc = sqlite3_bind_blob(res, 3, &ae->config_hash_id, sizeof(ae->config_hash_id), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind config_hash_id parameter for SQL_INSERT_HEALTH_LOG"); - goto failed; - } - - rc = SQLITE3_BIND_STRING_OR_NULL(res, ae->name, 4); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind name parameter for SQL_INSERT_HEALTH_LOG"); - goto failed; - } - - rc = SQLITE3_BIND_STRING_OR_NULL(res, ae->chart, 5); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind chart parameter for SQL_INSERT_HEALTH_LOG"); - goto failed; - } - rc = SQLITE3_BIND_STRING_OR_NULL(res, ae->exec, 6); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind exec parameter for SQL_INSERT_HEALTH_LOG"); - goto failed; - } + int param = 0; + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)health_log_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->unique_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->alarm_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->alarm_event_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->updated_by_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->updates_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->when)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->duration)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->non_clear_duration)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->flags)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->exec_run_timestamp)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->delay_up_to_timestamp)); + SQLITE_BIND_FAIL(done, SQLITE3_BIND_STRING_OR_NULL(res, ++param, ae->info)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int(res, ++param, ae->exec_code)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int(res, ++param, ae->new_status)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int(res, ++param, ae->old_status)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int(res, ++param, ae->delay)); + SQLITE_BIND_FAIL(done, sqlite3_bind_double(res, ++param, ae->new_value)); + SQLITE_BIND_FAIL(done, sqlite3_bind_double(res, ++param, ae->old_value)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->last_repeat)); + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, &ae->transition_id, sizeof(ae->transition_id), SQLITE_STATIC)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)ae->global_id)); + SQLITE_BIND_FAIL(done, SQLITE3_BIND_STRING_OR_NULL(res, ++param, ae->summary)); + + param = 0; + rc = execute_insert(res); + if (rc == SQLITE_DONE) + ae->flags |= HEALTH_ENTRY_FLAG_SAVED; + else + error_report( + "HEALTH [%s]: Failed to execute SQL_INSERT_HEALTH_LOG_DETAIL, rc = %d", rrdhost_hostname(host), rc); - rc = SQLITE3_BIND_STRING_OR_NULL(res, ae->recipient, 7); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind recipient parameter for SQL_INSERT_HEALTH_LOG"); - goto failed; - } +done: + REPORT_BIND_FAIL(res, param); + SQLITE_RESET(res); +} - rc = SQLITE3_BIND_STRING_OR_NULL(res, ae->units, 8); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind host_id parameter to store node instance information"); - goto failed; - } +#define SQL_INSERT_HEALTH_LOG \ + "INSERT INTO health_log (host_id, alarm_id, " \ + "config_hash_id, name, chart, exec, recipient, units, chart_context, last_transition_id, chart_name) " \ + "VALUES (@host_id,@alarm_id, @config_hash_id,@name,@chart,@exec,@recipient,@units,@chart_context," \ + "@last_transition_id,@chart_name) ON CONFLICT (host_id, alarm_id) DO UPDATE " \ + "SET last_transition_id = excluded.last_transition_id, chart_name = excluded.chart_name, " \ + "config_hash_id=excluded.config_hash_id RETURNING health_log_id" - rc = SQLITE3_BIND_STRING_OR_NULL(res, ae->chart_context, 9); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind chart_context parameter for SQL_INSERT_HEALTH_LOG"); - goto failed; - } +static void sql_health_alarm_log_insert(RRDHOST *host, ALARM_ENTRY *ae) +{ + static __thread sqlite3_stmt *res = NULL; + int rc; + uint64_t health_log_id; - rc = sqlite3_bind_blob(res, 10, &ae->transition_id, sizeof(ae->transition_id), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind transition_id parameter for SQL_INSERT_HEALTH_LOG"); - goto failed; - } + REQUIRE_DB(db_meta); - rc = SQLITE3_BIND_STRING_OR_NULL(res, ae->chart_name, 11); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind chart_name parameter for SQL_INSERT_HEALTH_LOG"); - goto failed; - } + if (!PREPARE_COMPILED_STATEMENT(db_meta, SQL_INSERT_HEALTH_LOG, &res)) + return; + int param = 0; + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) ae->alarm_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, &ae->config_hash_id, sizeof(ae->config_hash_id), SQLITE_STATIC)); + SQLITE_BIND_FAIL(done, SQLITE3_BIND_STRING_OR_NULL(res, ++param, ae->name)); + SQLITE_BIND_FAIL(done, SQLITE3_BIND_STRING_OR_NULL(res, ++param, ae->chart)); + SQLITE_BIND_FAIL(done, SQLITE3_BIND_STRING_OR_NULL(res, ++param, ae->exec)); + SQLITE_BIND_FAIL(done, SQLITE3_BIND_STRING_OR_NULL(res, ++param, ae->recipient)); + SQLITE_BIND_FAIL(done, SQLITE3_BIND_STRING_OR_NULL(res, ++param, ae->units)); + SQLITE_BIND_FAIL(done, SQLITE3_BIND_STRING_OR_NULL(res, ++param, ae->chart_context)); + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, &ae->transition_id, sizeof(ae->transition_id), SQLITE_STATIC)); + SQLITE_BIND_FAIL(done, SQLITE3_BIND_STRING_OR_NULL(res, ++param, ae->chart_name)); + + param = 0; rc = sqlite3_step_monitored(res); - if (likely(rc == SQLITE_ROW)) - health_log_id = (size_t) sqlite3_column_int64(res, 0); - else { + if (rc == SQLITE_ROW) { + health_log_id = (size_t)sqlite3_column_int64(res, 0); + sql_health_alarm_log_insert_detail(host, health_log_id, ae); + } else error_report("HEALTH [%s]: Failed to execute SQL_INSERT_HEALTH_LOG, rc = %d", rrdhost_hostname(host), rc); - goto failed; - } - - rc = sqlite3_finalize(res); - if (unlikely(rc != SQLITE_OK)) - error_report("HEALTH [%s]: Failed to finalize the prepared statement for inserting to health log.", rrdhost_hostname(host)); - - rc = sqlite3_prepare_v2(db_meta, SQL_INSERT_HEALTH_LOG_DETAIL, -1, &res, 0); - if (unlikely(rc != SQLITE_OK)) { - error_report("HEALTH [%s]: Failed to prepare statement for SQL_INSERT_HEALTH_LOG_DETAIL", rrdhost_hostname(host)); - return; - } - - rc = sqlite3_bind_int64(res, 1, (sqlite3_int64) health_log_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind unique_id parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 2, (sqlite3_int64) ae->unique_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind unique_id parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 3, (sqlite3_int64) ae->alarm_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind unique_id parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 4, (sqlite3_int64) ae->alarm_event_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind alarm_event_id parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 5, (sqlite3_int64) ae->updated_by_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind updated_by_id parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - rc = sqlite3_bind_int64(res, 6, (sqlite3_int64) ae->updates_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind updates_id parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 7, (sqlite3_int64) ae->when); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind when parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 8, (sqlite3_int64) ae->duration); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind duration parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 9, (sqlite3_int64) ae->non_clear_duration); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind non_clear_duration parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 10, (sqlite3_int64) ae->flags); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind flags parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 11, (sqlite3_int64) ae->exec_run_timestamp); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind exec_run_timestamp parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 12, (sqlite3_int64) ae->delay_up_to_timestamp); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind delay_up_to_timestamp parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = SQLITE3_BIND_STRING_OR_NULL(res, ae->info, 13); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind info parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int(res, 14, ae->exec_code); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind exec_code parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int(res, 15, ae->new_status); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind new_status parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int(res, 16, ae->old_status); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind old_status parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int(res, 17, ae->delay); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind delay parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_double(res, 18, ae->new_value); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind new_value parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_double(res, 19, ae->old_value); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind old_value parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 20, (sqlite3_int64) ae->last_repeat); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind last_repeat parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_blob(res, 21, &ae->transition_id, sizeof(ae->transition_id), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind transition_id parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 22, (sqlite3_int64) ae->global_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind global_id parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = SQLITE3_BIND_STRING_OR_NULL(res, ae->summary, 23); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind summary parameter for SQL_INSERT_HEALTH_LOG_DETAIL"); - goto failed; - } - - rc = execute_insert(res); - if (unlikely(rc != SQLITE_DONE)) { - error_report("HEALTH [%s]: Failed to execute SQL_INSERT_HEALTH_LOG_DETAIL, rc = %d", rrdhost_hostname(host), rc); - goto failed; - } - - ae->flags |= HEALTH_ENTRY_FLAG_SAVED; - -failed: - if (unlikely(sqlite3_finalize(res) != SQLITE_OK)) - error_report("HEALTH [%s]: Failed to finalize the prepared statement for inserting to health log.", rrdhost_hostname(host)); +done: + REPORT_BIND_FAIL(res, param); + SQLITE_RESET(res); } void sql_health_alarm_log_save(RRDHOST *host, ALARM_ENTRY *ae) @@ -408,11 +201,7 @@ void sql_health_alarm_log_cleanup(RRDHOST *host, bool claimed) { int rc; char command[MAX_HEALTH_SQL_SIZE + 1]; - if (unlikely(!db_meta)) { - if (default_rrd_memory_mode == RRD_MEMORY_MODE_DBENGINE) - error_report("Database has not been initialized"); - return; - } + REQUIRE_DB(db_meta); char uuid_str[UUID_STR_LEN]; uuid_unparse_lower_fix(&host->host_uuid, uuid_str); @@ -427,24 +216,14 @@ void sql_health_alarm_log_cleanup(RRDHOST *host, bool claimed) { sql = command; } - rc = sqlite3_prepare_v2(db_meta, sql, -1, &res, 0); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to prepare statement to cleanup health log detail table (claimed)"); + if (!PREPARE_STATEMENT(db_meta, sql, &res)) return; - } - rc = sqlite3_bind_blob(res, 1, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind first host_id for sql_health_alarm_log_cleanup."); - goto done; - } - - rc = sqlite3_bind_int64(res, 2, (sqlite3_int64)host->health_log.health_log_history); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind health log history for sql_health_alarm_log_cleanup."); - goto done; - } + int param = 0; + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)host->health_log.health_log_history)); + param = 0; rc = sqlite3_step_monitored(res); if (unlikely(rc != SQLITE_DONE)) error_report("Failed to cleanup health log detail table, rc = %d", rc); @@ -453,9 +232,8 @@ void sql_health_alarm_log_cleanup(RRDHOST *host, bool claimed) { sql_aclk_alert_clean_dead_entries(host); done: - rc = sqlite3_finalize(res); - if (unlikely(rc != SQLITE_OK)) - error_report("Failed to finalize the prepared statement to cleanup health log detail table (claimed)"); + REPORT_BIND_FAIL(res, param); + SQLITE_FINALIZE(res); } #define SQL_INJECT_REMOVED \ @@ -471,155 +249,100 @@ done: #define SQL_INJECT_REMOVED_UPDATE_LOG \ "UPDATE health_log SET last_transition_id = ?1 WHERE alarm_id = ?2 AND last_transition_id = ?3 AND host_id = ?4" -void sql_inject_removed_status( - RRDHOST *host, - uint32_t alarm_id, - uint32_t alarm_event_id, - uint32_t unique_id, - uint32_t max_unique_id, - uuid_t *prev_transition_id) +bool sql_update_removed_in_health_log(RRDHOST *host, uint32_t alarm_id, nd_uuid_t *transition_id, nd_uuid_t *last_transition) { - int rc; - - if (!alarm_id || !alarm_event_id || !unique_id || !max_unique_id) - return; - - sqlite3_stmt *res = NULL; - - rc = sqlite3_prepare_v2(db_meta, SQL_INJECT_REMOVED, -1, &res, 0); - if (rc != SQLITE_OK) { - error_report("Failed to prepare statement when trying to inject removed event"); - return; - } - - rc = sqlite3_bind_int64(res, 1, (sqlite3_int64) max_unique_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind max_unique_id parameter for SQL_INJECT_REMOVED"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 2, (sqlite3_int64) alarm_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind alarm_id parameter for SQL_INJECT_REMOVED"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 3, (sqlite3_int64) alarm_event_id + 1); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind alarm_event_id parameter for SQL_INJECT_REMOVED"); - goto failed; - } - - rc = sqlite3_bind_int64(res, 4, (sqlite3_int64) unique_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind unique_id parameter for SQL_INJECT_REMOVED"); - goto failed; - } + int rc = 0; + sqlite3_stmt *res; - uuid_t transition_id; - uuid_generate_random(transition_id); - rc = sqlite3_bind_blob(res, 5, &transition_id, sizeof(transition_id), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind config_hash_id parameter for SQL_INJECT_REMOVED"); - goto failed; - } + if (!PREPARE_STATEMENT(db_meta, SQL_INJECT_REMOVED_UPDATE_LOG, &res)) + return false; - rc = sqlite3_bind_int64(res, 6, (sqlite3_int64) unique_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind unique_id parameter for SQL_INJECT_REMOVED"); - goto failed; - } - - rc = sqlite3_bind_blob(res, 7, prev_transition_id, sizeof(*prev_transition_id), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind host_id parameter for SQL_INJECT_REMOVED."); - goto failed; - } + int param = 0; + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, transition_id, sizeof(*transition_id), SQLITE_STATIC)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64)alarm_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, last_transition, sizeof(*last_transition), SQLITE_STATIC)); + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC)); + param = 0; rc = execute_insert(res); - if (unlikely(rc != SQLITE_DONE)) { - error_report("HEALTH [N/A]: Failed to execute SQL_INJECT_REMOVED, rc = %d", rc); - goto failed; - } - - if (unlikely(sqlite3_finalize(res) != SQLITE_OK)) - error_report("HEALTH [N/A]: Failed to finalize the prepared statement for injecting removed event."); + if (unlikely(rc != SQLITE_DONE)) + error_report("HEALTH [N/A]: Failed to execute SQL_INJECT_REMOVED_UPDATE_DETAIL, rc = %d", rc); - //update the old entry in health_log_detail - rc = sqlite3_prepare_v2(db_meta, SQL_INJECT_REMOVED_UPDATE_DETAIL, -1, &res, 0); - if (rc != SQLITE_OK) { - error_report("Failed to prepare statement when trying to update health_log_detail during inject removed event"); - return; - } +done: + REPORT_BIND_FAIL(res, param); + SQLITE_FINALIZE(res); - rc = sqlite3_bind_int64(res, 1, (sqlite3_int64) HEALTH_ENTRY_FLAG_UPDATED); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind flags parameter for SQL_INJECT_REMOVED_UPDATE_DETAIL"); - goto failed; - } + return (param == 0 && rc == SQLITE_DONE); +} - rc = sqlite3_bind_int64(res, 2, (sqlite3_int64) max_unique_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind max_unique_id parameter for SQL_INJECT_REMOVED_UPDATE_DETAIL"); - goto failed; - } +bool sql_update_removed_in_health_log_detail(uint32_t unique_id, uint32_t max_unique_id, nd_uuid_t *prev_transition_id) +{ + int rc = 0; + sqlite3_stmt *res; - rc = sqlite3_bind_int64(res, 3, (sqlite3_int64) unique_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind unique_id parameter for SQL_INJECT_REMOVED_UPDATE_DETAIL"); - goto failed; - } + if (!PREPARE_STATEMENT(db_meta, SQL_INJECT_REMOVED_UPDATE_DETAIL, &res)) + return false; - rc = sqlite3_bind_blob(res, 4, prev_transition_id, sizeof(*prev_transition_id), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind host_id parameter for SQL_INJECT_REMOVED_UPDATE_DETAIL"); - goto failed; - } + int param = 0; + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) HEALTH_ENTRY_FLAG_UPDATED)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) max_unique_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) unique_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, prev_transition_id, sizeof(*prev_transition_id), SQLITE_STATIC)); + param = 0; rc = execute_insert(res); - if (unlikely(rc != SQLITE_DONE)) { + if (unlikely(rc != SQLITE_DONE)) error_report("HEALTH [N/A]: Failed to execute SQL_INJECT_REMOVED_UPDATE_DETAIL, rc = %d", rc); - goto failed; - } - //update the health_log_table - rc = sqlite3_prepare_v2(db_meta, SQL_INJECT_REMOVED_UPDATE_LOG, -1, &res, 0); - if (rc != SQLITE_OK) { - error_report("Failed to prepare statement when trying to update health_log during inject removed event"); +done: + REPORT_BIND_FAIL(res, param); + SQLITE_FINALIZE(res); + + return (param == 0 && rc == SQLITE_DONE); +} + +void sql_inject_removed_status( + RRDHOST *host, + uint32_t alarm_id, + uint32_t alarm_event_id, + uint32_t unique_id, + uint32_t max_unique_id, + nd_uuid_t *last_transition) +{ + if (!alarm_id || !alarm_event_id || !unique_id || !max_unique_id) return; - } - rc = sqlite3_bind_blob(res, 1, &transition_id, sizeof(transition_id), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind host_id parameter for SQL_INJECT_REMOVED_UPDATE_LOG"); - goto failed; - } + sqlite3_stmt *res = NULL; - rc = sqlite3_bind_int64(res, 2, (sqlite3_int64) alarm_id); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind unique_id parameter for SQL_INJECT_REMOVED_UPDATE_DETAIL"); - goto failed; - } + if (!PREPARE_STATEMENT(db_meta, SQL_INJECT_REMOVED, &res)) + return; - rc = sqlite3_bind_blob(res, 3, prev_transition_id, sizeof(*prev_transition_id), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind host_id parameter for SQL_INJECT_REMOVED_UPDATE_LOG"); - goto failed; - } + nd_uuid_t transition_id; + uuid_generate_random(transition_id); - rc = sqlite3_bind_blob(res, 4, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind host_id parameter for SQL_INJECT_REMOVED_UPDATE_DETAIL"); - goto failed; + int param = 0; + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) max_unique_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) alarm_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) alarm_event_id + 1)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) unique_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, &transition_id, sizeof(transition_id), SQLITE_STATIC)); + SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, (sqlite3_int64) unique_id)); + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, last_transition, sizeof(*last_transition), SQLITE_STATIC)); + + param = 0; + int rc = execute_insert(res); + if (rc == SQLITE_DONE) { + //update the old entry in health_log_detail + sql_update_removed_in_health_log_detail(unique_id, max_unique_id, last_transition); + //update the old entry in health_log + sql_update_removed_in_health_log(host, alarm_id, &transition_id, last_transition); } + else + error_report("HEALTH [N/A]: Failed to execute SQL_INJECT_REMOVED, rc = %d", rc); - rc = execute_insert(res); - if (unlikely(rc != SQLITE_DONE)) - error_report("HEALTH [N/A]: Failed to execute SQL_INJECT_REMOVED_UPDATE_DETAIL, rc = %d", rc); - -failed: - if (unlikely(sqlite3_finalize(res) != SQLITE_OK)) - error_report("HEALTH [N/A]: Failed to finalize the prepared statement for injecting removed event."); +done: + REPORT_BIND_FAIL(res, param); + SQLITE_FINALIZE(res); } #define SQL_SELECT_MAX_UNIQUE_ID \ @@ -628,33 +351,24 @@ failed: uint32_t sql_get_max_unique_id (RRDHOST *host) { - int rc; uint32_t max_unique_id = 0; sqlite3_stmt *res = NULL; - rc = sqlite3_prepare_v2(db_meta, SQL_SELECT_MAX_UNIQUE_ID, -1, &res, 0); - if (rc != SQLITE_OK) { - error_report("Failed to prepare statement when trying to get max unique id"); - return 0; - } - - rc = sqlite3_bind_blob(res, 1, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind host_id parameter for SQL_SELECT_MAX_UNIQUE_ID."); - sqlite3_finalize(res); + if (!PREPARE_STATEMENT(db_meta, SQL_SELECT_MAX_UNIQUE_ID, &res)) return 0; - } - while (sqlite3_step_monitored(res) == SQLITE_ROW) { - max_unique_id = (uint32_t) sqlite3_column_int64(res, 0); - } + int param = 0; + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC)); - rc = sqlite3_finalize(res); - if (unlikely(rc != SQLITE_OK)) - error_report("Failed to finalize the statement"); + param = 0; + while (sqlite3_step_monitored(res) == SQLITE_ROW) + max_unique_id = (uint32_t)sqlite3_column_int64(res, 0); - return max_unique_id; +done: + REPORT_BIND_FAIL(res, param); + SQLITE_FINALIZE(res); + return max_unique_id; } #define SQL_SELECT_LAST_STATUSES \ @@ -663,24 +377,17 @@ uint32_t sql_get_max_unique_id (RRDHOST *host) void sql_check_removed_alerts_state(RRDHOST *host) { - int rc; uint32_t max_unique_id = 0; sqlite3_stmt *res = NULL; - uuid_t transition_id; + nd_uuid_t transition_id; - rc = sqlite3_prepare_v2(db_meta, SQL_SELECT_LAST_STATUSES, -1, &res, 0); - if (rc != SQLITE_OK) { - error_report("Failed to prepare statement when trying to check removed statuses"); + if (!PREPARE_STATEMENT(db_meta, SQL_SELECT_LAST_STATUSES, &res)) return; - } - rc = sqlite3_bind_blob(res, 1, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC); - if (unlikely(rc != SQLITE_OK)) { - error_report("Failed to bind host_id parameter for SQL_SELECT_LAST_STATUSES."); - sqlite3_finalize(res); - return; - } + int param = 0; + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC)); + param = 0; while (sqlite3_step_monitored(res) == SQLITE_ROW) { uint32_t alarm_id, alarm_event_id, unique_id; RRDCALC_STATUS status; @@ -689,7 +396,7 @@ void sql_check_removed_alerts_state(RRDHOST *host) unique_id = (uint32_t)sqlite3_column_int64(res, 1); alarm_id = (uint32_t)sqlite3_column_int64(res, 2); alarm_event_id = (uint32_t)sqlite3_column_int64(res, 3); - uuid_copy(transition_id, *((uuid_t *)sqlite3_column_blob(res, 4))); + uuid_copy(transition_id, *((nd_uuid_t *)sqlite3_column_blob(res, 4))); if (unlikely(status != RRDCALC_STATUS_REMOVED)) { if (unlikely(!max_unique_id)) @@ -698,45 +405,38 @@ void sql_check_removed_alerts_state(RRDHOST *host) sql_inject_removed_status(host, alarm_id, alarm_event_id, unique_id, ++max_unique_id, &transition_id); } } - - rc = sqlite3_finalize(res); - if (unlikely(rc != SQLITE_OK)) - error_report("Failed to finalize the statement"); +done: + REPORT_BIND_FAIL(res, param); + SQLITE_FINALIZE(res); } #define SQL_DELETE_MISSING_CHART_ALERT \ "DELETE FROM health_log WHERE host_id = @host_id AND chart NOT IN " \ "(SELECT type||'.'||id FROM chart WHERE host_id = @host_id)" -static void sql_remove_alerts_from_deleted_charts(RRDHOST *host, uuid_t *host_id) +static void sql_remove_alerts_from_deleted_charts(RRDHOST *host, nd_uuid_t *host_uuid) { sqlite3_stmt *res = NULL; int ret; - ret = sqlite3_prepare_v2(db_meta, SQL_DELETE_MISSING_CHART_ALERT, -1, &res, 0); - if (unlikely(ret != SQLITE_OK)) { - error_report("HEALTH [%s]: Failed to prepare sql statement to sql_remove_alerts_from_deleted_charts", rrdhost_hostname(host)); + nd_uuid_t *actual_uuid = host ? &host->host_uuid : host_uuid; + if (!actual_uuid) return; - } - - if (host) - ret = sqlite3_bind_blob(res, 1, &host->host_uuid, sizeof(host->host_uuid), SQLITE_STATIC); - else - ret = sqlite3_bind_blob(res, 1, host_id, sizeof(*host_id), SQLITE_STATIC); - if (unlikely(ret != SQLITE_OK)) { - error_report("Failed to bind host_id parameter for sql_remove_alerts_from_deleted_charts."); - sqlite3_finalize(res); + if (!PREPARE_STATEMENT(db_meta, SQL_DELETE_MISSING_CHART_ALERT, &res)) return; - } + int param = 0; + SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, actual_uuid, sizeof(*actual_uuid), SQLITE_STATIC)); + + |