back-mdb.h revision 1.1.1.2
1/*	$NetBSD: back-mdb.h,v 1.1.1.2 2017/02/09 01:47:07 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-2016 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	/* The DB_ENV can be tuned via DB_CONFIG */
72	char		*mi_dbenv_home;
73	uint32_t	mi_dbenv_flags;
74	int			mi_dbenv_mode;
75
76	size_t		mi_mapsize;
77	ID			mi_nextid;
78
79	slap_mask_t	mi_defaultmask;
80	int			mi_nattrs;
81	struct mdb_attrinfo		**mi_attrs;
82	void		*mi_search_stack;
83	int			mi_search_stack_depth;
84	int			mi_readers;
85
86	uint32_t	mi_rtxn_size;
87	int			mi_txn_cp;
88	uint32_t	mi_txn_cp_min;
89	uint32_t	mi_txn_cp_kbyte;
90	struct re_s		*mi_txn_cp_task;
91	struct re_s		*mi_index_task;
92
93	mdb_monitor_t	mi_monitor;
94
95#ifdef MDB_MONITOR_IDX
96	ldap_pvt_thread_mutex_t	mi_idx_mutex;
97	Avlnode		*mi_idx;
98#endif /* MDB_MONITOR_IDX */
99
100	int		mi_flags;
101#define	MDB_IS_OPEN		0x01
102#define	MDB_OPEN_INDEX	0x02
103#define	MDB_DEL_INDEX	0x08
104#define	MDB_RE_OPEN		0x10
105#define	MDB_NEED_UPGRADE	0x20
106
107	int mi_numads;
108
109	MDB_dbi	mi_dbis[MDB_NDB];
110	AttributeDescription *mi_ads[MDB_MAXADS];
111	int mi_adxs[MDB_MAXADS];
112};
113
114#define mi_id2entry	mi_dbis[MDB_ID2ENTRY]
115#define mi_dn2id	mi_dbis[MDB_DN2ID]
116#define mi_ad2id	mi_dbis[MDB_AD2ID]
117
118typedef struct mdb_op_info {
119	OpExtra		moi_oe;
120	MDB_txn*	moi_txn;
121	int			moi_ref;
122	char		moi_flag;
123} mdb_op_info;
124#define MOI_READER	0x01
125#define MOI_FREEIT	0x02
126
127/* Copy an ID "src" to pointer "dst" in big-endian byte order */
128#define MDB_ID2DISK( src, dst )	\
129	do { int i0; ID tmp; unsigned char *_p;	\
130		tmp = (src); _p = (unsigned char *)(dst);	\
131		for ( i0=sizeof(ID)-1; i0>=0; i0-- ) {	\
132			_p[i0] = tmp & 0xff; tmp >>= 8;	\
133		} \
134	} while(0)
135
136/* Copy a pointer "src" to a pointer "dst" from big-endian to native order */
137#define MDB_DISK2ID( src, dst ) \
138	do { unsigned i0; ID tmp = 0; unsigned char *_p;	\
139		_p = (unsigned char *)(src);	\
140		for ( i0=0; i0<sizeof(ID); i0++ ) {	\
141			tmp <<= 8; tmp |= *_p++;	\
142		} *(dst) = tmp; \
143	} while (0)
144
145LDAP_END_DECL
146
147/* for the cache of attribute information (which are indexed, etc.) */
148typedef struct mdb_attrinfo {
149	AttributeDescription *ai_desc; /* attribute description cn;lang-en */
150	slap_mask_t ai_indexmask;	/* how the attr is indexed	*/
151	slap_mask_t ai_newmask;	/* new settings to replace old mask */
152#ifdef LDAP_COMP_MATCH
153	ComponentReference* ai_cr; /*component indexing*/
154#endif
155	Avlnode *ai_root;		/* for tools */
156	void *ai_flist;		/* for tools */
157	void *ai_clist;		/* for tools */
158	MDB_cursor *ai_cursor;	/* for tools */
159	int ai_idx;	/* position in AI array */
160	MDB_dbi ai_dbi;
161} AttrInfo;
162
163/* These flags must not clash with SLAP_INDEX flags or ops in slap.h! */
164#define	MDB_INDEX_DELETING	0x8000U	/* index is being modified */
165#define	MDB_INDEX_UPDATE_OP	0x03	/* performing an index update */
166
167/* For slapindex to record which attrs in an entry belong to which
168 * index database
169 */
170typedef struct AttrList {
171	struct AttrList *next;
172	Attribute *attr;
173} AttrList;
174
175#ifndef CACHELINE
176#define CACHELINE	64
177#endif
178
179#if defined(__i386) || defined(__x86_64)
180#define MISALIGNED_OK	1
181#else
182#define	ALIGNER	(sizeof(size_t)-1)
183#endif
184
185typedef struct IndexRbody {
186	AttrInfo *ai;
187	AttrList *attrs;
188	void *tptr;
189	int i;
190} IndexRbody;
191
192typedef struct IndexRec {
193	union {
194		IndexRbody irb;
195#define ir_ai	iru.irb.ai
196#define ir_attrs	iru.irb.attrs
197#define ir_tptr	iru.irb.tptr
198#define ir_i	iru.irb.i
199		/* cache line alignment */
200		char pad[(sizeof(IndexRbody)+CACHELINE-1) & (!CACHELINE-1)];
201	} iru;
202} IndexRec;
203
204#define MAXRDNS	SLAP_LDAPDN_MAXLEN/4
205
206#include "proto-mdb.h"
207
208#endif /* _BACK_MDB_H_ */
209