1 /* config.cpp - ndb backend configuration file routine */
3 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
5 * Copyright 2008 The OpenLDAP Foundation.
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted only as authorized by the OpenLDAP
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>.
17 * This work was initially developed by Howard Chu for inclusion
18 * in OpenLDAP Software. This work was sponsored by MySQL.
29 static ConfigDriver ndb_cf_gen;
38 static ConfigTable ndbcfg[] = {
39 { "dbhost", "hostname", 2, 2, 0, ARG_STRING|ARG_OFFSET,
40 (void *)offsetof(struct ndb_info, ni_hostname),
41 "( OLcfgDbAt:6.1 NAME 'olcDbHost' "
42 "DESC 'Hostname of SQL server' "
43 "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
44 { "dbname", "name", 2, 2, 0, ARG_STRING|ARG_OFFSET,
45 (void *)offsetof(struct ndb_info, ni_dbname),
46 "( OLcfgDbAt:6.2 NAME 'olcDbName' "
47 "DESC 'Name of SQL database' "
48 "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
49 { "dbuser", "username", 2, 2, 0, ARG_STRING|ARG_OFFSET,
50 (void *)offsetof(struct ndb_info, ni_username),
51 "( OLcfgDbAt:6.3 NAME 'olcDbUser' "
52 "DESC 'Username for SQL session' "
53 "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
54 { "dbpass", "password", 2, 2, 0, ARG_STRING|ARG_OFFSET,
55 (void *)offsetof(struct ndb_info, ni_password),
56 "( OLcfgDbAt:6.4 NAME 'olcDbPass' "
57 "DESC 'Password for SQL session' "
58 "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
59 { "dbport", "port", 2, 2, 0, ARG_UINT|ARG_OFFSET,
60 (void *)offsetof(struct ndb_info, ni_port),
61 "( OLcfgDbAt:6.5 NAME 'olcDbPort' "
62 "DESC 'Port number of SQL server' "
63 "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
64 { "dbsocket", "path", 2, 2, 0, ARG_STRING|ARG_OFFSET,
65 (void *)offsetof(struct ndb_info, ni_socket),
66 "( OLcfgDbAt:6.6 NAME 'olcDbSocket' "
67 "DESC 'Local socket path of SQL server' "
68 "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
69 { "dbflag", "flag", 2, 2, 0, ARG_LONG|ARG_OFFSET,
70 (void *)offsetof(struct ndb_info, ni_clflag),
71 "( OLcfgDbAt:6.7 NAME 'olcDbFlag' "
72 "DESC 'Flags for SQL session' "
73 "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
74 { "dbconnect", "hostname", 2, 2, 0, ARG_STRING|ARG_OFFSET,
75 (void *)offsetof(struct ndb_info, ni_connectstr),
76 "( OLcfgDbAt:6.8 NAME 'olcDbConnect' "
77 "DESC 'Hostname of NDB server' "
78 "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
79 { "dbconnections", "number", 2, 2, 0, ARG_INT|ARG_OFFSET,
80 (void *)offsetof(struct ndb_info, ni_nconns),
81 "( OLcfgDbAt:6.9 NAME 'olcDbConnections' "
82 "DESC 'Number of cluster connections to open' "
83 "SYNTAX OMsInteger SINGLE-VALUE )", NULL, NULL },
84 { "attrlen", "attr> <len", 3, 3, 0, ARG_MAGIC|NDB_ATLEN,
86 "( OLcfgDbAt:6.10 NAME 'olcNdbAttrLen' "
87 "DESC 'Column length of a specific attribute' "
88 "EQUALITY caseIgnoreMatch "
89 "SYNTAX OMsDirectoryString )", NULL, NULL },
90 { "attrset", "set> <attrs", 3, 3, 0, ARG_MAGIC|NDB_ATSET,
92 "( OLcfgDbAt:6.11 NAME 'olcNdbAttrSet' "
93 "DESC 'Set of common attributes' "
94 "EQUALITY caseIgnoreMatch "
95 "SYNTAX OMsDirectoryString )", NULL, NULL },
96 { "index", "attr", 2, 2, 0, ARG_MAGIC|NDB_INDEX,
97 (void *)ndb_cf_gen, "( OLcfgDbAt:0.2 NAME 'olcDbIndex' "
98 "DESC 'Attribute to index' "
99 "EQUALITY caseIgnoreMatch "
100 "SYNTAX OMsDirectoryString )", NULL, NULL },
101 { NULL, NULL, 0, 0, 0, ARG_IGNORED,
102 NULL, NULL, NULL, NULL }
105 static ConfigOCs ndbocs[] = {
108 "NAME 'olcNdbConfig' "
109 "DESC 'NDB backend configuration' "
110 "SUP olcDatabaseConfig "
111 "MUST ( olcDbHost $ olcDbName $ olcDbConnect ) "
112 "MAY ( olcDbUser $ olcDbPass $ olcDbPort $ olcDbSocket $ "
113 "olcDbFlag $ olcDbConnections $ olcNdbAttrLen $ "
114 "olcDbIndex $ olcNdbAttrSet ) )",
115 Cft_Database, ndbcfg },
116 { NULL, Cft_Abstract, NULL }
120 ndb_cf_gen( ConfigArgs *c )
122 struct ndb_info *ni = (struct ndb_info *)c->be->be_private;
127 struct berval bv, *bva;
129 if ( c->op == SLAP_CONFIG_EMIT ) {
135 if ( ni->ni_attrlens ) {
136 for ( ln = ni->ni_attrlens; ln; ln=ln->ln_next ) {
137 ai = (NdbAttrInfo *)ln->ln_data;
138 bv.bv_len = snprintf( buf, sizeof(buf),
139 "%s %d", ai->na_name.bv_val,
141 value_add_one( &c->rvalue_vals, &bv );
149 if ( ni->ni_attrsets ) {
150 char *ptr, *end = buf+sizeof(buf);
151 for ( ln = ni->ni_attrsets; ln; ln=ln->ln_next ) {
152 oci = (NdbOcInfo *)ln->ln_data;
153 ptr = lutil_strcopy( buf, oci->no_name.bv_val );
155 for ( i=0; i<oci->no_nattrs; i++ ) {
156 if ( end - ptr < oci->no_attrs[i]->na_name.bv_len+1 )
160 ptr = lutil_strcopy(ptr,
161 oci->no_attrs[i]->na_name.bv_val );
163 bv.bv_len = ptr - buf;
164 value_add_one( &c->rvalue_vals, &bv );
172 if ( ni->ni_attridxs ) {
173 for ( ln = ni->ni_attridxs; ln; ln=ln->ln_next ) {
174 ai = (NdbAttrInfo *)ln->ln_data;
175 value_add_one( &c->rvalue_vals, &ai->na_name );
184 } else if ( c->op == LDAP_MOD_DELETE ) { /* FIXME */
188 if ( c->valx == -1 ) {
203 ber_str2bv( c->argv[1], 0, 0, &bv );
204 ai = ndb_ai_get( ni, &bv );
206 snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: invalid attr %s",
207 c->log, c->argv[1] );
208 Debug( LDAP_DEBUG_ANY, "%s\n", c->cr_msg, 0, 0 );
211 for ( ln = ni->ni_attrlens; ln; ln = ln->ln_next ) {
212 if ( ln->ln_data == (void *)ai ) {
213 snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: attr len already set for %s",
214 c->log, c->argv[1] );
215 Debug( LDAP_DEBUG_ANY, "%s\n", c->cr_msg, 0, 0 );
219 ai->na_len = atoi( c->argv[2] );
220 ai->na_flag |= NDB_INFO_ATLEN;
221 ln = (ListNode *)ch_malloc( sizeof(ListNode));
224 for ( l2 = &ni->ni_attrlens; *l2; l2 = &(*l2)->ln_next );
229 ber_str2bv( c->argv[1], 0, 0, &bv );
230 ai = ndb_ai_get( ni, &bv );
232 snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: invalid attr %s",
233 c->log, c->argv[1] );
234 Debug( LDAP_DEBUG_ANY, "%s\n", c->cr_msg, 0, 0 );
237 for ( ln = ni->ni_attridxs; ln; ln = ln->ln_next ) {
238 if ( ln->ln_data == (void *)ai ) {
239 snprintf( c->cr_msg, sizeof( c->cr_msg ), "%s: attr index already set for %s",
240 c->log, c->argv[1] );
241 Debug( LDAP_DEBUG_ANY, "%s\n", c->cr_msg, 0, 0 );
245 ai->na_flag |= NDB_INFO_INDEX;
246 ln = (ListNode *)ch_malloc( sizeof(ListNode));
249 for ( l2 = &ni->ni_attridxs; *l2; l2 = &(*l2)->ln_next );
254 ber_str2bv( c->argv[1], 0, 0, &bv );
255 bva = ndb_str2bvarray( c->argv[2], strlen( c->argv[2] ), ',' );
256 rc = ndb_aset_get( ni, &bv, bva, &oci );
259 if ( rc == LDAP_ALREADY_EXISTS ) {
260 snprintf( c->cr_msg, sizeof( c->cr_msg ),
261 "%s: attrset %s already defined",
262 c->log, c->argv[1] );
264 snprintf( c->cr_msg, sizeof( c->cr_msg ),
265 "%s: invalid attrset %s (%d)",
266 c->log, c->argv[1], rc );
268 Debug( LDAP_DEBUG_ANY, "%s\n", c->cr_msg, 0, 0 );
271 ln = (ListNode *)ch_malloc( sizeof(ListNode));
274 for ( l2 = &ni->ni_attrsets; *l2; l2 = &(*l2)->ln_next );
282 int ndb_back_init_cf( BackendInfo *bi )
284 bi->bi_cf_ocs = ndbocs;
286 return config_register_schema( ndbcfg, ndbocs );