#ifndef _DB_AM_H_
#define _DB_AM_H_
#if defined(__cplusplus)
extern "C" {
#endif
struct __db_foreign_info; \
typedef struct __db_foreign_info DB_FOREIGN_INFO;
struct __db_foreign_info {
DB *dbp;
u_int32_t flags;
int (*callback) __P((DB *, const DBT *, DBT *, const DBT *, int *));
struct {
struct __db_foreign_info *le_next;
struct __db_foreign_info **le_prev;
} f_links;
};
#define IS_ENV_AUTO_COMMIT(env, txn, flags) \
(LF_ISSET(DB_AUTO_COMMIT) || ((txn) == NULL && \
F_ISSET((env)->dbenv, DB_ENV_AUTO_COMMIT) && \
!LF_ISSET(DB_NO_AUTO_COMMIT)))
#define IS_DB_AUTO_COMMIT(dbp, txn) \
((txn) == NULL && F_ISSET((dbp), DB_AM_TXN))
#define STRIP_AUTO_COMMIT(f) FLD_CLR((f), DB_AUTO_COMMIT)
#define DB_ADD_DUP 1
#define DB_REM_DUP 2
#define DB_ADD_BIG 3
#define DB_REM_BIG 4
#define DB_ADD_PAGE_COMPAT 5
#define DB_REM_PAGE_COMPAT 6
#define REC_INTRO(func, ip, do_cursor) do { \
argp = NULL; \
dbc = NULL; \
file_dbp = NULL; \
COMPQUIET(mpf, NULL); \
if ((ret = func(env, &file_dbp, \
(info != NULL) ? ((DB_TXNHEAD *)info)->td : NULL, \
dbtp->data, &argp)) != 0) { \
if (ret == DB_DELETED) { \
ret = 0; \
goto done; \
} \
goto out; \
} \
if (do_cursor) { \
if ((ret = \
__db_cursor(file_dbp, ip, NULL, &dbc, 0)) != 0) \
goto out; \
F_SET(dbc, DBC_RECOVER); \
} \
mpf = file_dbp->mpf; \
} while (0)
#define REC_CLOSE { \
int __t_ret; \
if (argp != NULL) \
__os_free(env, argp); \
if (dbc != NULL && \
(__t_ret = __dbc_close(dbc)) != 0 && ret == 0) \
ret = __t_ret; \
} \
return (ret)
#define REC_NOOP_INTRO(func) do { \
argp = NULL; \
if ((ret = func(env, dbtp->data, &argp)) != 0) \
return (ret); \
} while (0)
#define REC_NOOP_CLOSE \
if (argp != NULL) \
__os_free(env, argp); \
return (ret)
#define REC_FGET(mpf, ip, pgno, pagep, cont) \
if ((ret = __memp_fget(mpf, \
&(pgno), ip, NULL, 0, pagep)) != 0) { \
if (ret != DB_PAGE_NOTFOUND) { \
ret = __db_pgerr(file_dbp, pgno, ret); \
goto out; \
} else \
goto cont; \
}
#define REC_DIRTY(mpf, ip, priority, pagep) \
if ((ret = __memp_dirty(mpf, \
pagep, ip, NULL, priority, DB_MPOOL_EDIT)) != 0) { \
ret = __db_pgerr(file_dbp, PGNO(*(pagep)), ret); \
goto out; \
}
#ifdef DEBUG_RECOVER
#define REC_PRINT(func) \
(void)func(env, dbtp, lsnp, op, info);
#else
#define REC_PRINT(func)
#endif
#define LCK_ALWAYS 1
#define LCK_COUPLE 2
#define LCK_COUPLE_ALWAYS 3
#define LCK_DOWNGRADE 4
#define LCK_ROLLBACK 5
#define __LPUT(dbc, lock) \
__ENV_LPUT((dbc)->env, lock)
#define __ENV_LPUT(env, lock) \
(LOCK_ISSET(lock) ? __lock_put(env, &(lock)) : 0)
#define __TLPUT(dbc, lock) \
(LOCK_ISSET(lock) ? __db_lput(dbc, &(lock)) : 0)
#define DB_IS_READONLY(dbp) \
(F_ISSET(dbp, DB_AM_RDONLY) || \
(IS_REP_CLIENT((dbp)->env) && !F_ISSET((dbp), DB_AM_NOT_DURABLE)))
#ifdef HAVE_HASH
#define DB_RETURNS_A_KEY_HASH(dbp) \
((HASH *)(dbp)->h_internal)->h_compare != NULL
#else
#define DB_RETURNS_A_KEY_HASH(dbp) 0
#endif
#define DB_RETURNS_A_KEY(dbp, flags) \
(((flags) != 0 && (flags) != DB_GET_BOTH && \
(flags) != DB_GET_BOTH_RANGE && (flags) != DB_SET) || \
((BTREE *)(dbp)->bt_internal)->bt_compare != __bam_defcmp ||\
DB_RETURNS_A_KEY_HASH(dbp))
#include "dbinc/db_swap.h"
#define SWAP_IF_NEEDED(sdbp, pkey) \
do { \
if (((sdbp)->s_primary->type == DB_QUEUE || \
(sdbp)->s_primary->type == DB_RECNO) && \
F_ISSET((sdbp), DB_AM_SWAP)) \
P_32_SWAP((pkey)->data); \
} while (0)
#define FIND_FIRST_DB_MATCH(env, dbp, tdbp) do { \
for ((tdbp) = (dbp); \
TAILQ_PREV((tdbp), __dblist, dblistlinks) != NULL && \
TAILQ_PREV((tdbp), \
__dblist, dblistlinks)->adj_fileid == (dbp)->adj_fileid;\
(tdbp) = TAILQ_PREV((tdbp), __dblist, dblistlinks)) \
; \
} while (0)
#define DB_BINARY_SEARCH_FOR(base, limit, page, adjust) \
for (base = 0, limit = NUM_ENT(page) / (db_indx_t)(adjust); \
(limit) != 0; (limit) >>= 1)
#define DB_BINARY_SEARCH_INCR(index, base, limit, adjust) \
index = (base) + (((limit) >> 1) * (adjust))
#define DB_BINARY_SEARCH_SHIFT_BASE(index, base, limit, adjust) do { \
base = (index) + (adjust); \
--(limit); \
} while (0)
#define SEQ_IS_OPEN(seq) ((seq)->seq_key.data != NULL)
#define SEQ_ILLEGAL_AFTER_OPEN(seq, name) \
if (SEQ_IS_OPEN(seq)) \
return (__db_mi_open((seq)->seq_dbp->env, name, 1));
#define SEQ_ILLEGAL_BEFORE_OPEN(seq, name) \
if (!SEQ_IS_OPEN(seq)) \
return (__db_mi_open((seq)->seq_dbp->env, name, 0));
#define DB_CHK_META 0x01
#define DB_CHK_NOLSN 0x02
#if defined(__cplusplus)
}
#endif
#include "dbinc/db_dispatch.h"
#include "dbinc_auto/db_auto.h"
#include "dbinc_auto/crdel_auto.h"
#include "dbinc_auto/db_ext.h"
#endif