From ea04d8bdad2da0b59fed45d8ea0128bdba2eb792 Mon Sep 17 00:00:00 2001 From: Michael Vrable Date: Thu, 18 Feb 2010 15:12:59 -0800 Subject: [PATCH] Store backends now consist of a type followed by extra information. For example: "kv:storagehost.com:9000". The other backends don't use this yet but should be made to do so. --- bluesky/bluesky-private.h | 2 +- bluesky/store-kv.cc | 16 ++++++++++++++-- bluesky/store-s3.c | 2 +- bluesky/store.c | 25 +++++++++++++++++++------ 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/bluesky/bluesky-private.h b/bluesky/bluesky-private.h index 320886c..b77f819 100644 --- a/bluesky/bluesky-private.h +++ b/bluesky/bluesky-private.h @@ -83,7 +83,7 @@ struct BlueSkyNotifierList { /* 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); diff --git a/bluesky/store-kv.cc b/bluesky/store-kv.cc index c1b0524..6b863d8 100644 --- a/bluesky/store-kv.cc +++ b/bluesky/store-kv.cc @@ -58,15 +58,27 @@ static void kvstore_task(gpointer a, gpointer b) 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; } diff --git a/bluesky/store-s3.c b/bluesky/store-s3.c index ccf0878..7d70642 100644 --- a/bluesky/store-s3.c +++ b/bluesky/store-s3.c @@ -134,7 +134,7 @@ static void s3store_task(gpointer a, gpointer s) 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, diff --git a/bluesky/store.c b/bluesky/store.c index 8cf9f0e..d83fe03 100644 --- a/bluesky/store.c +++ b/bluesky/store.c @@ -45,13 +45,25 @@ BlueSkyStore *bluesky_store_new(const gchar *type) { 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; @@ -59,6 +71,7 @@ BlueSkyStore *bluesky_store_new(const gchar *type) store->lock = g_mutex_new(); store->cond_idle = g_cond_new(); store->pending = 0; + g_free(scheme); return store; } @@ -301,7 +314,7 @@ typedef struct { 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(); @@ -367,7 +380,7 @@ static BlueSkyStoreImplementation memstore_impl = { }; /* 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); } -- 2.20.1