r10253: a fairly large tdb cleanup and re-organise. Nearly all of this change
[samba.git] / source4 / lib / db_wrap.c
index 0ec1e378e60b5243f3a04dc385c2b2ba16880088..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"
 
-static struct ldb_wrap *ldb_list;
 static struct tdb_wrap *tdb_list;
 
 /*
@@ -55,53 +55,53 @@ 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;
-       ldb_close(w->ldb);
-       DLIST_REMOVE(ldb_list, w);
-       return 0;
-}                               
-
 /*
   wrapped connection to a ldb database
-  to close just talloc_free() the ldb_wrap pointer
+  to close just talloc_free() the returned ldb_context
  */
-struct ldb_wrap *ldb_wrap_connect(TALLOC_CTX *mem_ctx,
-                                 const char *url,
-                                 unsigned int flags,
-                                 const char *options[])
+struct ldb_context *ldb_wrap_connect(TALLOC_CTX *mem_ctx,
+                                    const char *url,
+                                    unsigned int flags,
+                                    const char *options[])
 {
-       struct ldb_wrap *w;
+       struct ldb_context *ldb;
+       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_init(mem_ctx);
+       if (ldb == NULL) {
+               return NULL;
        }
 
-       w = talloc(mem_ctx, struct ldb_wrap);
-       if (w == NULL) {
+       /* 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->url = talloc_strdup(w, url);
-
-       w->ldb = ldb_connect(url, flags, options);
-       if (w->ldb == NULL) {
-               talloc_free(w);
+       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;
        }
-       talloc_steal(w, w->ldb);
 
-       talloc_set_destructor(w, ldb_wrap_destructor);
-       ldb_set_debug(w->ldb, ldb_wrap_debug, NULL);
+       talloc_free(real_url);
 
-       DLIST_ADD(ldb_list, w);
+       ldb_set_debug(ldb, ldb_wrap_debug, NULL);
 
-       return w;
+       return ldb;
 }
 
 
@@ -122,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);
        }
 }