#ifndef _SLMDB_H_INCLUDED_
#define _SLMDB_H_INCLUDED_
#include <setjmp.h>
#ifdef PATH_LMDB_H
#include PATH_LMDB_H
#else
#include <lmdb.h>
#endif
#include <check_arg.h>
#ifdef NO_SIGSETJMP
#define SLMDB_JMP_BUF jmp_buf
#else
#define SLMDB_JMP_BUF sigjmp_buf
#endif
typedef struct {
size_t curr_limit;
int size_incr;
size_t hard_limit;
int open_flags;
int lmdb_flags;
int slmdb_flags;
MDB_env *env;
MDB_dbi dbi;
MDB_txn *txn;
int db_fd;
MDB_cursor *cursor;
MDB_val saved_key;
size_t saved_key_size;
void (*longjmp_fn) (void *, int);
void (*notify_fn) (void *, int,...);
void (*assert_fn) (void *, const char *);
void *cb_context;
int api_retry_count;
int bulk_retry_count;
int api_retry_limit;
int bulk_retry_limit;
} SLMDB;
#define SLMDB_FLAG_BULK (1 << 0)
extern int slmdb_init(SLMDB *, size_t, int, size_t);
extern int slmdb_open(SLMDB *, const char *, int, int, int);
extern int slmdb_get(SLMDB *, MDB_val *, MDB_val *);
extern int slmdb_put(SLMDB *, MDB_val *, MDB_val *, int);
extern int slmdb_del(SLMDB *, MDB_val *);
extern int slmdb_cursor_get(SLMDB *, MDB_val *, MDB_val *, MDB_cursor_op);
extern int slmdb_control(SLMDB *, int,...);
extern int slmdb_close(SLMDB *);
#define slmdb_fd(slmdb) ((slmdb)->db_fd)
#define slmdb_curr_limit(slmdb) ((slmdb)->curr_limit)
#define SLMDB_CTL_END 0
#define SLMDB_CTL_LONGJMP_FN 1
#define SLMDB_CTL_NOTIFY_FN 2
#define SLMDB_CTL_CB_CONTEXT 3
#define SLMDB_CTL_API_RETRY_LIMIT 5
#define SLMDB_CTL_BULK_RETRY_LIMIT 6
#define SLMDB_CTL_ASSERT_FN 7
#define CA_SLMDB_CTL_END SLMDB_CTL_END
#define CA_SLMDB_CTL_LONGJMP_FN(v) SLMDB_CTL_LONGJMP_FN, CHECK_VAL(SLMDB_CTL, SLMDB_LONGJMP_FN, (v))
#define CA_SLMDB_CTL_NOTIFY_FN(v) SLMDB_CTL_NOTIFY_FN, CHECK_VAL(SLMDB_CTL, SLMDB_NOTIFY_FN, (v))
#define CA_SLMDB_CTL_CB_CONTEXT(v) SLMDB_CTL_CB_CONTEXT, CHECK_PTR(SLMDB_CTL, void, (v))
#define CA_SLMDB_CTL_API_RETRY_LIMIT(v) SLMDB_CTL_API_RETRY_LIMIT, CHECK_VAL(SLMDB_CTL, int, (v))
#define CA_SLMDB_CTL_BULK_RETRY_LIMIT(v) SLMDB_CTL_BULK_RETRY_LIMIT, CHECK_VAL(SLMDB_CTL, int, (v))
#define CA_SLMDB_CTL_ASSERT_FN(v) SLMDB_CTL_ASSERT_FN, CHECK_VAL(SLMDB_CTL, SLMDB_ASSERT_FN, (v))
typedef void (*SLMDB_NOTIFY_FN) (void *, int,...);
typedef void (*SLMDB_LONGJMP_FN) (void *, int);
typedef void (*SLMDB_ASSERT_FN) (void *, const char *);
CHECK_VAL_HELPER_DCL(SLMDB_CTL, int);
CHECK_VAL_HELPER_DCL(SLMDB_CTL, SLMDB_NOTIFY_FN);
CHECK_VAL_HELPER_DCL(SLMDB_CTL, SLMDB_LONGJMP_FN);
CHECK_VAL_HELPER_DCL(SLMDB_CTL, SLMDB_ASSERT_FN);
CHECK_PTR_HELPER_DCL(SLMDB_CTL, void);
#endif