dbwrap: dbwrap_local_open()
authorRusty Russell <rusty@rustcorp.com.au>
Fri, 22 Jun 2012 05:37:43 +0000 (15:07 +0930)
committerRusty Russell <rusty@rustcorp.com.au>
Fri, 22 Jun 2012 05:35:17 +0000 (07:35 +0200)
This simply opens a tdb: it will eventually switch depending on the
extension.

Signed-off-by: Rusty Russell <rusty@rustcorp.com.au>
lib/dbwrap/dbwrap.h
lib/dbwrap/dbwrap_local_open.c [new file with mode: 0644]
lib/dbwrap/dbwrap_tdb.c
lib/dbwrap/wscript_build
source3/Makefile.in
source3/lib/dbwrap/dbwrap_open.c

index ef4ffc94d71b93ed0b79c37725c791d8b9da28a8..6c789e91a438c995e263ada8c09681b28b8d9bb3 100644 (file)
@@ -133,4 +133,18 @@ NTSTATUS dbwrap_store_bystring_upper(struct db_context *db, const char *key,
 NTSTATUS dbwrap_fetch_bystring_upper(struct db_context *db, TALLOC_CTX *mem_ctx,
                                     const char *key, TDB_DATA *value);
 
+/**
+ * This opens an ntdb or tdb file: you can hand it a .ntdb or .tdb extension
+ * and it will decide (based on parameter settings, or else what exists) which
+ * to use.
+ *
+ * For backwards compatibility, it takes tdb-style open flags, not ntdb!
+ */
+struct db_context *dbwrap_local_open(TALLOC_CTX *mem_ctx,
+                                    struct loadparm_context *lp_ctx,
+                                    const char *name,
+                                    int hash_size, int tdb_flags,
+                                    int open_flags, mode_t mode,
+                                    enum dbwrap_lock_order lock_order);
+
 #endif /* __DBWRAP_H__ */
diff --git a/lib/dbwrap/dbwrap_local_open.c b/lib/dbwrap/dbwrap_local_open.c
new file mode 100644 (file)
index 0000000..bb0df48
--- /dev/null
@@ -0,0 +1,70 @@
+/*
+   Unix SMB/CIFS implementation.
+   Database interface wrapper: local open code.
+
+   Copyright (C) Rusty Russell 2012
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include "includes.h"
+#include "dbwrap/dbwrap.h"
+#include "dbwrap/dbwrap_tdb.h"
+#include "tdb.h"
+#include "lib/util/util_ntdb.h"
+#include "lib/param/param.h"
+#include "system/filesys.h"
+#include "ccan/str/str.h"
+
+struct db_context *dbwrap_local_open(TALLOC_CTX *mem_ctx,
+                                    struct loadparm_context *lp_ctx,
+                                    const char *name,
+                                    int hash_size, int tdb_flags,
+                                    int open_flags, mode_t mode,
+                                    enum dbwrap_lock_order lock_order)
+{
+       TALLOC_CTX *tmp_ctx = talloc_new(mem_ctx);
+       const char *ntdbname, *tdbname;
+       struct db_context *db = NULL;
+
+       /* Get both .ntdb and .tdb variants of the name. */
+       if (!name) {
+               tdbname = ntdbname = "unnamed database";
+       } else if (strends(name, ".tdb")) {
+               tdbname = name;
+               ntdbname = talloc_asprintf(tmp_ctx,
+                                          "%.*s.ntdb",
+                                          (int)strlen(name) - 4, name);
+       } else if (strends(name, ".ntdb")) {
+               ntdbname = name;
+               tdbname = talloc_asprintf(tmp_ctx,
+                                         "%.*s.tdb",
+                                         (int)strlen(name) - 5, name);
+       } else {
+               ntdbname = tdbname = name;
+       }
+
+       if (ntdbname == NULL || tdbname == NULL) {
+               DEBUG(0, ("talloc failed\n"));
+               goto out;
+       }
+
+       /* We currently always open a tdb, not an ntdb. */
+       db = db_open_tdb(mem_ctx, lp_ctx, tdbname, hash_size,
+                        tdb_flags, open_flags, mode,
+                        lock_order);
+out:
+       talloc_free(tmp_ctx);
+       return db;
+}
index ece7b9d8b5f0c6335c7c0f842bb2bb2058ed0818..1452ff7e8acc1d78c371a3d14cfc2bec3604d51e 100644 (file)
@@ -24,6 +24,7 @@
 #include "lib/tdb_wrap/tdb_wrap.h"
 #include "lib/util/util_tdb.h"
 #include "system/filesys.h"
+#include "ccan/str/str.h"
 
 struct db_tdb_ctx {
        struct tdb_wrap *wtdb;
@@ -385,6 +386,12 @@ struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
        struct db_tdb_ctx *db_tdb;
        struct stat st;
 
+       /* Extra paranoia. */
+       if (name && strends(name, ".ntdb")) {
+               DEBUG(0, ("can't try to open %s with tdb!\n", name));
+               return NULL;
+       }
+
        result = talloc_zero(mem_ctx, struct db_context);
        if (result == NULL) {
                DEBUG(0, ("talloc failed\n"));
index d172efbb6ecc689480dd43410957b2691a7733ef..3b247b3b5b3ed1eed5d0b426f3421ecb9926ab58 100644 (file)
@@ -5,6 +5,7 @@ bld.SAMBA_LIBRARY('dbwrap',
                   dbwrap_rbt.c
                   dbwrap_cache.c
                   dbwrap_tdb.c
+                  dbwrap_local_open.c
                   ''',
                   deps='samba-util util_tdb errors tdb tdb-wrap',
                   private_library=True)
index d66f6bfd99e66602683a5a1485ebe500763a7716..abdeb72d624029f57fa9274972a1cd095be95dd0 100644 (file)
@@ -263,6 +263,7 @@ EXTRA_ALL_TARGETS = @EXTRA_ALL_TARGETS@
 TDB_LIB_OBJ = lib/util_tdb.o ../lib/util/util_tdb.o \
          ../lib/tdb_wrap/tdb_wrap.o \
          ../lib/dbwrap/dbwrap.o \
+         ../lib/dbwrap/dbwrap_local_open.o \
          lib/dbwrap/dbwrap_open.o \
          ../lib/dbwrap/dbwrap_tdb.o \
          lib/dbwrap/dbwrap_ctdb.o \
index b7e6bd586fbdfa8d87ee361eea0d625e66ee8e9c..e5adab7eaa100be9c7ae9fbb2e9efd3c4cd0a891 100644 (file)
@@ -119,9 +119,9 @@ struct db_context *db_open(TALLOC_CTX *mem_ctx,
 
        if (result == NULL) {
                struct loadparm_context *lp_ctx = loadparm_init_s3(mem_ctx, loadparm_s3_context());
-               result = db_open_tdb(mem_ctx, lp_ctx, name, hash_size,
-                                    tdb_flags, open_flags, mode,
-                                    lock_order);
+               result = dbwrap_local_open(mem_ctx, lp_ctx, name, hash_size,
+                                          tdb_flags, open_flags, mode,
+                                          lock_order);
                talloc_unlink(mem_ctx, lp_ctx);
        }
        return result;