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