X-Git-Url: https://git.tokkee.org/?p=sysdb.git;a=blobdiff_plain;f=src%2Fcore%2Fstore_exec.c;h=ee1f8d046f47ad49768c4aa2a2b89a0bff9bbd80;hp=436b36e4aeb25f1784257eeef5a818100e805aca;hb=6f4b7e7407964b05477416d1c1c4291421a5859a;hpb=9345a64b2fa015c30d6b3fcba76211f8d0d7cfd6 diff --git a/src/core/store_exec.c b/src/core/store_exec.c index 436b36e..ee1f8d0 100644 --- a/src/core/store_exec.c +++ b/src/core/store_exec.c @@ -35,7 +35,6 @@ #include #include -#include #include #include @@ -60,19 +59,14 @@ lookup_tojson(sdb_store_obj_t *obj, sdb_store_matcher_t *filter, return sdb_store_json_emit_full(f, obj, filter); } /* lookup_tojson */ -static size_t -sstrlen(const char *s) -{ - return s ? strlen(s) : 0; -} /* sstrlen */ - /* * query implementations */ static int -exec_fetch(sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, int type, - const char *hostname, const char *name, sdb_store_matcher_t *filter) +exec_fetch(sdb_store_t *store, sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, + int type, const char *hostname, const char *name, + sdb_store_matcher_t *filter) { uint32_t res_type = htonl(SDB_CONNECTION_FETCH); @@ -92,7 +86,7 @@ exec_fetch(sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, int type, if (type == SDB_HOST) hostname = name; - host = sdb_store_get_host(hostname); + host = sdb_store_get_host(store, hostname); if ((! host) || (filter && (! sdb_store_matcher_matches(filter, host, NULL)))) { sdb_strbuf_sprintf(errbuf, "Failed to fetch %s %s: " @@ -138,21 +132,21 @@ exec_fetch(sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, int type, "%s %s.%s to JSON", SDB_STORE_TYPE_TO_NAME(type), hostname, name); sdb_strbuf_sprintf(errbuf, "Out of memory"); - free(f); + sdb_object_deref(SDB_OBJ(f)); sdb_object_deref(SDB_OBJ(obj)); return -1; } sdb_object_deref(SDB_OBJ(obj)); sdb_store_json_finish(f); - free(f); + sdb_object_deref(SDB_OBJ(f)); return SDB_CONNECTION_DATA; } /* exec_fetch */ static int -exec_list(sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, int type, - sdb_store_matcher_t *filter) +exec_list(sdb_store_t *store, sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, + int type, sdb_store_matcher_t *filter) { uint32_t res_type = htonl(SDB_CONNECTION_LIST); sdb_store_json_formatter_t *f; @@ -169,23 +163,23 @@ exec_list(sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, int type, } sdb_strbuf_memcpy(buf, &res_type, sizeof(uint32_t)); - if (sdb_store_scan(type, /* m = */ NULL, filter, list_tojson, f)) { + if (sdb_store_scan(store, type, /* m = */ NULL, filter, list_tojson, f)) { sdb_log(SDB_LOG_ERR, "frontend: Failed to serialize " "store to JSON"); sdb_strbuf_sprintf(errbuf, "Out of memory"); - free(f); + sdb_object_deref(SDB_OBJ(f)); return -1; } sdb_store_json_finish(f); - free(f); + sdb_object_deref(SDB_OBJ(f)); return SDB_CONNECTION_DATA; } /* exec_list */ static int -exec_lookup(sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, int type, - sdb_store_matcher_t *m, sdb_store_matcher_t *filter) +exec_lookup(sdb_store_t *store, sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, + int type, sdb_store_matcher_t *m, sdb_store_matcher_t *filter) { uint32_t res_type = htonl(SDB_CONNECTION_LOOKUP); sdb_store_json_formatter_t *f; @@ -203,115 +197,30 @@ exec_lookup(sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, int type, sdb_strbuf_memcpy(buf, &res_type, sizeof(uint32_t)); - if (sdb_store_scan(type, m, filter, lookup_tojson, f)) { + if (sdb_store_scan(store, type, m, filter, lookup_tojson, f)) { sdb_log(SDB_LOG_ERR, "frontend: Failed to lookup %ss", SDB_STORE_TYPE_TO_NAME(type)); sdb_strbuf_sprintf(errbuf, "Failed to lookup %ss", SDB_STORE_TYPE_TO_NAME(type)); - free(f); + sdb_object_deref(SDB_OBJ(f)); return -1; } sdb_store_json_finish(f); - free(f); + sdb_object_deref(SDB_OBJ(f)); return SDB_CONNECTION_DATA; } /* exec_lookup */ static int -exec_store(sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, sdb_ast_store_t *st) -{ - char name[sstrlen(st->hostname) + sstrlen(st->parent) + sstrlen(st->name) + 3]; - sdb_metric_store_t metric_store; - int type = st->obj_type, status = -1; - - switch (st->obj_type) { - case SDB_HOST: - strncpy(name, st->name, sizeof(name)); - status = sdb_plugin_store_host(st->name, st->last_update); - break; - - case SDB_SERVICE: - snprintf(name, sizeof(name), "%s.%s", st->hostname, st->name); - status = sdb_plugin_store_service(st->hostname, st->name, st->last_update); - break; - - case SDB_METRIC: - snprintf(name, sizeof(name), "%s.%s", st->hostname, st->name); - metric_store.type = st->store_type; - metric_store.id = st->store_id; - status = sdb_plugin_store_metric(st->hostname, st->name, - &metric_store, st->last_update); - break; - - case SDB_ATTRIBUTE: - type |= st->parent_type; - - if (st->parent) - snprintf(name, sizeof(name), "%s.%s.%s", - st->hostname, st->parent, st->name); - else - snprintf(name, sizeof(name), "%s.%s", st->hostname, st->name); - - switch (st->parent_type) { - case 0: - type |= SDB_HOST; - status = sdb_plugin_store_attribute(st->hostname, - st->name, &st->value, st->last_update); - break; - - case SDB_SERVICE: - status = sdb_plugin_store_service_attribute(st->hostname, st->parent, - st->name, &st->value, st->last_update); - break; - - case SDB_METRIC: - status = sdb_plugin_store_metric_attribute(st->hostname, st->parent, - st->name, &st->value, st->last_update); - break; - - default: - sdb_log(SDB_LOG_ERR, "store: Invalid parent type in STORE: %s", - SDB_STORE_TYPE_TO_NAME(st->parent_type)); - return -1; - } - break; - - default: - sdb_log(SDB_LOG_ERR, "store: Invalid object type in STORE: %s", - SDB_STORE_TYPE_TO_NAME(st->obj_type)); - return -1; - } - - if (status < 0) { - sdb_strbuf_sprintf(errbuf, "STORE: Failed to store %s object", - SDB_STORE_TYPE_TO_NAME(type)); - return -1; - } - - if (! status) { - sdb_strbuf_sprintf(buf, "Successfully stored %s %s", - SDB_STORE_TYPE_TO_NAME(type), name); - } - else { - char type_str[32]; - strncpy(type_str, SDB_STORE_TYPE_TO_NAME(type), sizeof(type_str)); - type_str[0] = (char)toupper((int)type_str[0]); - sdb_strbuf_sprintf(buf, "%s %s already up to date", type_str, name); - } - - return SDB_CONNECTION_OK; -} /* exec_store */ - -static int -exec_timeseries(sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, +exec_timeseries(sdb_store_t *store, sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, const char *hostname, const char *metric, sdb_timeseries_opts_t *opts) { uint32_t res_type = htonl(SDB_CONNECTION_TIMESERIES); sdb_strbuf_memcpy(buf, &res_type, sizeof(uint32_t)); - if (sdb_store_fetch_timeseries(hostname, metric, opts, buf)) { + if (sdb_store_fetch_timeseries(store, hostname, metric, opts, buf)) { sdb_log(SDB_LOG_ERR, "frontend: Failed to fetch time-series"); sdb_strbuf_sprintf(errbuf, "Failed to fetch time-series"); return -1; @@ -325,46 +234,39 @@ exec_timeseries(sdb_strbuf_t *buf, sdb_strbuf_t *errbuf, */ int -sdb_store_query_execute(sdb_store_query_t *m, +sdb_store_query_execute(sdb_store_t *store, sdb_store_query_t *q, sdb_strbuf_t *buf, sdb_strbuf_t *errbuf) { sdb_timeseries_opts_t ts_opts; sdb_ast_node_t *ast; - if (! m) + if (! q) return -1; - if (! QUERY(m)->ast) { + if (! q->ast) { sdb_log(SDB_LOG_ERR, "store: Invalid empty query"); return -1; } - ast = QUERY(m)->ast; + ast = q->ast; switch (ast->type) { case SDB_AST_TYPE_FETCH: - return exec_fetch(buf, errbuf, SDB_AST_FETCH(ast)->obj_type, + return exec_fetch(store, buf, errbuf, SDB_AST_FETCH(ast)->obj_type, SDB_AST_FETCH(ast)->hostname, SDB_AST_FETCH(ast)->name, - QUERY(m)->filter); + q->filter); case SDB_AST_TYPE_LIST: - return exec_list(buf, errbuf, SDB_AST_LIST(ast)->obj_type, - QUERY(m)->filter); + return exec_list(store, buf, errbuf, SDB_AST_LIST(ast)->obj_type, + q->filter); case SDB_AST_TYPE_LOOKUP: - return exec_lookup(buf, errbuf, SDB_AST_LOOKUP(ast)->obj_type, - QUERY(m)->matcher, QUERY(m)->filter); - - case SDB_AST_TYPE_STORE: - if (ast->type != SDB_AST_TYPE_STORE) { - sdb_log(SDB_LOG_ERR, "store: Invalid AST node for STORE command: %s", - SDB_AST_TYPE_TO_STRING(ast)); - return -1; - } - return exec_store(buf, errbuf, SDB_AST_STORE(ast)); + return exec_lookup(store, buf, errbuf, SDB_AST_LOOKUP(ast)->obj_type, + q->matcher, q->filter); case SDB_AST_TYPE_TIMESERIES: ts_opts.start = SDB_AST_TIMESERIES(ast)->start; ts_opts.end = SDB_AST_TIMESERIES(ast)->end; - return exec_timeseries(buf, errbuf, SDB_AST_TIMESERIES(ast)->hostname, + return exec_timeseries(store, buf, errbuf, + SDB_AST_TIMESERIES(ast)->hostname, SDB_AST_TIMESERIES(ast)->metric, &ts_opts); default: