#ifndef _SMDB_H_
# define _SMDB_H_
# include <sys/types.h>
# include <sys/stat.h>
# include <sm/gen.h>
# include <sm/errstring.h>
# ifdef NDBM
# include <ndbm.h>
# endif
# ifdef NEWDB
# include "sm/bdb.h"
# endif
#define SMDB_MAX_USER_NAME_LEN 1024
typedef struct database_struct SMDB_DATABASE;
typedef struct cursor_struct SMDB_CURSOR;
typedef struct entry_struct SMDB_DBENT;
typedef int (*db_close_func) __P((SMDB_DATABASE *db));
typedef int (*db_del_func) __P((SMDB_DATABASE *db,
SMDB_DBENT *key, unsigned int flags));
typedef int (*db_fd_func) __P((SMDB_DATABASE *db, int* fd));
typedef int (*db_get_func) __P((SMDB_DATABASE *db,
SMDB_DBENT *key,
SMDB_DBENT *data, unsigned int flags));
typedef int (*db_put_func) __P((SMDB_DATABASE *db,
SMDB_DBENT *key,
SMDB_DBENT *data, unsigned int flags));
typedef int (*db_sync_func) __P((SMDB_DATABASE *db, unsigned int flags));
typedef int (*db_set_owner_func) __P((SMDB_DATABASE *db, uid_t uid, gid_t gid));
typedef int (*db_cursor_func) __P((SMDB_DATABASE *db,
SMDB_CURSOR **cursor, unsigned int flags));
typedef int (*db_lockfd_func) __P((SMDB_DATABASE *db));
struct database_struct
{
db_close_func smdb_close;
db_del_func smdb_del;
db_fd_func smdb_fd;
db_get_func smdb_get;
db_put_func smdb_put;
db_sync_func smdb_sync;
db_set_owner_func smdb_set_owner;
db_cursor_func smdb_cursor;
db_lockfd_func smdb_lockfd;
void *smdb_impl;
};
typedef int (*db_cursor_close_func) __P((SMDB_CURSOR *cursor));
typedef int (*db_cursor_del_func) __P((SMDB_CURSOR *cursor,
unsigned int flags));
typedef int (*db_cursor_get_func) __P((SMDB_CURSOR *cursor,
SMDB_DBENT *key,
SMDB_DBENT *data,
unsigned int flags));
#define SMDB_CURSOR_GET_FIRST 0
#define SMDB_CURSOR_GET_LAST 1
#define SMDB_CURSOR_GET_NEXT 2
#define SMDB_CURSOR_GET_RANGE 3
typedef int (*db_cursor_put_func) __P((SMDB_CURSOR *cursor,
SMDB_DBENT *key,
SMDB_DBENT *data,
unsigned int flags));
struct cursor_struct
{
db_cursor_close_func smdbc_close;
db_cursor_del_func smdbc_del;
db_cursor_get_func smdbc_get;
db_cursor_put_func smdbc_put;
void *smdbc_impl;
};
struct database_params_struct
{
unsigned int smdbp_num_elements;
unsigned int smdbp_cache_size;
bool smdbp_allow_dup;
};
typedef struct database_params_struct SMDB_DBPARAMS;
struct database_user_struct
{
uid_t smdbu_id;
gid_t smdbu_group_id;
char smdbu_name[SMDB_MAX_USER_NAME_LEN];
};
typedef struct database_user_struct SMDB_USER_INFO;
struct entry_struct
{
void *data;
size_t size;
};
typedef char *SMDB_DBTYPE;
typedef unsigned int SMDB_FLAG;
# define SMDB_TYPE_DEFAULT NULL
# define SMDB_TYPE_DEFAULT_LEN 0
# define SMDB_TYPE_HASH "hash"
# define SMDB_TYPE_HASH_LEN 5
# define SMDB_TYPE_BTREE "btree"
# define SMDB_TYPE_BTREE_LEN 6
# define SMDB_TYPE_NDBM "dbm"
# define SMDB_TYPE_NDBM_LEN 4
# define SMDBF_NO_OVERWRITE 0x00000001
# define SMDBF_ALLOW_DUP 0x00000002
extern SMDB_DATABASE *smdb_malloc_database __P((void));
extern void smdb_free_database __P((SMDB_DATABASE *));
extern int smdb_open_database __P((SMDB_DATABASE **, char *, int,
int, long, SMDB_DBTYPE,
SMDB_USER_INFO *,
SMDB_DBPARAMS *));
# ifdef NEWDB
extern int smdb_db_open __P((SMDB_DATABASE **, char *, int, int,
long, SMDB_DBTYPE, SMDB_USER_INFO *,
SMDB_DBPARAMS *));
# endif
# ifdef NDBM
extern int smdb_ndbm_open __P((SMDB_DATABASE **, char *, int, int,
long, SMDB_DBTYPE,
SMDB_USER_INFO *,
SMDB_DBPARAMS *));
# endif
extern int smdb_add_extension __P((char *, int, char *, char *));
extern int smdb_setup_file __P((char *, char *, int, long,
SMDB_USER_INFO *, struct stat *));
extern int smdb_lock_file __P((int *, char *, int, long, char *));
extern int smdb_unlock_file __P((int));
extern int smdb_filechanged __P((char *, char *, int,
struct stat *));
extern void smdb_print_available_types __P((void));
extern char *smdb_db_definition __P((SMDB_DBTYPE));
extern int smdb_lock_map __P((SMDB_DATABASE *, int));
extern int smdb_unlock_map __P((SMDB_DATABASE *));
#endif