r10253: a fairly large tdb cleanup and re-organise. Nearly all of this change
[samba.git] / source4 / lib / db_wrap.c
index 33c2af28515460218096bae2f58706b7f6a58f48..ed235761c98cb3f05f9d6b2f4b28d629c40e86bf 100644 (file)
 
 #include "includes.h"
 #include "dlinklist.h"
+#include "lib/events/events.h"
 #include "lib/tdb/include/tdb.h"
 #include "lib/ldb/include/ldb.h"
 #include "db_wrap.h"
 
-struct ldb_wrap {
-       struct ldb_context *ldb;
-
-       const char *url;
-       struct ldb_wrap *next, *prev;
-};
-
-static struct ldb_wrap *ldb_list;
 static struct tdb_wrap *tdb_list;
 
 /*
@@ -62,14 +55,6 @@ static void ldb_wrap_debug(void *context, enum ldb_debug_level level,
        free(s);
 }
 
-/* destroy the last connection to a ldb */
-static int ldb_wrap_destructor(void *ctx)
-{
-       struct ldb_wrap *w = ctx;
-       DLIST_REMOVE(ldb_list, w);
-       return 0;
-}                               
-
 /*
   wrapped connection to a ldb database
   to close just talloc_free() the returned ldb_context
@@ -80,40 +65,42 @@ struct ldb_context *ldb_wrap_connect(TALLOC_CTX *mem_ctx,
                                     const char *options[])
 {
        struct ldb_context *ldb;
-       struct ldb_wrap *w;
        int ret;
+       struct event_context *ev;
+       char *real_url = NULL;
 
-       for (w = ldb_list; w; w = w->next) {
-               if (strcmp(url, w->url) == 0) {
-                       return talloc_reference(mem_ctx, w->ldb);
-               }
-       }
-
-       ldb = ldb_init(talloc_autofree_context());
+       ldb = ldb_init(mem_ctx);
        if (ldb == NULL) {
                return NULL;
        }
-       
-       ret = ldb_connect(ldb, url, flags, options);
+
+       /* we want to use the existing event context if possible. This
+          relies on the fact that in smbd, everything is a child of
+          the main event_context */
+       ev = event_context_find(ldb);
+
+       ret = ldb_register_samba_handlers(ldb);
        if (ret == -1) {
                talloc_free(ldb);
                return NULL;
        }
 
-       w = talloc(ldb, struct ldb_wrap);
-       if (w == NULL) {
+       real_url = private_path(ldb, url);
+       if (real_url == NULL) {
+               talloc_free(ldb);
+               return NULL;
+       }
+       
+       ret = ldb_connect(ldb, real_url, flags, options);
+       if (ret == -1) {
                talloc_free(ldb);
                return NULL;
        }
 
-       w->ldb = ldb;
-       w->url = talloc_strdup(w, url);
+       talloc_free(real_url);
 
-       talloc_set_destructor(w, ldb_wrap_destructor);
        ldb_set_debug(ldb, ldb_wrap_debug, NULL);
 
-       DLIST_ADD(ldb_list, w);
-
        return ldb;
 }
 
@@ -135,7 +122,8 @@ static void tdb_wrap_log(TDB_CONTEXT *tdb, int level,
        va_end(ap);
        
        if (ptr != NULL) {
-               DEBUG(level, ("tdb(%s): %s", tdb->name ? tdb->name : "unnamed", ptr));
+               const char *name = tdb_name(tdb);
+               DEBUG(level, ("tdb(%s): %s", name ? name : "unnamed", ptr));
                free(ptr);
        }
 }