summaryrefslogtreecommitdiff
path: root/lib/tdb/include/tdb.h
blob: 08b6b3ab55f4c037ada7f07a9211be795ff4a932 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#ifndef __TDB_H__
#define __TDB_H__

/* 
   Unix SMB/CIFS implementation.

   trivial database library

   Copyright (C) Andrew Tridgell 1999-2004
   
     ** NOTE! The following LGPL license applies to the tdb
     ** library. This does NOT imply that all of Samba is released
     ** under the LGPL
   
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
   License as published by the Free Software Foundation; either
   version 3 of the License, or (at your option) any later version.

   This library 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
   Lesser General Public License for more details.

   You should have received a copy of the GNU Lesser General Public
   License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/

#ifdef  __cplusplus
extern "C" {
#endif

#include "signal.h"

/* flags to tdb_store() */
#define TDB_REPLACE 1		/* Unused */
#define TDB_INSERT 2 		/* Don't overwrite an existing entry */
#define TDB_MODIFY 3		/* Don't create an existing entry    */

/* flags for tdb_open() */
#define TDB_DEFAULT 0 /* just a readability place holder */
#define TDB_CLEAR_IF_FIRST 1
#define TDB_INTERNAL 2 /* don't store on disk */
#define TDB_NOLOCK   4 /* don't do any locking */
#define TDB_NOMMAP   8 /* don't use mmap */
#define TDB_CONVERT 16 /* convert endian (internal use) */
#define TDB_BIGENDIAN 32 /* header is big-endian (internal use) */
#define TDB_NOSYNC   64 /* don't use synchronous transactions */
#define TDB_SEQNUM   128 /* maintain a sequence number */
#define TDB_VOLATILE   256 /* Activate the per-hashchain freelist, default 5 */
#define TDB_ALLOW_NESTING 512 /* Allow transactions to nest */
#define TDB_DISALLOW_NESTING 1024 /* Disallow transactions to nest */

/* error codes */
enum TDB_ERROR {TDB_SUCCESS=0, TDB_ERR_CORRUPT, TDB_ERR_IO, TDB_ERR_LOCK, 
		TDB_ERR_OOM, TDB_ERR_EXISTS, TDB_ERR_NOLOCK, TDB_ERR_LOCK_TIMEOUT,
		TDB_ERR_NOEXIST, TDB_ERR_EINVAL, TDB_ERR_RDONLY,
		TDB_ERR_NESTING};

/* debugging uses one of the following levels */
enum tdb_debug_level {TDB_DEBUG_FATAL = 0, TDB_DEBUG_ERROR, 
		      TDB_DEBUG_WARNING, TDB_DEBUG_TRACE};

typedef struct TDB_DATA {
	unsigned char *dptr;
	size_t dsize;
} TDB_DATA;

#ifndef PRINTF_ATTRIBUTE
#if (__GNUC__ >= 3)
/** Use gcc attribute to check printf fns.  a1 is the 1-based index of
 * the parameter containing the format, and a2 the index of the first
 * argument. Note that some gcc 2.x versions don't handle this
 * properly **/
#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
#else
#define PRINTF_ATTRIBUTE(a1, a2)
#endif
#endif

/* this is the context structure that is returned from a db open */
typedef struct tdb_context TDB_CONTEXT;

typedef int (*tdb_traverse_func)(struct tdb_context *, TDB_DATA, TDB_DATA, void *);
typedef void (*tdb_log_func)(struct tdb_context *, enum tdb_debug_level, const char *, ...) PRINTF_ATTRIBUTE(3, 4);
typedef unsigned int (*tdb_hash_func)(TDB_DATA *key);

struct tdb_logging_context {
        tdb_log_func log_fn;
        void *log_private;
};

_PUBLIC_ struct tdb_context *tdb_open(const char *name, int hash_size, int tdb_flags,
		      int open_flags, mode_t mode);
_PUBLIC_ struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
			 int open_flags, mode_t mode,
			 const struct tdb_logging_context *log_ctx,
			 tdb_hash_func hash_fn);
_PUBLIC_ void tdb_set_max_dead(struct tdb_context *tdb, int max_dead);

_PUBLIC_ int tdb_reopen(struct tdb_context *tdb);
_PUBLIC_ int tdb_reopen_all(int parent_longlived);
_PUBLIC_ void tdb_set_logging_function(struct tdb_context *tdb, const struct tdb_logging_context *log_ctx);
_PUBLIC_ enum TDB_ERROR tdb_error(struct tdb_context *tdb);
_PUBLIC_ const char *tdb_errorstr(struct tdb_context *tdb);
_PUBLIC_ TDB_DATA tdb_fetch(struct tdb_context *tdb, TDB_DATA key);
_PUBLIC_ int tdb_parse_record(struct tdb_context *tdb, TDB_DATA key,
			      int (*parser)(TDB_DATA key, TDB_DATA data,
					    void *private_data),
			      void *private_data);
_PUBLIC_ int tdb_delete(struct tdb_context *tdb, TDB_DATA key);
_PUBLIC_ int tdb_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, int flag);
_PUBLIC_ int tdb_append(struct tdb_context *tdb, TDB_DATA key, TDB_DATA new_dbuf);
_PUBLIC_ int tdb_close(struct tdb_context *tdb);
_PUBLIC_ TDB_DATA tdb_firstkey(struct tdb_context *tdb);
_PUBLIC_ TDB_DATA tdb_nextkey(struct tdb_context *tdb, TDB_DATA key);
_PUBLIC_ int tdb_traverse(struct tdb_context *tdb, tdb_traverse_func fn, void *);
_PUBLIC_ int tdb_traverse_read(struct tdb_context *tdb, tdb_traverse_func fn, void *);
_PUBLIC_ int tdb_exists(struct tdb_context *tdb, TDB_DATA key);
_PUBLIC_ int tdb_lockall(struct tdb_context *tdb);
_PUBLIC_ int tdb_lockall_nonblock(struct tdb_context *tdb);
_PUBLIC_ int tdb_unlockall(struct tdb_context *tdb);
_PUBLIC_ int tdb_lockall_read(struct tdb_context *tdb);
_PUBLIC_ int tdb_lockall_read_nonblock(struct tdb_context *tdb);
_PUBLIC_ int tdb_unlockall_read(struct tdb_context *tdb);
_PUBLIC_ int tdb_lockall_mark(struct tdb_context *tdb);
_PUBLIC_ int tdb_lockall_unmark(struct tdb_context *tdb);
_PUBLIC_ const char *tdb_name(struct tdb_context *tdb);
_PUBLIC_ int tdb_fd(struct tdb_context *tdb);
_PUBLIC_ tdb_log_func tdb_log_fn(struct tdb_context *tdb);
_PUBLIC_ void *tdb_get_logging_private(struct tdb_context *tdb);
_PUBLIC_ int tdb_transaction_start(struct tdb_context *tdb);
_PUBLIC_ int tdb_transaction_start_nonblock(struct tdb_context *tdb);
_PUBLIC_ int tdb_transaction_prepare_commit(struct tdb_context *tdb);
_PUBLIC_ int tdb_transaction_commit(struct tdb_context *tdb);
_PUBLIC_ int tdb_transaction_cancel(struct tdb_context *tdb);
_PUBLIC_ int tdb_get_seqnum(struct tdb_context *tdb);
_PUBLIC_ int tdb_hash_size(struct tdb_context *tdb);
_PUBLIC_ size_t tdb_map_size(struct tdb_context *tdb);
_PUBLIC_ int tdb_get_flags(struct tdb_context *tdb);
_PUBLIC_ void tdb_add_flags(struct tdb_context *tdb, unsigned flag);
_PUBLIC_ void tdb_remove_flags(struct tdb_context *tdb, unsigned flag);
_PUBLIC_ void tdb_enable_seqnum(struct tdb_context *tdb);
_PUBLIC_ void tdb_increment_seqnum_nonblock(struct tdb_context *tdb);
_PUBLIC_ unsigned int tdb_jenkins_hash(TDB_DATA *key);
_PUBLIC_ int tdb_check(struct tdb_context *tdb,
	      int (*check) (TDB_DATA key, TDB_DATA data, void *private_data),
	      void *private_data);

/* Low level locking functions: use with care */
_PUBLIC_ int tdb_chainlock(struct tdb_context *tdb, TDB_DATA key);
_PUBLIC_ int tdb_chainlock_nonblock(struct tdb_context *tdb, TDB_DATA key);
_PUBLIC_ int tdb_chainunlock(struct tdb_context *tdb, TDB_DATA key);
_PUBLIC_ int tdb_chainlock_read(struct tdb_context *tdb, TDB_DATA key);
_PUBLIC_ int tdb_chainunlock_read(struct tdb_context *tdb, TDB_DATA key);
_PUBLIC_ int tdb_chainlock_mark(struct tdb_context *tdb, TDB_DATA key);
_PUBLIC_ int tdb_chainlock_unmark(struct tdb_context *tdb, TDB_DATA key);

_PUBLIC_ void tdb_setalarm_sigptr(struct tdb_context *tdb, volatile sig_atomic_t *sigptr);

/* wipe and repack */
_PUBLIC_ int tdb_wipe_all(struct tdb_context *tdb);
_PUBLIC_ int tdb_repack(struct tdb_context *tdb);

/* Debug functions. Not used in production. */
_PUBLIC_ void tdb_dump_all(struct tdb_context *tdb);
_PUBLIC_ int tdb_printfreelist(struct tdb_context *tdb);
_PUBLIC_ int tdb_validate_freelist(struct tdb_context *tdb, int *pnum_entries);
_PUBLIC_ int tdb_freelist_size(struct tdb_context *tdb);

_PUBLIC_ extern TDB_DATA tdb_null;

#ifdef  __cplusplus
}
#endif

#endif /* tdb.h */