/*	$NetBSD: back-mdb.h,v 1.1.1.3.6.1 2019/08/10 06:17:18 martin Exp $	*/
/* back-mdb.h - mdb back-end header file */
/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software .
 *
 * Copyright 2000-2019 The OpenLDAP Foundation.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted only as authorized by the OpenLDAP
 * Public License.
 *
 * A copy of this license is available in the file LICENSE in the
 * top-level directory of the distribution or, alternatively, at
 * .
 */
#ifndef _BACK_MDB_H_
#define _BACK_MDB_H_
#include 
#include "slap.h"
#include "lmdb.h"
LDAP_BEGIN_DECL
#undef MDB_TOOL_IDL_CACHING	/* currently broken */
#define DN_BASE_PREFIX		SLAP_INDEX_EQUALITY_PREFIX
#define DN_ONE_PREFIX	 	'%'
#define DN_SUBTREE_PREFIX 	'@'
#define MDB_AD2ID		0
#define MDB_DN2ID		1
#define MDB_ID2ENTRY	2
#define MDB_NDB			3
/* The default search IDL stack cache depth */
#define DEFAULT_SEARCH_STACK_DEPTH	16
/* The minimum we can function with */
#define MINIMUM_SEARCH_STACK_DEPTH	8
#define MDB_INDICES		128
#define	MDB_MAXADS	65536
/* Default to 10MB max */
#define DEFAULT_MAPSIZE	(10*1048576)
/* Most users will never see this */
#define DEFAULT_RTXN_SIZE      10000
#ifdef LDAP_DEVEL
#define MDB_MONITOR_IDX
#endif /* LDAP_DEVEL */
typedef struct mdb_monitor_t {
	void		*mdm_cb;
	struct berval	mdm_ndn;
} mdb_monitor_t;
/* From ldap_rq.h */
struct re_s;
struct mdb_info {
	MDB_env		*mi_dbenv;
	/* DB_ENV parameters */
	/* The DB_ENV can be tuned via DB_CONFIG */
	char		*mi_dbenv_home;
	uint32_t	mi_dbenv_flags;
	int			mi_dbenv_mode;
	size_t		mi_mapsize;
	ID			mi_nextid;
	slap_mask_t	mi_defaultmask;
	int			mi_nattrs;
	struct mdb_attrinfo		**mi_attrs;
	void		*mi_search_stack;
	int			mi_search_stack_depth;
	int			mi_readers;
	uint32_t	mi_rtxn_size;
	int			mi_txn_cp;
	uint32_t	mi_txn_cp_min;
	uint32_t	mi_txn_cp_kbyte;
	struct re_s		*mi_txn_cp_task;
	struct re_s		*mi_index_task;
	mdb_monitor_t	mi_monitor;
#ifdef MDB_MONITOR_IDX
	ldap_pvt_thread_mutex_t	mi_idx_mutex;
	Avlnode		*mi_idx;
#endif /* MDB_MONITOR_IDX */
	int		mi_flags;
#define	MDB_IS_OPEN		0x01
#define	MDB_OPEN_INDEX	0x02
#define	MDB_DEL_INDEX	0x08
#define	MDB_RE_OPEN		0x10
#define	MDB_NEED_UPGRADE	0x20
	int mi_numads;
	MDB_dbi	mi_dbis[MDB_NDB];
	AttributeDescription *mi_ads[MDB_MAXADS];
	int mi_adxs[MDB_MAXADS];
};
#define mi_id2entry	mi_dbis[MDB_ID2ENTRY]
#define mi_dn2id	mi_dbis[MDB_DN2ID]
#define mi_ad2id	mi_dbis[MDB_AD2ID]
typedef struct mdb_op_info {
	OpExtra		moi_oe;
	MDB_txn*	moi_txn;
	int			moi_ref;
	char		moi_flag;
} mdb_op_info;
#define MOI_READER	0x01
#define MOI_FREEIT	0x02
/* Copy an ID "src" to pointer "dst" in big-endian byte order */
#define MDB_ID2DISK( src, dst )	\
	do { int i0; ID tmp; unsigned char *_p;	\
		tmp = (src); _p = (unsigned char *)(dst);	\
		for ( i0=sizeof(ID)-1; i0>=0; i0-- ) {	\
			_p[i0] = tmp & 0xff; tmp >>= 8;	\
		} \
	} while(0)
/* Copy a pointer "src" to a pointer "dst" from big-endian to native order */
#define MDB_DISK2ID( src, dst ) \
	do { unsigned i0; ID tmp = 0; unsigned char *_p;	\
		_p = (unsigned char *)(src);	\
		for ( i0=0; i0