back-mdb.h revision 1.2
1/*	$NetBSD: back-mdb.h,v 1.2 2020/08/11 13:15:40 christos Exp $	*/
2
3/* back-mdb.h - mdb back-end header file */
4/* $OpenLDAP$ */
5/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6 *
7 * Copyright 2000-2020 The OpenLDAP Foundation.
8 * All rights reserved.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted only as authorized by the OpenLDAP
12 * Public License.
13 *
14 * A copy of this license is available in the file LICENSE in the
15 * top-level directory of the distribution or, alternatively, at
16 * <http://www.OpenLDAP.org/license.html>.
17 */
18
19#ifndef _BACK_MDB_H_
20#define _BACK_MDB_H_
21
22#include <portable.h>
23#include "slap.h"
24#include "lmdb.h"
25
26LDAP_BEGIN_DECL
27
28#undef MDB_TOOL_IDL_CACHING	/* currently broken */
29
30#define DN_BASE_PREFIX		SLAP_INDEX_EQUALITY_PREFIX
31#define DN_ONE_PREFIX	 	'%'
32#define DN_SUBTREE_PREFIX 	'@'
33
34#define MDB_AD2ID		0
35#define MDB_DN2ID		1
36#define MDB_ID2ENTRY	2
37#define MDB_NDB			3
38
39/* The default search IDL stack cache depth */
40#define DEFAULT_SEARCH_STACK_DEPTH	16
41
42/* The minimum we can function with */
43#define MINIMUM_SEARCH_STACK_DEPTH	8
44
45#define MDB_INDICES		128
46
47#define	MDB_MAXADS	65536
48
49/* Default to 10MB max */
50#define DEFAULT_MAPSIZE	(10*1048576)
51
52/* Most users will never see this */
53#define DEFAULT_RTXN_SIZE      10000
54
55#ifdef LDAP_DEVEL
56#define MDB_MONITOR_IDX
57#endif /* LDAP_DEVEL */
58
59typedef struct mdb_monitor_t {
60	void		*mdm_cb;
61	struct berval	mdm_ndn;
62} mdb_monitor_t;
63
64/* From ldap_rq.h */
65struct re_s;
66
67struct mdb_info {
68	MDB_env		*mi_dbenv;
69
70	/* DB_ENV parameters */
71	char		*mi_dbenv_home;
72	unsigned	mi_dbenv_flags;
73	int			mi_dbenv_mode;
74
75	size_t		mi_mapsize;
76	ID			mi_nextid;
77
78	slap_mask_t	mi_defaultmask;
79	int			mi_nattrs;
80	struct mdb_attrinfo		**mi_attrs;
81	void		*mi_search_stack;
82	int			mi_search_stack_depth;
83	int			mi_readers;
84
85	unsigned	mi_rtxn_size;
86	int			mi_txn_cp;
87	unsigned	mi_txn_cp_min;
88	unsigned	mi_txn_cp_kbyte;
89	struct re_s		*mi_txn_cp_task;
90	struct re_s		*mi_index_task;
91
92	mdb_monitor_t	mi_monitor;
93
94#ifdef MDB_MONITOR_IDX
95	ldap_pvt_thread_mutex_t	mi_idx_mutex;
96	Avlnode		*mi_idx;
97#endif /* MDB_MONITOR_IDX */
98
99	int		mi_flags;
100#define	MDB_IS_OPEN		0x01
101#define	MDB_OPEN_INDEX	0x02
102#define	MDB_DEL_INDEX	0x08
103#define	MDB_RE_OPEN		0x10
104#define	MDB_NEED_UPGRADE	0x20
105
106	int mi_numads;
107
108	MDB_dbi	mi_dbis[MDB_NDB];
109	AttributeDescription *mi_ads[MDB_MAXADS];
110	int mi_adxs[MDB_MAXADS];
111};
112
113#define mi_id2entry	mi_dbis[MDB_ID2ENTRY]
114#define mi_dn2id	mi_dbis[MDB_DN2ID]
115#define mi_ad2id	mi_dbis[MDB_AD2ID]
116
117typedef struct mdb_op_info {
118	OpExtra		moi_oe;
119	MDB_txn*	moi_txn;
120	int			moi_ref;
121	char		moi_flag;
122} mdb_op_info;
123#define MOI_READER	0x01
124#define MOI_FREEIT	0x02
125
126/* Copy an ID "src" to pointer "dst" in big-endian byte order */
127#define MDB_ID2DISK( src, dst )	\
128	do { int i0; ID tmp; unsigned char *_p;	\
129		tmp = (src); _p = (unsigned char *)(dst);	\
130		for ( i0=sizeof(ID)-1; i0>=0; i0-- ) {	\
131			_p[i0] = tmp & 0xff; tmp >>= 8;	\
132		} \
133	} while(0)
134
135/* Copy a pointer "src" to a pointer "dst" from big-endian to native order */
136#define MDB_DISK2ID( src, dst ) \
137	do { unsigned i0; ID tmp = 0; unsigned char *_p;	\
138		_p = (unsigned char *)(src);	\
139		for ( i0=0; i0<sizeof(ID); i0++ ) {	\
140			tmp <<= 8; tmp |= *_p++;	\
141		} *(dst) = tmp; \
142	} while (0)
143
144LDAP_END_DECL
145
146/* for the cache of attribute information (which are indexed, etc.) */
147typedef struct mdb_attrinfo {
148	AttributeDescription *ai_desc; /* attribute description cn;lang-en */
149	slap_mask_t ai_indexmask;	/* how the attr is indexed	*/
150	slap_mask_t ai_newmask;	/* new settings to replace old mask */
151#ifdef LDAP_COMP_MATCH
152	ComponentReference* ai_cr; /*component indexing*/
153#endif
154	Avlnode *ai_root;		/* for tools */
155	void *ai_flist;		/* for tools */
156	void *ai_clist;		/* for tools */
157	MDB_cursor *ai_cursor;	/* for tools */
158	int ai_idx;	/* position in AI array */
159	MDB_dbi ai_dbi;
160} AttrInfo;
161
162/* These flags must not clash with SLAP_INDEX flags or ops in slap.h! */
163#define	MDB_INDEX_DELETING	0x8000U	/* index is being modified */
164#define	MDB_INDEX_UPDATE_OP	0x03	/* performing an index update */
165
166/* For slapindex to record which attrs in an entry belong to which
167 * index database
168 */
169typedef struct AttrList {
170	struct AttrList *next;
171	Attribute *attr;
172} AttrList;
173
174#ifndef CACHELINE
175#define CACHELINE	64
176#endif
177
178#if defined(__i386) || defined(__x86_64)
179#define MISALIGNED_OK	1
180#else
181#define	ALIGNER	(sizeof(size_t)-1)
182#endif
183
184typedef struct IndexRbody {
185	AttrInfo *ai;
186	AttrList *attrs;
187	void *tptr;
188	int i;
189} IndexRbody;
190
191typedef struct IndexRec {
192	union {
193		IndexRbody irb;
194#define ir_ai	iru.irb.ai
195#define ir_attrs	iru.irb.attrs
196#define ir_tptr	iru.irb.tptr
197#define ir_i	iru.irb.i
198		/* cache line alignment */
199		char pad[(sizeof(IndexRbody)+CACHELINE-1) & (!CACHELINE-1)];
200	} iru;
201} IndexRec;
202
203#define MAXRDNS	SLAP_LDAPDN_MAXLEN/4
204
205#include "proto-mdb.h"
206
207#endif /* _BACK_MDB_H_ */
208