1#ifndef _SLMDB_H_INCLUDED_
2#define _SLMDB_H_INCLUDED_
3
4/*++
5/* NAME
6/*	slmdb 3h
7/* SUMMARY
8/*	LMDB API wrapper
9/* SYNOPSIS
10/*	#include <slmdb.h>
11/* DESCRIPTION
12/* .nf
13
14 /*
15  * System library.
16  */
17#include <setjmp.h>
18
19#ifdef PATH_LMDB_H
20#include PATH_LMDB_H
21#else
22#include <lmdb.h>
23#endif
24
25 /*
26  * External interface.
27  */
28#ifdef NO_SIGSETJMP
29#define SLMDB_JMP_BUF jmp_buf
30#else
31#define SLMDB_JMP_BUF sigjmp_buf
32#endif
33
34 /*
35  * All data structure members are private.
36  */
37typedef struct {
38    size_t  curr_limit;			/* database soft size limit */
39    int     size_incr;			/* database expansion factor */
40    size_t  hard_limit;			/* database hard size limit */
41    int     open_flags;			/* open() flags */
42    int     lmdb_flags;			/* LMDB-specific flags */
43    int     slmdb_flags;		/* bulk-mode flag */
44    MDB_env *env;			/* database environment */
45    MDB_dbi dbi;			/* database instance */
46    MDB_txn *txn;			/* bulk transaction */
47    int     db_fd;			/* database file handle */
48    MDB_cursor *cursor;			/* iterator */
49    MDB_val saved_key;			/* saved cursor key buffer */
50    size_t  saved_key_size;		/* saved cursor key buffer size */
51    void    (*longjmp_fn) (void *, int);/* exception handling */
52    void    (*notify_fn) (void *, int,...);	/* workaround notification */
53    void    (*assert_fn) (void *, const char *);	/* assert notification */
54    void   *cb_context;			/* call-back context */
55    int     api_retry_count;		/* slmdb(3) API call retry count */
56    int     bulk_retry_count;		/* bulk_mode retry count */
57    int     api_retry_limit;		/* slmdb(3) API call retry limit */
58    int     bulk_retry_limit;		/* bulk_mode retry limit */
59} SLMDB;
60
61#define SLMDB_FLAG_BULK		(1 << 0)
62
63extern int slmdb_init(SLMDB *, size_t, int, size_t);
64extern int slmdb_open(SLMDB *, const char *, int, int, int);
65extern int slmdb_get(SLMDB *, MDB_val *, MDB_val *);
66extern int slmdb_put(SLMDB *, MDB_val *, MDB_val *, int);
67extern int slmdb_del(SLMDB *, MDB_val *);
68extern int slmdb_cursor_get(SLMDB *, MDB_val *, MDB_val *, MDB_cursor_op);
69extern int slmdb_control(SLMDB *, int,...);
70extern int slmdb_close(SLMDB *);
71
72#define slmdb_fd(slmdb)			((slmdb)->db_fd)
73#define slmdb_curr_limit(slmdb)		((slmdb)->curr_limit)
74
75#define SLMDB_CTL_END		0
76#define SLMDB_CTL_LONGJMP_FN	1	/* exception handling */
77#define SLMDB_CTL_NOTIFY_FN	2	/* debug logging function */
78#define SLMDB_CTL_CB_CONTEXT	3	/* call-back context */
79#define SLMDB_CTL_HARD_LIMIT	4	/* hard database size limit */
80#define SLMDB_CTL_API_RETRY_LIMIT	5	/* per slmdb(3) API call */
81#define SLMDB_CTL_BULK_RETRY_LIMIT	6	/* per bulk update */
82#define SLMDB_CTL_ASSERT_FN	7	/* report assertion failure */
83
84typedef void (*SLMDB_NOTIFY_FN) (void *, int,...);
85typedef void (*SLMDB_LONGJMP_FN) (void *, int);
86typedef void (*SLMDB_ASSERT_FN) (void *, const char *);
87
88/* LICENSE
89/* .ad
90/* .fi
91/*	The Secure Mailer license must be distributed with this software.
92/* AUTHOR(S)
93/*	Howard Chu
94/*	Symas Corporation
95/*--*/
96
97#endif
98