s3-dbwrap: Add dbwrap_db_id
authorVolker Lendecke <vl@samba.org>
Wed, 15 Feb 2012 13:57:01 +0000 (14:57 +0100)
committerVolker Lendecke <vl@samba.org>
Fri, 20 Apr 2012 11:42:40 +0000 (13:42 +0200)
This returns a blob uniquely identifying the database

source3/lib/dbwrap/dbwrap.c
source3/lib/dbwrap/dbwrap.h
source3/lib/dbwrap/dbwrap_ctdb.c
source3/lib/dbwrap/dbwrap_private.h
source3/lib/dbwrap/dbwrap_rbt.c
source3/lib/dbwrap/dbwrap_tdb.c

index c78ee747a716ccee420af02dfafdee0cd2f01bf0..82b1c54ac453e4dbf91f37c8208e9f6ca990692e 100644 (file)
@@ -351,3 +351,8 @@ int dbwrap_transaction_cancel(struct db_context *db)
 {
        return db->transaction_cancel(db);
 }
+
+void dbwrap_db_id(struct db_context *db, const uint8_t **id, size_t *idlen)
+{
+       db->id(db, id, idlen);
+}
index 9981b6dfd9b5d60447af3b8b9c1bde0ca77b5c74..6fd5999a9d74696a600d6287a0d3cdc996378359 100644 (file)
@@ -62,6 +62,7 @@ int dbwrap_get_flags(struct db_context *db);
 int dbwrap_transaction_start(struct db_context *db);
 int dbwrap_transaction_commit(struct db_context *db);
 int dbwrap_transaction_cancel(struct db_context *db);
+void dbwrap_db_id(struct db_context *db, const uint8_t **id, size_t *idlen);
 
 
 /* The following definitions come from lib/dbwrap_util.c  */
index 3d08d1c86fae077a1b7ee14a731c6e9848d37244..0454e62e698e20cc7d98aad2661484b086b3dac1 100644 (file)
@@ -1490,6 +1490,16 @@ static int db_ctdb_get_flags(struct db_context *db)
        return tdb_get_flags(ctx->wtdb->tdb);
 }
 
+static void db_ctdb_id(struct db_context *db, const uint8_t **id,
+                      size_t *idlen)
+{
+       struct db_ctdb_ctx *ctx = talloc_get_type_abort(
+               db->private_data, struct db_ctdb_ctx);
+
+       *id = (uint8_t *)&ctx->db_id;
+       *idlen = sizeof(ctx->db_id);
+}
+
 struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
                                const char *name,
                                int hash_size, int tdb_flags,
@@ -1599,6 +1609,7 @@ struct db_context *db_open_ctdb(TALLOC_CTX *mem_ctx,
        result->transaction_start = db_ctdb_transaction_start;
        result->transaction_commit = db_ctdb_transaction_commit;
        result->transaction_cancel = db_ctdb_transaction_cancel;
+       result->id = db_ctdb_id;
 
        DEBUG(3,("db_open_ctdb: opened database '%s' with dbid 0x%x\n",
                 name, db_ctdb->db_id));
index f95e305a00ffc9ac34c40049fd651b214e0fbf85..b24e3b370c382270775b71bdac5d06f8ba3a309d 100644 (file)
@@ -58,6 +58,7 @@ struct db_context {
                                 void *private_data);
        int (*exists)(struct db_context *db,TDB_DATA key);
        int (*wipe)(struct db_context *db);
+       void (*id)(struct db_context *db, const uint8_t **id, size_t *idlen);
        void *private_data;
        enum dbwrap_lock_order lock_order;
        bool persistent;
index 95cd3e82e8e8c0a2072b7cdbd4268b00c85533bd..453efca7990b72cc52fef5660c2f92c51945472a 100644 (file)
@@ -408,6 +408,12 @@ static int db_rbt_trans_dummy(struct db_context *db)
        return 0;
 }
 
+static void db_rbt_id(struct db_context *db, const uint8_t **id, size_t *idlen)
+{
+       *id = (uint8_t *)db;
+       *idlen = sizeof(db);
+}
+
 struct db_context *db_open_rbt(TALLOC_CTX *mem_ctx)
 {
        struct db_context *result;
@@ -437,6 +443,7 @@ struct db_context *db_open_rbt(TALLOC_CTX *mem_ctx)
        result->wipe = db_rbt_wipe;
        result->parse_record = db_rbt_parse_record;
        result->lock_order = 0;
+       result->id = db_rbt_id;
 
        return result;
 }
index 59ed7910f70187f325cf3ae8c1ef6f2869d32ed5..e1b26e4e09d159e849c2e1b3da1dbe5c55fcf082 100644 (file)
 #include "dbwrap/dbwrap_tdb.h"
 #include "lib/tdb_wrap/tdb_wrap.h"
 #include "util_tdb.h"
+#include "system/filesys.h"
 
 struct db_tdb_ctx {
        struct tdb_wrap *wtdb;
+
+       struct {
+               dev_t dev;
+               ino_t ino;
+       } id;
 };
 
 static NTSTATUS db_tdb_store(struct db_record *rec, TDB_DATA data, int flag);
@@ -366,6 +372,14 @@ static int db_tdb_transaction_cancel(struct db_context *db)
        return 0;
 }
 
+static void db_tdb_id(struct db_context *db, const uint8_t **id, size_t *idlen)
+{
+       struct db_tdb_ctx *db_ctx =
+               talloc_get_type_abort(db->private_data, struct db_tdb_ctx);
+       *id = (uint8_t *)&db_ctx->id;
+       *idlen = sizeof(db_ctx->id);
+}
+
 struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
                               struct loadparm_context *lp_ctx,
                               const char *name,
@@ -375,6 +389,7 @@ struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
 {
        struct db_context *result = NULL;
        struct db_tdb_ctx *db_tdb;
+       struct stat st;
 
        result = talloc_zero(mem_ctx, struct db_context);
        if (result == NULL) {
@@ -396,6 +411,15 @@ struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
                goto fail;
        }
 
+       ZERO_STRUCT(db_tdb->id);
+
+       if (fstat(tdb_fd(db_tdb->wtdb->tdb), &st) == -1) {
+               DEBUG(3, ("fstat failed: %s\n", strerror(errno)));
+               goto fail;
+       }
+       db_tdb->id.dev = st.st_dev;
+       db_tdb->id.ino = st.st_ino;
+
        result->fetch_locked = db_tdb_fetch_locked;
        result->try_fetch_locked = db_tdb_try_fetch_locked;
        result->traverse = db_tdb_traverse;
@@ -409,6 +433,7 @@ struct db_context *db_open_tdb(TALLOC_CTX *mem_ctx,
        result->transaction_cancel = db_tdb_transaction_cancel;
        result->exists = db_tdb_exists;
        result->wipe = db_tdb_wipe;
+       result->id = db_tdb_id;
        return result;
 
  fail: