X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fcore%2Fplugin.c;h=79df55e589ee967a4cf9e4819d4cada6c29dfae0;hb=9935ca9e91f79b4f5ee6e9a7f94912b7992e8858;hp=f10a904169f5d3993dc89894535e6a7b4ca01513;hpb=56b97a180a53aecbfe9f7162b8ece3faae973cf9;p=sysdb.git diff --git a/src/core/plugin.c b/src/core/plugin.c index f10a904..79df55e 100644 --- a/src/core/plugin.c +++ b/src/core/plugin.c @@ -118,6 +118,7 @@ static sdb_llist_t *collector_list = NULL; static sdb_llist_t *cname_list = NULL; static sdb_llist_t *shutdown_list = NULL; static sdb_llist_t *log_list = NULL; +static sdb_llist_t *ts_fetcher_list = NULL; static struct { const char *type; @@ -751,12 +752,16 @@ sdb_plugin_register_collector(const char *name, sdb_plugin_collector_cb callback if (interval) SDB_PLUGIN_CCB(obj)->ccb_interval = *interval; else { - sdb_time_t tmp = sdb_plugin_get_ctx().interval; + ctx_t *ctx = ctx_get(); - if (tmp > 0) - SDB_PLUGIN_CCB(obj)->ccb_interval = tmp; - else - SDB_PLUGIN_CCB(obj)->ccb_interval = 0; + if (! ctx) { + sdb_log(SDB_LOG_ERR, "core: Cannot determine interval " + "for collector %s; none specified and no plugin " + "context found", cb_name); + return -1; + } + + SDB_PLUGIN_CCB(obj)->ccb_interval = ctx->public.interval; } if (! (SDB_PLUGIN_CCB(obj)->ccb_next_update = sdb_gettime())) { @@ -782,6 +787,14 @@ sdb_plugin_register_collector(const char *name, sdb_plugin_collector_cb callback return 0; } /* sdb_plugin_register_collector */ +int +sdb_plugin_register_ts_fetcher(const char *name, + sdb_plugin_fetch_ts_cb callback, sdb_object_t *user_data) +{ + return plugin_add_callback(&ts_fetcher_list, "time-series fetcher", + name, callback, user_data); +} /* sdb_plugin_register_ts_fetcher */ + sdb_plugin_ctx_t sdb_plugin_get_ctx(void) { @@ -814,6 +827,16 @@ sdb_plugin_set_ctx(sdb_plugin_ctx_t ctx, sdb_plugin_ctx_t *old) return 0; } /* sdb_plugin_set_ctx */ +const sdb_plugin_info_t * +sdb_plugin_current(void) +{ + ctx_t *ctx = ctx_get(); + + if (! ctx) + return NULL; + return &ctx->info; +} /* sdb_plugin_current */ + int sdb_plugin_configure(const char *name, oconfig_item_t *ci) { @@ -1187,5 +1210,33 @@ sdb_plugin_logf(int prio, const char *fmt, ...) return ret; } /* sdb_plugin_logf */ +sdb_timeseries_t * +sdb_plugin_fetch_timeseries(const char *type, const char *id, + sdb_timeseries_opts_t *opts) +{ + sdb_plugin_cb_t *plugin; + sdb_plugin_fetch_ts_cb callback; + sdb_timeseries_t *ts; + + ctx_t *old_ctx; + + if ((! type) || (! id) || (! opts)) + return NULL; + + plugin = SDB_PLUGIN_CB(sdb_llist_search_by_name(ts_fetcher_list, type)); + if (! plugin) { + sdb_log(SDB_LOG_ERR, "core: Cannot fetch time-series of type %s: " + "no such plugin loaded", type); + errno = ENOENT; + return NULL; + } + + old_ctx = ctx_set(plugin->cb_ctx); + callback = (sdb_plugin_fetch_ts_cb)plugin->cb_callback; + ts = callback(id, opts, plugin->cb_user_data); + ctx_set(old_ctx); + return ts; +} /* sdb_plugin_fetch_timeseries */ + /* vim: set tw=78 sw=4 ts=4 noexpandtab : */