/* The abstraction layer for storage, allowing multiple implementations. */
typedef struct {
/* Create a new store instance and return a handle to it. */
- gpointer (*create)();
+ gpointer (*create)(const gchar *path);
/* Clean up any resources used by this store. */
void (*destroy)(gpointer store);
bluesky_store_async_unref(async);
}
-static gpointer kvstore_new()
+static gpointer kvstore_new(const gchar *path)
{
+ /* TODO: Right now we leak this memory. We should probably clean up in
+ * kvstore_destroy, but it's not a big deal. */
+ gchar **target = g_strsplit(path, ":", 0);
+ const gchar *host = "127.0.0.1", *port = "9090";
+ if (target[0] != NULL) {
+ host = target[0];
+ if (target[1] != NULL) {
+ port = target[1];
+ }
+ }
+
static volatile gsize once = 0;
if (g_once_init_enter(&once)) {
thread_pool = g_thread_pool_new(kvstore_task, NULL, -1, FALSE, NULL);
g_once_init_leave(&once, 1);
}
- KeyValueClient *client = new KeyValueClient("127.0.0.1", "9090");
+ g_print("kvstore: %s port %s\n", host, port);
+ KeyValueClient *client = new KeyValueClient(host, port);
return client;
}
bluesky_store_async_unref(async);
}
-static gpointer s3store_new()
+static gpointer s3store_new(const gchar *path)
{
S3Store *store = g_new(S3Store, 1);
store->thread_pool = g_thread_pool_new(s3store_task, store, -1, FALSE,
{
const BlueSkyStoreImplementation *impl;
- impl = g_hash_table_lookup(store_implementations, type);
- if (impl == NULL)
+ gchar *scheme, *path;
+ scheme = g_strdup(type);
+ path = strchr(scheme, ':');
+ if (path != NULL) {
+ *path = '\0';
+ path++;
+ }
+
+ impl = g_hash_table_lookup(store_implementations, scheme);
+ if (impl == NULL) {
+ g_free(scheme);
return NULL;
+ }
- gpointer handle = impl->create();
- if (handle == NULL)
+ gpointer handle = impl->create(path);
+ if (handle == NULL) {
+ g_free(scheme);
return NULL;
+ }
BlueSkyStore *store = g_new(BlueSkyStore, 1);
store->impl = impl;
store->lock = g_mutex_new();
store->cond_idle = g_cond_new();
store->pending = 0;
+ g_free(scheme);
return store;
}
GHashTable *store;
} MemStore;
-static gpointer memstore_create()
+static gpointer memstore_create(const gchar *path)
{
MemStore *store = g_new(MemStore, 1);
store->lock = g_mutex_new();
};
/* Store implementation which writes data as files to disk. */
-static gpointer filestore_create()
+static gpointer filestore_create(const gchar *path)
{
return GINT_TO_POINTER(1);
}