xref: /netbsd-src/external/bsd/openldap/dist/servers/slapd/back-wt/config.c (revision 549b59ed3ccf0d36d3097190a0db27b770f3a839)
1 /*	$NetBSD: config.c,v 1.2 2021/08/14 16:15:02 christos Exp $	*/
2 
3 /* OpenLDAP WiredTiger backend */
4 /* $OpenLDAP$ */
5 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
6  *
7  * Copyright 2002-2021 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 /* ACKNOWLEDGEMENTS:
19  * This work was developed by HAMANO Tsukasa <hamano@osstech.co.jp>
20  * based on back-bdb for inclusion in OpenLDAP Software.
21  * WiredTiger is a product of MongoDB Inc.
22  */
23 
24 #include <sys/cdefs.h>
25 __RCSID("$NetBSD: config.c,v 1.2 2021/08/14 16:15:02 christos Exp $");
26 
27 #include "portable.h"
28 
29 #include <stdio.h>
30 #include <ac/string.h>
31 #include "back-wt.h"
32 #include "slap-config.h"
33 
34 #include "lutil.h"
35 #include "ldap_rq.h"
36 
37 static ConfigDriver wt_cf_gen;
38 
39 enum {
40 	WT_DIRECTORY = 1,
41 	WT_CONFIG,
42 	WT_INDEX,
43 };
44 
45 static ConfigTable wtcfg[] = {
46     { "directory", "dir", 2, 2, 0, ARG_STRING|ARG_MAGIC|WT_DIRECTORY,
47 	  wt_cf_gen, "( OLcfgDbAt:0.1 NAME 'olcDbDirectory' "
48 	  "DESC 'Directory for database content' "
49 	  "EQUALITY caseIgnoreMatch "
50 	  "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
51     { "wtconfig", "config", 2, 2, 0, ARG_STRING|ARG_MAGIC|WT_CONFIG,
52 	  wt_cf_gen, "( OLcfgDbAt:13.1 NAME 'olcWtConfig' "
53 	  "DESC 'Configuration for WiredTiger' "
54 	  "EQUALITY caseIgnoreMatch "
55 	  "SYNTAX OMsDirectoryString SINGLE-VALUE )", NULL, NULL },
56 	{ "index", "attr> <[pres,eq,approx,sub]", 2, 3, 0, ARG_MAGIC|WT_INDEX,
57 	  wt_cf_gen, "( OLcfgDbAt:0.2 NAME 'olcDbIndex' "
58 	  "DESC 'Attribute index parameters' "
59 	  "EQUALITY caseIgnoreMatch "
60 	  "SYNTAX OMsDirectoryString )", NULL, NULL },
61 	{ NULL, NULL, 0, 0, 0, ARG_IGNORED,
62 		NULL, NULL, NULL, NULL }
63 };
64 
65 static ConfigOCs wtocs[] = {
66 	{ "( OLcfgDbOc:9.1 "
67 	  "NAME 'olcWtConfig' "
68 	  "DESC 'Wt backend configuration' "
69 	  "SUP olcDatabaseConfig "
70 	  "MUST olcDbDirectory "
71 	  "MAY ( olcWtConfig $ olcDbIndex ) )",
72 	  Cft_Database, wtcfg },
73 	{ NULL, 0, NULL }
74 };
75 
76 /* reindex entries on the fly */
77 static void *
wt_online_index(void * ctx,void * arg)78 wt_online_index( void *ctx, void *arg )
79 {
80 	// Not implement yet
81 }
82 
83 /* Cleanup loose ends after Modify completes */
84 static int
wt_cf_cleanup(ConfigArgs * c)85 wt_cf_cleanup( ConfigArgs *c )
86 {
87 	// Not implement yet
88 	return 0;
89 }
90 
91 static int
wt_cf_gen(ConfigArgs * c)92 wt_cf_gen( ConfigArgs *c )
93 {
94 	struct wt_info *wi = (struct wt_info *) c->be->be_private;
95 	int rc;
96 
97 	if(c->op == SLAP_CONFIG_EMIT) {
98 		rc = 0;
99 		// not implement yet
100 		return rc;
101 	}
102 
103 	switch( c->type ) {
104 	case WT_DIRECTORY:
105 		ch_free( wi->wi_dbenv_home );
106 		wi->wi_dbenv_home = c->value_string;
107 		break;
108 	case WT_CONFIG:
109 		ch_free( wi->wi_dbenv_config );
110 		wi->wi_dbenv_config = c->value_string;
111 		break;
112 
113 	case WT_INDEX:
114 		rc = wt_attr_index_config( wi, c->fname, c->lineno,
115 								   c->argc - 1, &c->argv[1], &c->reply);
116 
117 		if( rc != LDAP_SUCCESS ) return 1;
118 		wi->wi_flags |= WT_OPEN_INDEX;
119 
120 		if ( wi->wi_flags & WT_IS_OPEN ) {
121 			config_push_cleanup( c, wt_cf_cleanup );
122 
123 			if ( !wi->wi_index_task ) {
124 				/* Start the task as soon as we finish here. Set a long
125                  * interval (10 hours) so that it only gets scheduled once.
126                  */
127 				if ( c->be->be_suffix == NULL || BER_BVISNULL( &c->be->be_suffix[0] ) ) {
128 					fprintf( stderr, "%s: "
129 							 "\"index\" must occur after \"suffix\".\n",
130 							 c->log );
131 					return 1;
132 				}
133 				ldap_pvt_thread_mutex_lock( &slapd_rq.rq_mutex );
134 				wi->wi_index_task = ldap_pvt_runqueue_insert(&slapd_rq, 36000,
135 															 wt_online_index, c->be,
136 															 LDAP_XSTRING(wt_online_index),
137 															 c->be->be_suffix[0].bv_val );
138 				ldap_pvt_thread_mutex_unlock( &slapd_rq.rq_mutex );
139 			}
140 		}
141 		break;
142 
143 	}
144 	return LDAP_SUCCESS;
145 }
146 
wt_back_init_cf(BackendInfo * bi)147 int wt_back_init_cf( BackendInfo *bi )
148 {
149 	int rc;
150 	bi->bi_cf_ocs = wtocs;
151 
152 	rc = config_register_schema( wtcfg, wtocs );
153 	if ( rc ) return rc;
154 	return 0;
155 }
156 
157 /*
158  * Local variables:
159  * indent-tabs-mode: t
160  * tab-width: 4
161  * c-basic-offset: 4
162  * End:
163  */
164