diff --git a/src/core/plugin.c b/src/core/plugin.c
index 36f80f6e6c29296322fac9979632a0e32ea05f29..7bf3de36d740fb5ec7ebbf93724491ac9f18b6da 100644 (file)
--- a/src/core/plugin.c
+++ b/src/core/plugin.c
#include <pthread.h>
+/* helper to access info attributes */
+#define INFO_GET(i, attr) \
+ ((i)->attr ? (i)->attr : #attr" not set")
+
/*
* private data types
*/
-struct sdb_plugin_info {
- char *plugin_name;
- char *filename;
-
- /* public attributes */
- char *description;
- char *copyright;
- char *license;
-
- int version;
- int plugin_version;
-};
-#define SDB_PLUGIN_INFO_INIT { \
- /* plugin_name */ NULL, /* filename */ NULL, /* desc */ NULL, \
- /* copyright */ NULL, /* license */ NULL, \
- /* version */ -1, /* plugin_version */ -1 }
-#define INFO_GET(i, attr) \
- ((i)->attr ? (i)->attr : #attr" not set")
-
typedef struct {
sdb_object_t super;
sdb_plugin_ctx_t public;
static sdb_plugin_info_t plugin_default_info = SDB_PLUGIN_INFO_INIT;
static pthread_key_t plugin_ctx_key;
-static _Bool plugin_ctx_key_initialized = 0;
+static bool plugin_ctx_key_initialized = 0;
/* a list of the plugin contexts of all registered plugins */
static sdb_llist_t *all_plugins = 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;
sdb_llist_t **list;
} all_lists[] = {
- { "config", &config_list },
- { "init", &init_list },
- { "collector", &collector_list },
- { "cname", &cname_list },
- { "shutdown", &shutdown_list },
- { "log", &log_list },
+ { "config", &config_list },
+ { "init", &init_list },
+ { "collector", &collector_list },
+ { "cname", &cname_list },
+ { "shutdown", &shutdown_list },
+ { "log", &log_list },
+ { "timeseries fetcher", &ts_fetcher_list },
};
/*
@@ -766,12 +753,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())) {
@@ -797,6 +788,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)
{
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)
{
sdb_llist_iter_t *iter;
int ret = -1;
- _Bool logged = 0;
+ bool logged = 0;
if (! msg)
return 0;
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 : */