1 /*	$NetBSD: back-ndb.h,v 1.3 2021/08/14 16:15:00 christos Exp $	*/
2 
3 /* $OpenLDAP$ */
4 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5  *
6  * Copyright 2008-2021 The OpenLDAP Foundation.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted only as authorized by the OpenLDAP
11  * Public License.
12  *
13  * A copy of this license is available in the file LICENSE in the
14  * top-level directory of the distribution or, alternatively, at
15  * <http://www.OpenLDAP.org/license.html>.
16  */
17 /* ACKNOWLEDGEMENTS:
18  * This work was initially developed by Howard Chu for inclusion
19  * in OpenLDAP Software. This work was sponsored by MySQL.
20  */
21 
22 #ifndef SLAPD_NDB_H
23 #define SLAPD_NDB_H
24 
25 #include "slap.h"
26 
27 #include <mysql.h>
28 #include <NdbApi.hpp>
29 
30 LDAP_BEGIN_DECL
31 
32 /* The general design is to use one relational table per objectclass. This is
33  * complicated by objectclass inheritance and auxiliary classes though.
34  *
35  * Attributes must only occur in a single table. For objectclasses that inherit
36  * from other classes, attributes defined in the superior class are only stored
37  * in the superior class' table. When multiple unrelated classes define the same
38  * attributes, an attributeSet should be defined instead, containing all of the
39  * common attributes.
40  *
41  * The no_set table lists which other attributeSets apply to the current
42  * objectClass. The no_attrs table lists all of the non-inherited attributes of
43  * the class, including those residing in an attributeSet.
44  *
45  * Usually the table is named identically to the objectClass, but it can also
46  * be explicitly named something else if needed.
47  */
48 #define NDB_MAX_OCSETS	8
49 
50 struct ndb_attrinfo;
51 
52 typedef struct ndb_ocinfo {
53 	struct berval no_name;	/* objectclass cname */
54 	struct berval no_table;
55 	ObjectClass *no_oc;
56 	struct ndb_ocinfo *no_sets[NDB_MAX_OCSETS];
57 	struct ndb_attrinfo **no_attrs;
58 	int no_flag;
59 	int no_nsets;
60 	int no_nattrs;
61 } NdbOcInfo;
62 
63 #define	NDB_INFO_ATLEN	0x01
64 #define	NDB_INFO_ATSET	0x02
65 #define	NDB_INFO_INDEX	0x04
66 #define	NDB_INFO_ATBLOB	0x08
67 
68 typedef struct ndb_attrinfo {
69 	struct berval na_name;	/* attribute cname */
70 	AttributeDescription *na_desc;
71 	AttributeType *na_attr;
72 	NdbOcInfo *na_oi;
73 	int na_flag;
74 	int na_len;
75 	int na_column;
76 	int na_ixcol;
77 } NdbAttrInfo;
78 
79 typedef struct ListNode {
80 	struct ListNode *ln_next;
81 	void *ln_data;
82 } ListNode;
83 
84 #define	NDB_IS_OPEN(ni)	(ni->ni_cluster != NULL)
85 
86 struct ndb_info {
87 	/* NDB connection */
88 	char *ni_connectstr;
89 	char *ni_dbname;
90 	Ndb_cluster_connection **ni_cluster;
91 
92 	/* MySQL connection parameters */
93 	MYSQL ni_sql;
94 	char *ni_hostname;
95 	char *ni_username;
96 	char *ni_password;
97 	char *ni_socket;
98 	unsigned long ni_clflag;
99 	unsigned int ni_port;
100 
101 	/* Search filter processing */
102 	int ni_search_stack_depth;
103 	void *ni_search_stack;
104 
105 #define	DEFAULT_SEARCH_STACK_DEPTH	16
106 #define	MINIMUM_SEARCH_STACK_DEPTH	8
107 
108 	/* Schema config */
109 	NdbOcInfo *ni_opattrs;
110 	ListNode *ni_attridxs;
111 	ListNode *ni_attrlens;
112 	ListNode *ni_attrsets;
113 	ListNode *ni_attrblobs;
114 	ldap_pvt_thread_rdwr_t ni_ai_rwlock;
115 	Avlnode *ni_ai_tree;
116 	ldap_pvt_thread_rdwr_t ni_oc_rwlock;
117 	Avlnode *ni_oc_tree;
118 	int ni_nconns;	/* number of connections to open */
119 	int ni_nextconn;	/* next conn to use */
120 	ldap_pvt_thread_mutex_t ni_conn_mutex;
121 };
122 
123 #define	NDB_MAX_RDNS	16
124 #define	NDB_RDN_LEN	128
125 #define	NDB_MAX_OCS	64
126 
127 #define	DN2ID_TABLE	"OL_dn2id"
128 #define	EID_COLUMN	0U
129 #define	VID_COLUMN	1U
130 #define	OCS_COLUMN	1U
131 #define	RDN_COLUMN	2U
132 #define	IDX_COLUMN	(2U+NDB_MAX_RDNS)
133 
134 #define	NEXTID_TABLE	"OL_nextid"
135 
136 #define	NDB_OC_BUFLEN	1026	/* 1024 data plus 2 len bytes */
137 
138 #define	INDEX_NAME	"OL_index"
139 
140 typedef struct NdbRdns {
141 	short nr_num;
142 	char nr_buf[NDB_MAX_RDNS][NDB_RDN_LEN+1];
143 } NdbRdns;
144 
145 typedef struct NdbOcs {
146 	int no_ninfo;
147 	int no_ntext;
148 	int no_nitext;	/* number of implicit classes */
149 	NdbOcInfo *no_info[NDB_MAX_OCS];
150 	struct berval no_text[NDB_MAX_OCS];
151 	struct berval no_itext[NDB_MAX_OCS];	/* implicit classes */
152 } NdbOcs;
153 
154 typedef struct NdbArgs {
155 	Ndb *ndb;
156 	NdbTransaction *txn;
157 	Entry *e;
158 	NdbRdns *rdns;
159 	struct berval *ocs;
160 	int erdns;
161 } NdbArgs;
162 
163 #define	NDB_NO_SUCH_OBJECT	626
164 #define	NDB_ALREADY_EXISTS	630
165 
166 LDAP_END_DECL
167 
168 #include "proto-ndb.h"
169 
170 #endif
171