// 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;
}
rc = sqlite3_bind_int64(res, 1, ae->unique_id);
if (unlikely(rc != SQLITE_OK)) {
error_report("Failed to bind ae unique_id for update_filtered");
goto done;
}
rc = sqlite3_bind_int64(res, 2, unique_id);
if (unlikely(rc != SQLITE_OK)) {
error_report("Failed to bind unique_id for update_filtered");
goto done;
}
rc = sqlite3_step_monitored(res);
if (likely(rc == SQLITE_DONE))
ae->flags |= HEALTH_ENTRY_FLAG_ACLK_QUEUED;
done:
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;
rc = sqlite3_bind_int64(res, 1, unique_id);
if (unlikely(rc != SQLITE_OK)) {
error_report("Failed to bind unique_id for checking alert variable.");
goto done;
}
rc = sqlite3_bind_blob(res, 2, host_id, sizeof(*host_id), SQLITE_STATIC);
if (unlikely(rc != SQLITE_OK)) {
error_report("Failed to bind host_id for checking alert variable.");
goto done;
}
rc = sqlite3_step_monitored(res);
if (likely(rc == SQLITE_ROW))
ret = true;
done:
rc = sqlite3_finalize(res