summaryrefslogtreecommitdiffstats
path: root/src/database/sqlite/sqlite_health.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/database/sqlite/sqlite_health.c')
-rw-r--r--src/database/sqlite/sqlite_health.c1274
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));
+
+