diff options
Diffstat (limited to 'database/sqlite/sqlite_functions.c')
-rw-r--r-- | database/sqlite/sqlite_functions.c | 169 |
1 files changed, 100 insertions, 69 deletions
diff --git a/database/sqlite/sqlite_functions.c b/database/sqlite/sqlite_functions.c index e0e9b26d37..c0724ba9e3 100644 --- a/database/sqlite/sqlite_functions.c +++ b/database/sqlite/sqlite_functions.c @@ -29,6 +29,7 @@ const char *database_config[] = { "CREATE TABLE IF NOT EXISTS metadata_migration(filename text, file_size, date_created int);", "CREATE INDEX IF NOT EXISTS ind_d1 on dimension (chart_id, id, name);", "CREATE INDEX IF NOT EXISTS ind_c1 on chart (host_id, id, type, name);", + "CREATE INDEX IF NOT EXISTS ind_c2 on chart (host_id, context);", "CREATE TABLE IF NOT EXISTS chart_label(chart_id blob, source_type int, label_key text, " "label_value text, date_created int, PRIMARY KEY (chart_id, label_key));", "CREATE TABLE IF NOT EXISTS node_instance (host_id blob PRIMARY KEY, claim_id, node_id, date_created);", @@ -408,6 +409,24 @@ int init_database_batch(sqlite3 *database, int rebuild, int init_type, const cha return 0; } +static void _uuid_parse(sqlite3_context *context, int argc, sqlite3_value **argv) +{ + uuid_t uuid; + + if ( argc != 1 ){ + sqlite3_result_null(context); + return ; + } + int rc = uuid_parse((const char *) sqlite3_value_text(argv[0]), uuid); + if (rc == -1) { + sqlite3_result_null(context); + return ; + } + + sqlite3_result_blob(context, &uuid, sizeof(uuid_t), SQLITE_TRANSIENT); +} + + /* * Initialize the SQLite database * Return 0 on success @@ -527,6 +546,9 @@ int sql_init_database(db_check_action_type_t rebuild, int memory) for (int i = 0; i < MAX_PREPARED_STATEMENTS; i++) (void)pthread_key_create(&key_pool[i], release_statement); + rc = sqlite3_create_function(db_meta, "u2h", 1, SQLITE_ANY | SQLITE_DETERMINISTIC, 0, _uuid_parse, 0, 0); + if (unlikely(rc != SQLITE_OK)) + error_report("Failed to register internal u2h function"); return 0; } @@ -605,11 +627,11 @@ int find_dimension_uuid(RRDSET *st, RRDDIM *rd, uuid_t *store_uuid) if (unlikely(rc != SQLITE_OK)) goto bind_fail; - rc = sqlite3_bind_text(res, 2, rd->id, -1, SQLITE_STATIC); + rc = sqlite3_bind_text(res, 2, rrddim_id(rd), -1, SQLITE_STATIC); if (unlikely(rc != SQLITE_OK)) goto bind_fail; - rc = sqlite3_bind_text(res, 3, rd->name, -1, SQLITE_STATIC); + rc = sqlite3_bind_text(res, 3, rrddim_name(rd), -1, SQLITE_STATIC); if (unlikely(rc != SQLITE_OK)) goto bind_fail; @@ -620,7 +642,7 @@ int find_dimension_uuid(RRDSET *st, RRDDIM *rd, uuid_t *store_uuid) } else { uuid_generate(*store_uuid); - status = sql_store_dimension(store_uuid, st->chart_uuid, rd->id, rd->name, rd->multiplier, rd->divisor, rd->algorithm); + status = sql_store_dimension(store_uuid, st->chart_uuid, rrddim_id(rd), rrddim_name(rd), rd->multiplier, rd->divisor, rd->algorithm); if (unlikely(status)) error_report("Failed to store dimension metadata in the database"); } @@ -745,8 +767,11 @@ int update_chart_metadata(uuid_t *chart_uuid, RRDSET *st, const char *id, const return 0; rc = sql_store_chart( - chart_uuid, &st->rrdhost->host_uuid, st->type, id, name, st->family, st->context, st->title, st->units, st->plugin_name, - st->module_name, st->priority, st->update_every, st->chart_type, st->rrd_memory_mode, st->entries); + chart_uuid, &st->rrdhost->host_uuid, rrdset_type(st), id, name, + rrdset_family(st), rrdset_context(st), rrdset_title(st), rrdset_units(st), + rrdset_plugin_name(st), rrdset_module_name(st), + st->priority, st->update_every, st->chart_type, + st->rrd_memory_mode, st->entries); return rc; } @@ -762,7 +787,7 @@ uuid_t *create_chart_uuid(RRDSET *st, const char *id, const char *name) #ifdef NETDATA_INTERNAL_CHECKS char uuid_str[GUID_LEN + 1]; uuid_unparse_lower(*uuid, uuid_str); - debug(D_METADATALOG,"Generating uuid [%s] for chart %s under host %s", uuid_str, st->id, st->rrdhost->hostname); + debug(D_METADATALOG,"Generating uuid [%s] for chart %s under host %s", uuid_str, rrdset_id(st), rrdhost_hostname(st->rrdhost)); #endif rc = update_chart_metadata(uuid, st, id, name); @@ -922,11 +947,11 @@ int sql_store_host_info(RRDHOST *host) if (unlikely(rc != SQLITE_OK)) goto bind_fail; - rc = bind_text_null(res, 2, host->hostname, 0); + rc = bind_text_null(res, 2, rrdhost_hostname(host), 0); if (unlikely(rc != SQLITE_OK)) goto bind_fail; - rc = bind_text_null(res, 3, host->registry_hostname, 1); + rc = bind_text_null(res, 3, rrdhost_registry_hostname(host), 1); if (unlikely(rc != SQLITE_OK)) goto bind_fail; @@ -934,15 +959,15 @@ int sql_store_host_info(RRDHOST *host) if (unlikely(rc != SQLITE_OK)) goto bind_fail; - rc = bind_text_null(res, 5, host->os, 1); + rc = bind_text_null(res, 5, rrdhost_os(host), 1); if (unlikely(rc != SQLITE_OK)) goto bind_fail; - rc = bind_text_null(res, 6, host->timezone, 1); + rc = bind_text_null(res, 6, rrdhost_timezone(host), 1); if (unlikely(rc != SQLITE_OK)) goto bind_fail; - rc = bind_text_null(res, 7, host->tags, 1); + rc = bind_text_null(res, 7, rrdhost_tags(host), 1); if (unlikely(rc != SQLITE_OK)) goto bind_fail; @@ -954,7 +979,7 @@ int sql_store_host_info(RRDHOST *host) if (unlikely(rc != SQLITE_OK)) goto bind_fail; - rc = bind_text_null(res, 10, host->abbrev_timezone, 1); + rc = bind_text_null(res, 10, rrdhost_abbrev_timezone(host), 1); if (unlikely(rc != SQLITE_OK)) goto bind_fail; @@ -962,11 +987,11 @@ int sql_store_host_info(RRDHOST *host) if (unlikely(rc != SQLITE_OK)) goto bind_fail; - rc = bind_text_null(res, 12, host->program_name, 1); + rc = bind_text_null(res, 12, rrdhost_program_name(host), 1); if (unlikely(rc != SQLITE_OK)) goto bind_fail; - rc = bind_text_null(res, 13, host->program_version, 1); + rc = bind_text_null(res, 13, rrdhost_program_version(host), 1); if (unlikely(rc != SQLITE_OK)) goto bind_fail; @@ -980,18 +1005,18 @@ int sql_store_host_info(RRDHOST *host) int store_rc = sqlite3_step_monitored(res); if (unlikely(store_rc != SQLITE_DONE)) - error_report("Failed to store host %s, rc = %d", host->hostname, rc); + error_report("Failed to store host %s, rc = %d", rrdhost_hostname(host), rc); rc = sqlite3_reset(res); if (unlikely(rc != SQLITE_OK)) - error_report("Failed to reset statement to store host %s, rc = %d", host->hostname, rc); + error_report("Failed to reset statement to store host %s, rc = %d", rrdhost_hostname(host), rc); return !(store_rc == SQLITE_DONE); bind_fail: - error_report("Failed to bind parameter to store host %s, rc = %d", host->hostname, rc); + error_report("Failed to bind parameter to store host %s, rc = %d", rrdhost_hostname(host), rc); rc = sqlite3_reset(res); if (unlikely(rc != SQLITE_OK)) - error_report("Failed to reset statement to store host %s, rc = %d", host->hostname, rc); + error_report("Failed to reset statement to store host %s, rc = %d", rrdhost_hostname(host), rc); return 1; } @@ -1315,11 +1340,11 @@ void sql_rrdset2json(RRDHOST *host, BUFFER *wb) ",\n\t\"memory_mode\": \"%s\"" ",\n\t\"custom_info\": \"%s\"" ",\n\t\"charts\": {" - , host->hostname - , host->program_version + , rrdhost_hostname(host) + , rrdhost_program_version(host) , get_release_channel() - , host->os - , host->timezone + , rrdhost_os(host) + , rrdhost_timezone(host) , host->rrd_update_every , host->rrd_history_entries , rrd_memory_mode_name(host->rrd_memory_mode) @@ -1410,7 +1435,7 @@ void sql_rrdset2json(RRDHOST *host, BUFFER *wb) "\n\t\t\t\"hostname\": \"%s\"" "\n\t\t}" , (found > 0) ? "," : "" - , h->hostname + , rrdhost_hostname(h) ); found++; @@ -1424,7 +1449,7 @@ void sql_rrdset2json(RRDHOST *host, BUFFER *wb) , "\n\t\t{" "\n\t\t\t\"hostname\": \"%s\"" "\n\t\t}" - , host->hostname + , rrdhost_hostname(host) ); } @@ -1445,13 +1470,13 @@ failed: void free_temporary_host(RRDHOST *host) { if (host) { - freez(host->hostname); - freez((char *)host->os); - freez((char *)host->tags); - freez((char *)host->timezone); - freez(host->program_name); - freez(host->program_version); - freez(host->registry_hostname); + string_freez(host->hostname); + string_freez(host->os); + string_freez(host->tags); + string_freez(host->timezone); + string_freez(host->program_name); + string_freez(host->program_version); + string_freez(host->registry_hostname); freez(host->system_info); freez(host); } @@ -1506,10 +1531,13 @@ RRDHOST *sql_create_host_by_uuid(char *hostname) host = callocz(1, sizeof(RRDHOST)); - set_host_properties(host, sqlite3_column_int(res, 2), RRD_MEMORY_MODE_DBENGINE, hostname, - (char *) sqlite3_column_text(res, 1), (const char *) uuid_str, - (char *) sqlite3_column_text(res, 3), (char *) sqlite3_column_text(res, 5), - (char *) sqlite3_column_text(res, 4), NULL, 0, NULL, NULL); + set_host_properties(host, sqlite3_column_int(res, 2), + RRD_MEMORY_MODE_DBENGINE, + (char *) sqlite3_column_text(res, 1), + (char *) sqlite3_column_text(res, 3), + (char *) sqlite3_column_text(res, 5), + (char *) sqlite3_column_text(res, 4), + NULL, 0, NULL, NULL); uuid_copy(host->host_uuid, *((uuid_t *) sqlite3_column_blob(res, 0))); @@ -1778,8 +1806,8 @@ static RRDDIM *create_rrdim_entry(ONEWAYALLOC *owa, RRDSET *st, char *id, char * rrddim_flag_set(rd, RRDDIM_FLAG_NONE); uuid_copy(rd->metric_uuid, *metric_uuid); - rd->id = onewayalloc_strdupz(owa, id); - rd->name = onewayalloc_strdupz(owa, name); + rd->id = string_strdupz(id); + rd->name = string_strdupz(name); for(int tier = 0; tier < storage_tiers ;tier++) { rd->tiers[tier] = onewayalloc_callocz(owa, 1, sizeof(*rd->tiers[tier])); @@ -1869,8 +1897,9 @@ void sql_build_context_param_list(ONEWAYALLOC *owa, struct context_param **para if (!st || uuid_compare(*(uuid_t *)sqlite3_column_blob(res, 7), chart_id)) { if (unlikely(st && !st->counter)) { - onewayalloc_freez(owa, st->context); - onewayalloc_freez(owa, (char *) st->name); + string_freez(st->context); + string_freez(st->name); + string_freez(st->id); onewayalloc_freez(owa, st); } st = onewayalloc_callocz(owa, 1, sizeof(*st)); @@ -1879,19 +1908,21 @@ void sql_build_context_param_list(ONEWAYALLOC *owa, struct context_param **para snprintfz( n, RRD_ID_LENGTH_MAX, "%s.%s", (char *)sqlite3_column_text(res, 4), (char *)sqlite3_column_text(res, 3)); - st->name = onewayalloc_strdupz(owa, n); + st->name = string_strdupz(n); st->update_every = sqlite3_column_int(res, 6); st->counter = 0; if (chart) { - st->context = onewayalloc_strdupz(owa, (char *)sqlite3_column_text(res, 8)); - strncpyz(st->id, chart, RRD_ID_LENGTH_MAX); - } + st->context = string_strdupz((char *)sqlite3_column_text(res, 8)); + st->id = string_strdupz(chart); + } else + st->id = string_strdupz(n); + uuid_copy(chart_id, *(uuid_t *)sqlite3_column_blob(res, 7)); st->last_entry_t = 0; st->rrdhost = host; } - if (unlikely(find_dimension_first_last_t(machine_guid, (char *)st->name, (char *)sqlite3_column_text(res, 1), + if (unlikely(find_dimension_first_last_t(machine_guid, (char *)rrdset_name(st), (char *)sqlite3_column_text(res, 1), (uuid_t *)sqlite3_column_blob(res, 0), &(*param_list)->first_entry_t, &(*param_list)->last_entry_t, &rrdeng_uuid, 0))) continue; @@ -1909,13 +1940,14 @@ void sql_build_context_param_list(ONEWAYALLOC *owa, struct context_param **para } if (st) { if (!st->counter) { - onewayalloc_freez(owa,st->context); - onewayalloc_freez(owa,(char *)st->name); + string_freez(st->context); + string_freez(st->name); + string_freez(st->id); onewayalloc_freez(owa,st); } else if (!st->context && context) - st->context = onewayalloc_strdupz(owa,context); + st->context = string_strdupz(context); } failed: @@ -2063,7 +2095,7 @@ void compute_chart_hash(RRDSET *st) char priority_str[32]; if (rrdhost_flag_check(st->rrdhost, RRDHOST_FLAG_ACLK_STREAM_CONTEXTS)) { - internal_error(true, "Skipping compute_chart_hash for host %s because context streaming is enabled", st->rrdhost->hostname); + internal_error(true, "Skipping compute_chart_hash for host %s because context streaming is enabled", rrdhost_hostname(st->rrdhost)); return; } @@ -2072,15 +2104,14 @@ void compute_chart_hash(RRDSET *st) evpctx = EVP_MD_CTX_create(); EVP_DigestInit_ex(evpctx, EVP_sha256(), NULL); //EVP_DigestUpdate(evpctx, st->type, strlen(st->type)); - EVP_DigestUpdate(evpctx, st->id, strlen(st->id)); - EVP_DigestUpdate(evpctx, st->name, strlen(st->name)); - EVP_DigestUpdate(evpctx, st->family, strlen(st->family)); - EVP_DigestUpdate(evpctx, st->context, strlen(st->context)); - EVP_DigestUpdate(evpctx, st->title, strlen(st->title)); - EVP_DigestUpdate(evpctx, st->units, strlen(st->units)); - EVP_DigestUpdate(evpctx, st->plugin_name, strlen(st->plugin_name)); - if (st->module_name) - EVP_DigestUpdate(evpctx, st->module_name, strlen(st->module_name)); + EVP_DigestUpdate(evpctx, rrdset_id(st), string_strlen(st->id)); + EVP_DigestUpdate(evpctx, rrdset_name(st), string_strlen(st->name)); + EVP_DigestUpdate(evpctx, rrdset_family(st), string_strlen(st->family)); + EVP_DigestUpdate(evpctx, rrdset_context(st), string_strlen(st->context)); + EVP_DigestUpdate(evpctx, rrdset_title(st), string_strlen(st->title)); + EVP_DigestUpdate(evpctx, rrdset_units(st), string_strlen(st->units)); + EVP_DigestUpdate(evpctx, rrdset_plugin_name(st), string_strlen(st->plugin_name)); + EVP_DigestUpdate(evpctx, rrdset_module_name(st), string_strlen(st->module_name)); // EVP_DigestUpdate(evpctx, priority_str, strlen(priority_str)); EVP_DigestUpdate(evpctx, &st->priority, sizeof(st->priority)); EVP_DigestUpdate(evpctx, &st->chart_type, sizeof(st->chart_type)); @@ -2096,15 +2127,15 @@ void compute_chart_hash(RRDSET *st) (void)sql_store_chart_hash( (uuid_t *)&hash_value, st->chart_uuid, - st->type, - st->id, - st->name, - st->family, - st->context, - st->title, - st->units, - st->plugin_name, - st->module_name, + rrdset_type(st), + rrdset_id(st), + rrdset_name(st), + rrdset_family(st), + rrdset_context(st), + rrdset_title(st), + rrdset_units(st), + rrdset_plugin_name(st), + rrdset_module_name(st), st->priority, st->chart_type); #else @@ -2224,7 +2255,7 @@ int update_node_id(uuid_t *host_id, uuid_t *node_id) char host_guid[GUID_LEN + 1]; uuid_unparse_lower(*host_id, host_guid); rrd_wrlock(); - host = rrdhost_find_by_guid(host_guid, 0); + host = rrdhost_find_by_guid(host_guid); if (likely(host)) set_host_node_id(host, node_id); rrd_unlock(); @@ -2439,7 +2470,7 @@ struct node_instance_list *get_node_list(void) uuid_copy(node_list[row].host_id, *host_id); node_list[row].queryable = 1; uuid_unparse_lower(*host_id, host_guid); - RRDHOST *host = rrdhost_find_by_guid(host_guid, 0); + RRDHOST *host = rrdhost_find_by_guid(host_guid); node_list[row].live = host && (host == localhost || host->receiver) ? 1 : 0; node_list[row].hops = (host && host->system_info) ? host->system_info->hops : uuid_compare(*host_id, localhost->host_uuid) ? 1 : 0; @@ -2677,7 +2708,7 @@ void sql_store_host_labels(RRDHOST *host) { int rc = exec_statement_with_uuid(SQL_DELETE_HOST_LABELS, &host->host_uuid); if (rc != SQLITE_OK) - error_report("Failed to remove old host labels for host %s", host->hostname); + error_report("Failed to remove old host labels for host %s", rrdhost_hostname(host)); rrdlabels_walkthrough_read(host->host_labels, save_host_label_callback, host); } |