2 Unix SMB/CIFS implementation.
4 database wrap functions
6 Copyright (C) Andrew Tridgell 2004
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 2 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
24 the stupidity of the unix fcntl locking design forces us to never
25 allow a database file to be opened twice in the same process. These
26 wrappers provide convenient access to a tdb or ldb, taking advantage
27 of talloc destructors to ensure that only a single open is done
31 #include "dlinklist.h"
32 #include "lib/events/events.h"
33 #include "lib/tdb/include/tdb.h"
34 #include "lib/ldb/include/ldb.h"
37 static struct tdb_wrap
*tdb_list
;
40 this is used to catch debug messages from ldb
42 static void ldb_wrap_debug(void *context
, enum ldb_debug_level level
,
43 const char *fmt
, va_list ap
) PRINTF_ATTRIBUTE(3,0);
45 static void ldb_wrap_debug(void *context
, enum ldb_debug_level level
,
46 const char *fmt
, va_list ap
)
49 if (DEBUGLEVEL
< 4 && level
> LDB_DEBUG_WARNING
) {
52 vasprintf(&s
, fmt
, ap
);
54 DEBUG(level
, ("ldb: %s\n", s
));
59 wrapped connection to a ldb database
60 to close just talloc_free() the returned ldb_context
62 struct ldb_context
*ldb_wrap_connect(TALLOC_CTX
*mem_ctx
,
65 const char *options
[])
67 struct ldb_context
*ldb
;
69 struct event_context
*ev
;
70 char *real_url
= NULL
;
72 ldb
= ldb_init(mem_ctx
);
77 /* we want to use the existing event context if possible. This
78 relies on the fact that in smbd, everything is a child of
79 the main event_context */
80 ev
= event_context_find(ldb
);
82 ret
= ldb_register_samba_handlers(ldb
);
88 real_url
= private_path(ldb
, url
);
89 if (real_url
== NULL
) {
94 /* allow admins to force non-sync ldb for all databases */
95 if (lp_parm_bool(-1, "ldb", "nosync", False
)) {
96 flags
|= LDB_FLG_NOSYNC
;
99 ret
= ldb_connect(ldb
, real_url
, flags
, options
);
105 talloc_free(real_url
);
107 ldb_set_debug(ldb
, ldb_wrap_debug
, NULL
);
114 Log tdb messages via DEBUG().
116 static void tdb_wrap_log(TDB_CONTEXT
*tdb
, int level
,
117 const char *format
, ...) PRINTF_ATTRIBUTE(3,4);
119 static void tdb_wrap_log(TDB_CONTEXT
*tdb
, int level
,
120 const char *format
, ...)
125 va_start(ap
, format
);
126 vasprintf(&ptr
, format
, ap
);
130 const char *name
= tdb_name(tdb
);
131 DEBUG(level
, ("tdb(%s): %s", name
? name
: "unnamed", ptr
));
137 /* destroy the last connection to a tdb */
138 static int tdb_wrap_destructor(void *ctx
)
140 struct tdb_wrap
*w
= ctx
;
142 DLIST_REMOVE(tdb_list
, w
);
147 wrapped connection to a tdb database
148 to close just talloc_free() the tdb_wrap pointer
150 struct tdb_wrap
*tdb_wrap_open(TALLOC_CTX
*mem_ctx
,
151 const char *name
, int hash_size
, int tdb_flags
,
152 int open_flags
, mode_t mode
)
156 for (w
=tdb_list
;w
;w
=w
->next
) {
157 if (strcmp(name
, w
->name
) == 0) {
158 return talloc_reference(mem_ctx
, w
);
162 w
= talloc(mem_ctx
, struct tdb_wrap
);
167 w
->name
= talloc_strdup(w
, name
);
169 w
->tdb
= tdb_open_ex(name
, hash_size
, tdb_flags
,
170 open_flags
, mode
, tdb_wrap_log
, NULL
);
171 if (w
->tdb
== NULL
) {
176 talloc_set_destructor(w
, tdb_wrap_destructor
);
178 DLIST_ADD(tdb_list
, w
);