summaryrefslogtreecommitdiff
path: root/lib/tdb2/private.h
diff options
context:
space:
mode:
authorRusty Russell <rusty@rustcorp.com.au>2011-09-14 07:43:13 +0930
committerRusty Russell <rusty@rustcorp.com.au>2011-09-14 07:43:13 +0930
commitc16184f83b2fea59cd31ec968f0c6b7e06f9047b (patch)
treeea5604690ea72c3afe35b7e9c06c3b6042842266 /lib/tdb2/private.h
parent997592431f3e62cacef13d9b75a12a3d8058e7b7 (diff)
downloadsamba-c16184f83b2fea59cd31ec968f0c6b7e06f9047b.tar.gz
samba-c16184f83b2fea59cd31ec968f0c6b7e06f9047b.tar.bz2
samba-c16184f83b2fea59cd31ec968f0c6b7e06f9047b.zip
tdb2: merge tdb1_context into tdb_context.
Finally, we split out the tdb2-specific parts of tdb_context, and put them into a "tdb2" sub-struct; the tdb1 parts go into a "tdb1" sub-struct. We get rido of tdb1_context and use tdb_context everywhere. Signed-off-by: Rusty Russell <rusty@rustcorp.com.au> (Imported from CCAN commit bbeb528e74c0e234e1f724ac8d54be404cfc6f9a)
Diffstat (limited to 'lib/tdb2/private.h')
-rw-r--r--lib/tdb2/private.h161
1 files changed, 99 insertions, 62 deletions
diff --git a/lib/tdb2/private.h b/lib/tdb2/private.h
index 135589203c..4f09c58848 100644
--- a/lib/tdb2/private.h
+++ b/lib/tdb2/private.h
@@ -283,6 +283,9 @@ struct traverse_info {
tdb_off_t prev;
};
+typedef uint32_t tdb1_len_t;
+typedef uint32_t tdb1_off_t;
+
enum tdb_lock_flags {
/* WAIT == F_SETLKW, NOWAIT == F_SETLK */
TDB_LOCK_NOWAIT = 0,
@@ -333,68 +336,6 @@ struct tdb_file {
ino_t inode;
};
-struct tdb_context {
- /* Single list of all TDBs, to detect multiple opens. */
- struct tdb_context *next;
-
- /* Filename of the database. */
- const char *name;
-
- /* Logging function */
- void (*log_fn)(struct tdb_context *tdb,
- enum tdb_log_level level,
- enum TDB_ERROR ecode,
- const char *message,
- void *data);
- void *log_data;
-
- /* Last error we returned. */
- enum TDB_ERROR last_error;
-
- /* The actual file information */
- struct tdb_file *file;
-
- /* Open flags passed to tdb_open. */
- int open_flags;
-
- /* low level (fnctl) lock functions. */
- int (*lock_fn)(int fd, int rw, off_t off, off_t len, bool w, void *);
- int (*unlock_fn)(int fd, int rw, off_t off, off_t len, void *);
- void *lock_data;
-
- /* the flags passed to tdb_open. */
- uint32_t flags;
-
- /* Our statistics. */
- struct tdb_attribute_stats stats;
-
- /* Hash function. */
- uint64_t (*hash_fn)(const void *key, size_t len, uint64_t seed, void *);
- void *hash_data;
- uint64_t hash_seed;
-
- /* Are we accessing directly? (debugging check). */
- int direct_access;
-
- /* Set if we are in a transaction. */
- struct tdb_transaction *transaction;
-
- /* What free table are we using? */
- tdb_off_t ftable_off;
- unsigned int ftable;
-
- /* Our open hook, if any. */
- enum TDB_ERROR (*openhook)(int fd, void *data);
- void *openhook_data;
-
- /* IO methods: changes for transactions. */
- const struct tdb_methods *methods;
-
- /* Direct access information */
- struct tdb_access_hdr *access;
-
-};
-
struct tdb_methods {
enum TDB_ERROR (*tread)(struct tdb_context *, tdb_off_t, void *,
tdb_len_t);
@@ -600,6 +541,102 @@ int tdb_fcntl_unlock(int fd, int rw, off_t off, off_t len, void *);
enum TDB_ERROR tdb_transaction_recover(struct tdb_context *tdb);
tdb_bool_err tdb_needs_recovery(struct tdb_context *tdb);
+/* this is stored at the front of every database */
+struct tdb1_header {
+ char magic_food[32]; /* for /etc/magic */
+ uint32_t version; /* version of the code */
+ uint32_t hash_size; /* number of hash entries */
+ tdb1_off_t rwlocks; /* obsolete - kept to detect old formats */
+ tdb1_off_t recovery_start; /* offset of transaction recovery region */
+ tdb1_off_t sequence_number; /* used when TDB1_SEQNUM is set */
+ uint32_t magic1_hash; /* hash of TDB_MAGIC_FOOD. */
+ uint32_t magic2_hash; /* hash of TDB1_MAGIC. */
+ tdb1_off_t reserved[27];
+};
+
+struct tdb1_traverse_lock {
+ struct tdb1_traverse_lock *next;
+ uint32_t off;
+ uint32_t hash;
+ int lock_rw;
+};
+
+struct tdb_context {
+ /* Single list of all TDBs, to detect multiple opens. */
+ struct tdb_context *next;
+
+ /* Filename of the database. */
+ const char *name;
+
+ /* Logging function */
+ void (*log_fn)(struct tdb_context *tdb,
+ enum tdb_log_level level,
+ enum TDB_ERROR ecode,
+ const char *message,
+ void *data);
+ void *log_data;
+
+ /* Open flags passed to tdb_open. */
+ int open_flags;
+
+ /* low level (fnctl) lock functions. */
+ int (*lock_fn)(int fd, int rw, off_t off, off_t len, bool w, void *);
+ int (*unlock_fn)(int fd, int rw, off_t off, off_t len, void *);
+ void *lock_data;
+
+ /* the tdb flags passed to tdb_open. */
+ uint32_t flags;
+
+ /* Our statistics. */
+ struct tdb_attribute_stats stats;
+
+ /* The actual file information */
+ struct tdb_file *file;
+
+ /* Hash function. */
+ uint64_t (*hash_fn)(const void *key, size_t len, uint64_t seed, void *);
+ void *hash_data;
+ uint64_t hash_seed;
+
+ /* Our open hook, if any. */
+ enum TDB_ERROR (*openhook)(int fd, void *data);
+ void *openhook_data;
+
+ /* Last error we returned. */
+ enum TDB_ERROR last_error;
+
+ struct {
+
+ /* Are we accessing directly? (debugging check). */
+ int direct_access;
+
+ /* Set if we are in a transaction. */
+ struct tdb_transaction *transaction;
+
+ /* What free table are we using? */
+ tdb_off_t ftable_off;
+ unsigned int ftable;
+
+ /* IO methods: changes for transactions. */
+ const struct tdb_methods *io;
+
+ /* Direct access information */
+ struct tdb_access_hdr *access;
+ } tdb2;
+
+ struct {
+ int traverse_read; /* read-only traversal */
+ int traverse_write; /* read-write traversal */
+
+ struct tdb1_header header; /* a cached copy of the header */
+ struct tdb1_traverse_lock travlocks; /* current traversal locks */
+ const struct tdb1_methods *io;
+ struct tdb1_transaction *transaction;
+ int page_size;
+ int max_dead_records;
+ } tdb1;
+};
+
/* tdb.c: */
enum TDB_ERROR COLD tdb_logerr(struct tdb_context *tdb,
enum TDB_ERROR ecode,