Blame lib/ext2fs/tdb.h

Packit a62e42
#ifndef __TDB_H__
Packit a62e42
#define __TDB_H__
Packit a62e42
Packit a62e42
/*
Packit a62e42
   Unix SMB/CIFS implementation.
Packit a62e42
Packit a62e42
   trivial database library
Packit a62e42
Packit a62e42
   Copyright (C) Andrew Tridgell 1999-2004
Packit a62e42
Packit a62e42
     ** NOTE! The following LGPL license applies to the tdb
Packit a62e42
     ** library. This does NOT imply that all of Samba is released
Packit a62e42
     ** under the LGPL
Packit a62e42
Packit a62e42
   This library is free software; you can redistribute it and/or
Packit a62e42
   modify it under the terms of the GNU Lesser General Public
Packit a62e42
   License as published by the Free Software Foundation; either
Packit a62e42
   version 2 of the License, or (at your option) any later version.
Packit a62e42
Packit a62e42
   This library is distributed in the hope that it will be useful,
Packit a62e42
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a62e42
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a62e42
   Lesser General Public License for more details.
Packit a62e42
Packit a62e42
   You should have received a copy of the GNU Lesser General Public
Packit a62e42
   License along with this library; if not, write to the Free Software
Packit a62e42
   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301  USA
Packit a62e42
*/
Packit a62e42
Packit a62e42
#ifdef  __cplusplus
Packit a62e42
extern "C" {
Packit a62e42
#endif
Packit a62e42
Packit a62e42
Packit a62e42
/* flags to tdb_store() */
Packit a62e42
#define TDB_REPLACE 1
Packit a62e42
#define TDB_INSERT 2
Packit a62e42
#define TDB_MODIFY 3
Packit a62e42
Packit a62e42
/* flags for tdb_open() */
Packit a62e42
#define TDB_DEFAULT 0 /* just a readability place holder */
Packit a62e42
#define TDB_CLEAR_IF_FIRST 1
Packit a62e42
#define TDB_INTERNAL 2 /* don't store on disk */
Packit a62e42
#define TDB_NOLOCK   4 /* don't do any locking */
Packit a62e42
#define TDB_NOMMAP   8 /* don't use mmap */
Packit a62e42
#define TDB_CONVERT 16 /* convert endian (internal use) */
Packit a62e42
#define TDB_BIGENDIAN 32 /* header is big-endian (internal use) */
Packit a62e42
#define TDB_NOSYNC   64 /* don't use synchronous transactions */
Packit a62e42
#define TDB_SEQNUM   128 /* maintain a sequence number */
Packit a62e42
Packit a62e42
#define TDB_ERRCODE(code, ret) ((tdb->ecode = (code)), ret)
Packit a62e42
Packit a62e42
/* error codes */
Packit a62e42
enum TDB_ERROR {TDB_SUCCESS=0, TDB_ERR_CORRUPT, TDB_ERR_IO, TDB_ERR_LOCK,
Packit a62e42
		TDB_ERR_OOM, TDB_ERR_EXISTS, TDB_ERR_NOLOCK, TDB_ERR_LOCK_TIMEOUT,
Packit a62e42
		TDB_ERR_NOEXIST, TDB_ERR_EINVAL, TDB_ERR_RDONLY};
Packit a62e42
Packit a62e42
/* debugging uses one of the following levels */
Packit a62e42
enum tdb_debug_level {TDB_DEBUG_FATAL = 0, TDB_DEBUG_ERROR,
Packit a62e42
		      TDB_DEBUG_WARNING, TDB_DEBUG_TRACE};
Packit a62e42
Packit a62e42
typedef struct TDB_DATA {
Packit a62e42
	unsigned char *dptr;
Packit a62e42
	size_t dsize;
Packit a62e42
} TDB_DATA;
Packit a62e42
Packit a62e42
#ifndef PRINTF_ATTRIBUTE
Packit a62e42
#if (__GNUC__ >= 3)
Packit a62e42
/** Use gcc attribute to check printf fns.  a1 is the 1-based index of
Packit a62e42
 * the parameter containing the format, and a2 the index of the first
Packit a62e42
 * argument. Note that some gcc 2.x versions don't handle this
Packit a62e42
 * properly **/
Packit a62e42
#define PRINTF_ATTRIBUTE(a1, a2) __attribute__ ((format (__printf__, a1, a2)))
Packit a62e42
#else
Packit a62e42
#define PRINTF_ATTRIBUTE(a1, a2)
Packit a62e42
#endif
Packit a62e42
#endif
Packit a62e42
Packit a62e42
/* ext2fs tdb renames */
Packit a62e42
#define tdb_open ext2fs_tdb_open
Packit a62e42
#define tdb_open_ex ext2fs_tdb_open_ex
Packit a62e42
#define tdb_set_max_dead ext2fs_tdb_set_max_dead
Packit a62e42
#define tdb_reopen ext2fs_tdb_reopen
Packit a62e42
#define tdb_reopen_all ext2fs_tdb_reopen_all
Packit a62e42
#define tdb_set_logging_function ext2fs_tdb_set_logging_function
Packit a62e42
#define tdb_error ext2fs_tdb_error
Packit a62e42
#define tdb_errorstr ext2fs_tdb_errorstr
Packit a62e42
#define tdb_fetch ext2fs_tdb_fetch
Packit a62e42
#define tdb_parse_record ext2fs_tdb_parse_record
Packit a62e42
#define tdb_delete ext2fs_tdb_delete
Packit a62e42
#define tdb_store ext2fs_tdb_store
Packit a62e42
#define tdb_append ext2fs_tdb_append
Packit a62e42
#define tdb_close ext2fs_tdb_close
Packit a62e42
#define tdb_firstkey ext2fs_tdb_firstkey
Packit a62e42
#define tdb_nextkey ext2fs_tdb_nextkey
Packit a62e42
#define tdb_traverse ext2fs_tdb_traverse
Packit a62e42
#define tdb_traverse_read ext2fs_tdb_traverse_read
Packit a62e42
#define tdb_exists ext2fs_tdb_exists
Packit a62e42
#define tdb_lockall ext2fs_tdb_lockall
Packit a62e42
#define tdb_unlockall ext2fs_tdb_unlockall
Packit a62e42
#define tdb_lockall_read ext2fs_tdb_lockall_read
Packit a62e42
#define tdb_unlockall_read ext2fs_tdb_unlockall_read
Packit a62e42
#define tdb_name ext2fs_tdb_name
Packit a62e42
#define tdb_fd ext2fs_tdb_fd
Packit a62e42
#define tdb_log_fn ext2fs_tdb_log_fn
Packit a62e42
#define tdb_get_logging_private ext2fs_tdb_get_logging_private
Packit a62e42
#define tdb_transaction_start ext2fs_tdb_transaction_start
Packit a62e42
#define tdb_transaction_commit ext2fs_tdb_transaction_commit
Packit a62e42
#define tdb_transaction_cancel ext2fs_tdb_transaction_cancel
Packit a62e42
#define tdb_transaction_recover ext2fs_tdb_transaction_recover
Packit a62e42
#define tdb_get_seqnum ext2fs_tdb_get_seqnum
Packit a62e42
#define tdb_hash_size ext2fs_tdb_hash_size
Packit a62e42
#define tdb_map_size ext2fs_tdb_map_size
Packit a62e42
#define tdb_get_flags ext2fs_tdb_get_flags
Packit a62e42
#define tdb_chainlock ext2fs_tdb_chainlock
Packit a62e42
#define tdb_chainunlock ext2fs_tdb_chainunlock
Packit a62e42
#define tdb_chainlock_read ext2fs_tdb_chainlock_read
Packit a62e42
#define tdb_chainunlock_read ext2fs_tdb_chainunlock_read
Packit a62e42
#define tdb_dump_all ext2fs_tdb_dump_all
Packit a62e42
#define tdb_printfreelist ext2fs_tdb_printfreelist
Packit a62e42
#define tdb_validate_freelist ext2fs_tdb_validate_freelist
Packit a62e42
#define tdb_chainlock_mark ext2fs_tdb_chainlock_mark
Packit a62e42
#define tdb_chainlock_nonblock ext2fs_tdb_chainlock_nonblock
Packit a62e42
#define tdb_chainlock_unmark ext2fs_tdb_chainlock_unmark
Packit a62e42
#define tdb_enable_seqnum ext2fs_tdb_enable_seqnum
Packit a62e42
#define tdb_increment_seqnum_nonblock ext2fs_tdb_increment_seqnum_nonblock
Packit a62e42
#define tdb_lock_nonblock ext2fs_tdb_lock_nonblock
Packit a62e42
#define tdb_lockall_mark ext2fs_tdb_lockall_mark
Packit a62e42
#define tdb_lockall_nonblock ext2fs_tdb_lockall_nonblock
Packit a62e42
#define tdb_lockall_read_nonblock ext2fs_tdb_lockall_read_nonblock
Packit a62e42
#define tdb_lockall_unmark ext2fs_tdb_lockall_unmark
Packit a62e42
#define tdb_flush ext2fs_tdb_flush
Packit a62e42
Packit a62e42
/* this is the context structure that is returned from a db open */
Packit a62e42
typedef struct tdb_context TDB_CONTEXT;
Packit a62e42
Packit a62e42
typedef int (*tdb_traverse_func)(struct tdb_context *, TDB_DATA, TDB_DATA, void *);
Packit a62e42
typedef void (*tdb_log_func)(struct tdb_context *, enum tdb_debug_level, const char *, ...) PRINTF_ATTRIBUTE(3, 4);
Packit a62e42
typedef unsigned int (*tdb_hash_func)(TDB_DATA *key);
Packit a62e42
Packit a62e42
struct tdb_logging_context {
Packit a62e42
        tdb_log_func log_fn;
Packit a62e42
        void *log_private;
Packit a62e42
};
Packit a62e42
Packit a62e42
struct tdb_context *tdb_open(const char *name, int hash_size, int tdb_flags,
Packit a62e42
		      int open_flags, mode_t mode);
Packit a62e42
struct tdb_context *tdb_open_ex(const char *name, int hash_size, int tdb_flags,
Packit a62e42
			 int open_flags, mode_t mode,
Packit a62e42
			 const struct tdb_logging_context *log_ctx,
Packit a62e42
			 tdb_hash_func hash_fn);
Packit a62e42
void tdb_set_max_dead(struct tdb_context *tdb, int max_dead);
Packit a62e42
Packit a62e42
int tdb_reopen(struct tdb_context *tdb);
Packit a62e42
int tdb_reopen_all(int parent_longlived);
Packit a62e42
void tdb_set_logging_function(struct tdb_context *tdb, const struct tdb_logging_context *log_ctx);
Packit a62e42
enum TDB_ERROR tdb_error(struct tdb_context *tdb);
Packit a62e42
const char *tdb_errorstr(struct tdb_context *tdb);
Packit a62e42
TDB_DATA tdb_fetch(struct tdb_context *tdb, TDB_DATA key);
Packit a62e42
int tdb_parse_record(struct tdb_context *tdb, TDB_DATA key,
Packit a62e42
		     int (*parser)(TDB_DATA key, TDB_DATA data,
Packit a62e42
				   void *private_data),
Packit a62e42
		     void *private_data);
Packit a62e42
int tdb_delete(struct tdb_context *tdb, TDB_DATA key);
Packit a62e42
int tdb_store(struct tdb_context *tdb, TDB_DATA key, TDB_DATA dbuf, int flag);
Packit a62e42
int tdb_append(struct tdb_context *tdb, TDB_DATA key, TDB_DATA new_dbuf);
Packit a62e42
int tdb_close(struct tdb_context *tdb);
Packit a62e42
TDB_DATA tdb_firstkey(struct tdb_context *tdb);
Packit a62e42
TDB_DATA tdb_nextkey(struct tdb_context *tdb, TDB_DATA key);
Packit a62e42
int tdb_traverse(struct tdb_context *tdb, tdb_traverse_func fn, void *);
Packit a62e42
int tdb_traverse_read(struct tdb_context *tdb, tdb_traverse_func fn, void *);
Packit a62e42
int tdb_exists(struct tdb_context *tdb, TDB_DATA key);
Packit a62e42
int tdb_lockall(struct tdb_context *tdb);
Packit a62e42
int tdb_lockall_nonblock(struct tdb_context *tdb);
Packit a62e42
int tdb_unlockall(struct tdb_context *tdb);
Packit a62e42
int tdb_lockall_read(struct tdb_context *tdb);
Packit a62e42
int tdb_lockall_read_nonblock(struct tdb_context *tdb);
Packit a62e42
int tdb_unlockall_read(struct tdb_context *tdb);
Packit a62e42
int tdb_lockall_mark(struct tdb_context *tdb);
Packit a62e42
int tdb_lockall_unmark(struct tdb_context *tdb);
Packit a62e42
const char *tdb_name(struct tdb_context *tdb);
Packit a62e42
int tdb_fd(struct tdb_context *tdb);
Packit a62e42
tdb_log_func tdb_log_fn(struct tdb_context *tdb);
Packit a62e42
void *tdb_get_logging_private(struct tdb_context *tdb);
Packit a62e42
int tdb_transaction_start(struct tdb_context *tdb);
Packit a62e42
int tdb_transaction_commit(struct tdb_context *tdb);
Packit a62e42
int tdb_transaction_cancel(struct tdb_context *tdb);
Packit a62e42
int tdb_transaction_recover(struct tdb_context *tdb);
Packit a62e42
int tdb_get_seqnum(struct tdb_context *tdb);
Packit a62e42
int tdb_hash_size(struct tdb_context *tdb);
Packit a62e42
size_t tdb_map_size(struct tdb_context *tdb);
Packit a62e42
int tdb_get_flags(struct tdb_context *tdb);
Packit a62e42
void tdb_enable_seqnum(struct tdb_context *tdb);
Packit a62e42
void tdb_increment_seqnum_nonblock(struct tdb_context *tdb);
Packit a62e42
int tdb_flush(struct tdb_context *tdb);
Packit a62e42
Packit a62e42
/* Low level locking functions: use with care */
Packit a62e42
int tdb_chainlock(struct tdb_context *tdb, TDB_DATA key);
Packit a62e42
int tdb_chainlock_nonblock(struct tdb_context *tdb, TDB_DATA key);
Packit a62e42
int tdb_chainunlock(struct tdb_context *tdb, TDB_DATA key);
Packit a62e42
int tdb_chainlock_read(struct tdb_context *tdb, TDB_DATA key);
Packit a62e42
int tdb_chainunlock_read(struct tdb_context *tdb, TDB_DATA key);
Packit a62e42
int tdb_chainlock_mark(struct tdb_context *tdb, TDB_DATA key);
Packit a62e42
int tdb_chainlock_unmark(struct tdb_context *tdb, TDB_DATA key);
Packit a62e42
Packit a62e42
/* Debug functions. Not used in production. */
Packit a62e42
void tdb_dump_all(struct tdb_context *tdb);
Packit a62e42
int tdb_printfreelist(struct tdb_context *tdb);
Packit a62e42
int tdb_validate_freelist(struct tdb_context *tdb, int *pnum_entries);
Packit a62e42
Packit a62e42
#ifdef  __cplusplus
Packit a62e42
}
Packit a62e42
#endif
Packit a62e42
Packit a62e42
#endif /* tdb.h */