// SPDX-License-Identifier: GPL-3.0-or-later
#include "sqlite_functions.h"
#include "sqlite_aclk_alert.h"
#ifdef ENABLE_ACLK
#include "../../aclk/aclk_alarm_api.h"
#endif
#define SQLITE3_COLUMN_STRDUPZ_OR_NULL(res, param) \
({ \
int _param = (param); \
sqlite3_column_bytes((res), (_param)) ? strdupz((char *)sqlite3_column_text((res), (_param))) : NULL; \
})
#define SQL_UPDATE_FILTERED_ALERT \
"UPDATE aclk_alert_%s SET filtered_alert_unique_id = @new_alert, date_created = UNIXEPOCH() " \
"WHERE filtered_alert_unique_id = @old_alert"
static void update_filtered(ALARM_ENTRY *ae, int64_t unique_id, char *uuid_str)
{
sqlite3_stmt *res = NULL;
char sql[ACLK_SYNC_QUERY_SIZE];
snprintfz(sql, sizeof(sql) - 1, SQL_UPDATE_FILTERED_ALERT, uuid_str);
int rc = sqlite3_prepare_v2(db_meta, sql, -1, &res, 0);
if (rc != SQLITE_OK) {
error_report("Failed to prepare statement when trying to update_filtered");
return;
}
int param = 0;
SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, ae->unique_id));
SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, unique_id));
param = 0;
rc = sqlite3_step_monitored(res);
if (likely(rc == SQLITE_DONE))
ae->flags |= HEALTH_ENTRY_FLAG_ACLK_QUEUED;
done:
REPORT_BIND_FAIL(res, param);
rc = sqlite3_finalize(res);
if (unlikely(rc != SQLITE_OK))
error_report("Failed to finalize statement when trying to update_filtered, rc = %d", rc);
}
#define SQL_SELECT_VARIABLE_ALERT_BY_UNIQUE_ID \
"SELECT hld.unique_id FROM health_log hl, alert_hash ah, health_log_detail hld " \
"WHERE hld.unique_id = @unique_id AND hl.config_hash_id = ah.hash_id AND hld.health_log_id = hl.health_log_id " \
"AND hl.host_id = @host_id AND ah.warn IS NULL AND ah.crit IS NULL"
static inline bool is_event_from_alert_variable_config(int64_t unique_id, uuid_t *host_id)
{
sqlite3_stmt *res = NULL;
int rc = sqlite3_prepare_v2(db_meta, SQL_SELECT_VARIABLE_ALERT_BY_UNIQUE_ID, -1, &res, 0);
if (rc != SQLITE_OK) {
error_report("Failed to prepare statement when trying to check for alert variables.");
return false;
}
bool ret = false;
int param = 0;
SQLITE_BIND_FAIL(done, sqlite3_bind_int64(res, ++param, unique_id));
SQLITE_BIND_FAIL(done, sqlite3_bind_blob(res, ++param, host_id, sizeof(*host_id), SQLITE_STATIC));
param = 0;
rc = sqlite3_step_monitored(res);
if (likely(rc == SQLITE_ROW))
ret = true;
done:
REPORT_BIND_FAIL(res, param);
rc = sqlite3_finalize(res);
if (unlikely(rc != SQLITE_OK))
error_report("Failed to finalize statement when trying to check for alert variables, rc = %d", rc);
return ret;
}
#define MAX_REMOVED_PERIOD 604800 //a week
//decide if some events should be sent or not
#define SQL_SELECT_ALERT_BY_ID \
"SELECT hld.new_status, hl.config_hash_id, hld.unique_id FROM health_log hl, aclk_alert_%s aa, health_log_detail hld " \
"WHERE hl.host_id = @host_id AND hld.unique_id = aa.filtered_alert_unique_id " \
"AND hld.alarm_id = @alarm_id AND hl.health_log_id = hld.health_log_id " \
"ORDER BY hld.rowid DESC LIMIT 1"
static bool should_send_to_cloud(RRDHOST *host