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