Store backends now consist of a type followed by extra information.
authorMichael Vrable <mvrable@cs.ucsd.edu>
Thu, 18 Feb 2010 23:12:59 +0000 (15:12 -0800)
committerMichael Vrable <mvrable@cs.ucsd.edu>
Thu, 18 Feb 2010 23:12:59 +0000 (15:12 -0800)
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
bluesky/store-kv.cc
bluesky/store-s3.c
bluesky/store.c

index 320886c..b77f819 100644 (file)
@@ -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);
index c1b0524..6b863d8 100644 (file)
@@ -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;
 }
 
index ccf0878..7d70642 100644 (file)
@@ -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,
index 8cf9f0e..d83fe03 100644 (file)
@@ -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);
 }