#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;
/*
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
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;
}
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);
}
}