Home | History | Annotate | Line # | Download | only in back-wt
config.c revision 1.1.1.1
      1 /*	$NetBSD: config.c,v 1.1.1.1 2021/08/14 16:05:24 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 (at) 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.1.1.1 2021/08/14 16:05:24 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 *
     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
     85 wt_cf_cleanup( ConfigArgs *c )
     86 {
     87 	// Not implement yet
     88 	return 0;
     89 }
     90 
     91 static int
     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 
    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