diff --git a/cfg/tarantool_silverbox_cfg.c b/cfg/tarantool_silverbox_cfg.c index 80d1bf00d329f1e272d2ba492ec72045a79af6aa..2e553f920bba37f7686867efb95cf639ac6ba215 100644 --- a/cfg/tarantool_silverbox_cfg.c +++ b/cfg/tarantool_silverbox_cfg.c @@ -71,7 +71,7 @@ fill_default_tarantool_cfg(tarantool_cfg *c) { static int acceptDefault_name__namespace(tarantool_cfg_namespace *c) { - c->enabled = 0; + c->enabled = -1; c->cardinality = -1; c->estimated_rows = 0; c->index = NULL; @@ -281,6 +281,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { if ( cmpNameAtoms( opt->name, _name__username) ) { if (opt->paramType != stringType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; if (check_rdonly && ( (opt->paramValue.stringval == NULL && c->username == NULL) || strcmp(opt->paramValue.stringval, c->username) != 0)) return CNF_RDONLY; @@ -291,6 +292,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__coredump) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -304,6 +306,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__admin_port) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -317,6 +320,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__log_level) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -328,6 +332,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__slab_alloc_arena) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; double dbl = strtod(opt->paramValue.numberval, NULL); if ( (dbl == 0 || dbl == -HUGE_VAL || dbl == HUGE_VAL) && errno == ERANGE) @@ -339,6 +344,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__slab_alloc_minimal) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -352,6 +358,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__slab_alloc_factor) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; double dbl = strtod(opt->paramValue.numberval, NULL); if ( (dbl == 0 || dbl == -HUGE_VAL || dbl == HUGE_VAL) && errno == ERANGE) @@ -363,6 +370,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__work_dir) ) { if (opt->paramType != stringType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; if (check_rdonly && ( (opt->paramValue.stringval == NULL && c->work_dir == NULL) || strcmp(opt->paramValue.stringval, c->work_dir) != 0)) return CNF_RDONLY; @@ -373,6 +381,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__pid_file) ) { if (opt->paramType != stringType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; if (check_rdonly && ( (opt->paramValue.stringval == NULL && c->pid_file == NULL) || strcmp(opt->paramValue.stringval, c->pid_file) != 0)) return CNF_RDONLY; @@ -383,6 +392,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__logger) ) { if (opt->paramType != stringType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; if (check_rdonly && ( (opt->paramValue.stringval == NULL && c->logger == NULL) || strcmp(opt->paramValue.stringval, c->logger) != 0)) return CNF_RDONLY; @@ -393,6 +403,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__logger_nonblock) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -406,6 +417,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__io_collect_interval) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; double dbl = strtod(opt->paramValue.numberval, NULL); if ( (dbl == 0 || dbl == -HUGE_VAL || dbl == HUGE_VAL) && errno == ERANGE) @@ -417,6 +429,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__backlog) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -430,6 +443,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__readahead) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -441,6 +455,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__snap_dir) ) { if (opt->paramType != stringType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; if (check_rdonly && ( (opt->paramValue.stringval == NULL && c->snap_dir == NULL) || strcmp(opt->paramValue.stringval, c->snap_dir) != 0)) return CNF_RDONLY; @@ -451,6 +466,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__wal_dir) ) { if (opt->paramType != stringType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; if (check_rdonly && ( (opt->paramValue.stringval == NULL && c->wal_dir == NULL) || strcmp(opt->paramValue.stringval, c->wal_dir) != 0)) return CNF_RDONLY; @@ -461,6 +477,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__primary_port) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -474,6 +491,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__secondary_port) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -487,6 +505,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__too_long_threshold) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; double dbl = strtod(opt->paramValue.numberval, NULL); if ( (dbl == 0 || dbl == -HUGE_VAL || dbl == HUGE_VAL) && errno == ERANGE) @@ -496,6 +515,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__custom_proc_title) ) { if (opt->paramType != stringType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; if (check_rdonly && ( (opt->paramValue.stringval == NULL && c->custom_proc_title == NULL) || strcmp(opt->paramValue.stringval, c->custom_proc_title) != 0)) return CNF_RDONLY; @@ -506,6 +526,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__memcached) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -519,6 +540,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__memcached_namespace) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -532,6 +554,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__memcached_expire_per_loop) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -543,6 +566,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__memcached_expire_full_sweep) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -554,6 +578,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__snap_io_rate_limit) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; double dbl = strtod(opt->paramValue.numberval, NULL); if ( (dbl == 0 || dbl == -HUGE_VAL || dbl == HUGE_VAL) && errno == ERANGE) @@ -565,6 +590,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__rows_per_wal) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -578,6 +604,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__wal_fsync_delay) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -591,6 +618,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__wal_writer_inbox_size) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -604,6 +632,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__local_hot_standby) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -617,6 +646,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__wal_dir_rescan_delay) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; double dbl = strtod(opt->paramValue.numberval, NULL); if ( (dbl == 0 || dbl == -HUGE_VAL || dbl == HUGE_VAL) && errno == ERANGE) @@ -628,6 +658,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__panic_on_snap_error) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -641,6 +672,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__panic_on_wal_error) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -654,6 +686,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__remote_hot_standby) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -667,6 +700,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__wal_feeder_ipaddr) ) { if (opt->paramType != stringType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; if (check_rdonly && ( (opt->paramValue.stringval == NULL && c->wal_feeder_ipaddr == NULL) || strcmp(opt->paramValue.stringval, c->wal_feeder_ipaddr) != 0)) return CNF_RDONLY; @@ -677,6 +711,7 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__wal_feeder_port) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; + c->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -687,12 +722,19 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { return CNF_RDONLY; c->wal_feeder_port = i32; } + else if ( cmpNameAtoms( opt->name, _name__namespace) ) { + if (opt->paramType != arrayType ) + return CNF_WRONGTYPE; + ARRAYALLOC(c->namespace, 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); + } else if ( cmpNameAtoms( opt->name, _name__namespace__enabled) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; - ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW); + ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -706,9 +748,11 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__namespace__cardinality) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; - ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW); + ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -722,9 +766,11 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__namespace__estimated_rows) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; - ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW); + ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -735,15 +781,27 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { return CNF_RDONLY; c->namespace[opt->name->index]->estimated_rows = i32; } + else if ( cmpNameAtoms( opt->name, _name__namespace__index) ) { + if (opt->paramType != arrayType ) + return CNF_WRONGTYPE; + ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); + if (c->namespace[opt->name->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) + check_rdonly = 0; + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + ARRAYALLOC(c->namespace[opt->name->index]->index, 1, _name__namespace__index, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); + } else if ( cmpNameAtoms( opt->name, _name__namespace__index__type) ) { if (opt->paramType != stringType ) return CNF_WRONGTYPE; - ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW); + ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; - ARRAYALLOC(c->namespace[opt->name->index]->index, opt->name->next->index + 1, _name__namespace__index, check_rdonly, CNF_FLAG_STRUCT_NEW); + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + ARRAYALLOC(c->namespace[opt->name->index]->index, opt->name->next->index + 1, _name__namespace__index, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; + c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; if (check_rdonly && ( (opt->paramValue.stringval == NULL && c->namespace[opt->name->index]->index[opt->name->next->index]->type == NULL) || strcmp(opt->paramValue.stringval, c->namespace[opt->name->index]->index[opt->name->next->index]->type) != 0)) return CNF_RDONLY; @@ -754,12 +812,15 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__namespace__index__unique) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; - ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW); + ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; - ARRAYALLOC(c->namespace[opt->name->index]->index, opt->name->next->index + 1, _name__namespace__index, check_rdonly, CNF_FLAG_STRUCT_NEW); + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + ARRAYALLOC(c->namespace[opt->name->index]->index, opt->name->next->index + 1, _name__namespace__index, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; + c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -770,18 +831,35 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { return CNF_RDONLY; c->namespace[opt->name->index]->index[opt->name->next->index]->unique = i32; } + else if ( cmpNameAtoms( opt->name, _name__namespace__index__key_field) ) { + if (opt->paramType != arrayType ) + return CNF_WRONGTYPE; + ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); + if (c->namespace[opt->name->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) + check_rdonly = 0; + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + ARRAYALLOC(c->namespace[opt->name->index]->index, opt->name->next->index + 1, _name__namespace__index, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); + if (c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) + check_rdonly = 0; + c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + ARRAYALLOC(c->namespace[opt->name->index]->index[opt->name->next->index]->key_field, 1, _name__namespace__index__key_field, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); + } else if ( cmpNameAtoms( opt->name, _name__namespace__index__key_field__fieldno) ) { if (opt->paramType != numberType ) return CNF_WRONGTYPE; - ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW); + ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; - ARRAYALLOC(c->namespace[opt->name->index]->index, opt->name->next->index + 1, _name__namespace__index, check_rdonly, CNF_FLAG_STRUCT_NEW); + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + ARRAYALLOC(c->namespace[opt->name->index]->index, opt->name->next->index + 1, _name__namespace__index, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; - ARRAYALLOC(c->namespace[opt->name->index]->index[opt->name->next->index]->key_field, opt->name->next->next->index + 1, _name__namespace__index__key_field, check_rdonly, CNF_FLAG_STRUCT_NEW); + c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + ARRAYALLOC(c->namespace[opt->name->index]->index[opt->name->next->index]->key_field, opt->name->next->next->index + 1, _name__namespace__index__key_field, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; + c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; long int i32 = strtol(opt->paramValue.numberval, NULL, 10); if (i32 == 0 && errno == EINVAL) @@ -795,15 +873,19 @@ acceptValue(tarantool_cfg* c, OptDef* opt, int check_rdonly) { else if ( cmpNameAtoms( opt->name, _name__namespace__index__key_field__type) ) { if (opt->paramType != stringType ) return CNF_WRONGTYPE; - ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW); + ARRAYALLOC(c->namespace, opt->name->index + 1, _name__namespace, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; - ARRAYALLOC(c->namespace[opt->name->index]->index, opt->name->next->index + 1, _name__namespace__index, check_rdonly, CNF_FLAG_STRUCT_NEW); + c->namespace[opt->name->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + ARRAYALLOC(c->namespace[opt->name->index]->index, opt->name->next->index + 1, _name__namespace__index, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; - ARRAYALLOC(c->namespace[opt->name->index]->index[opt->name->next->index]->key_field, opt->name->next->next->index + 1, _name__namespace__index__key_field, check_rdonly, CNF_FLAG_STRUCT_NEW); + c->namespace[opt->name->index]->index[opt->name->next->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + ARRAYALLOC(c->namespace[opt->name->index]->index[opt->name->next->index]->key_field, opt->name->next->next->index + 1, _name__namespace__index__key_field, check_rdonly, CNF_FLAG_STRUCT_NEW | CNF_FLAG_STRUCT_NOTSET); if (c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->__confetti_flags & CNF_FLAG_STRUCT_NEW) check_rdonly = 0; + c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; + c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NOTSET; errno = 0; if (check_rdonly && ( (opt->paramValue.stringval == NULL && c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->type == NULL) || strcmp(opt->paramValue.stringval, c->namespace[opt->name->index]->index[opt->name->next->index]->key_field[opt->name->next->next->index]->type) != 0)) return CNF_RDONLY; @@ -1517,71 +1599,84 @@ check_cfg_tarantool_cfg(tarantool_cfg *c) { res++; out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__primary_port)); } - if (c->namespace == NULL) { res++; out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace)); } - i->idx_name__namespace = 0; while (c->namespace && c->namespace[i->idx_name__namespace]) { - if (c->namespace[i->idx_name__namespace]->enabled == 0) { - res++; - _name__namespace__enabled->index = i->idx_name__namespace; - out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__enabled)); - } - - if (c->namespace[i->idx_name__namespace]->index == NULL) { - res++; - _name__namespace__index->index = i->idx_name__namespace; - out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index)); - } - - i->idx_name__namespace__index = 0; - while (c->namespace[i->idx_name__namespace]->index && c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]) { - if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->type != NULL && strcmp(c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->type, "") == 0) { + if (c->namespace[i->idx_name__namespace]->__confetti_flags & CNF_FLAG_STRUCT_NOTSET) { + (void)0; + } else { + if (c->namespace[i->idx_name__namespace]->enabled == -1) { res++; - _name__namespace__index__type->next->index = i->idx_name__namespace__index; - _name__namespace__index__type->index = i->idx_name__namespace; - out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index__type)); + _name__namespace__enabled->index = i->idx_name__namespace; + out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__enabled)); } - - if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->unique == -1) { + if (c->namespace[i->idx_name__namespace]->index == NULL) { res++; - _name__namespace__index__unique->next->index = i->idx_name__namespace__index; - _name__namespace__index__unique->index = i->idx_name__namespace; - out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index__unique)); + _name__namespace__index->index = i->idx_name__namespace; + out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index)); } - - if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field == NULL) { - res++; - _name__namespace__index__key_field->next->index = i->idx_name__namespace__index; - _name__namespace__index__key_field->index = i->idx_name__namespace; - out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index__key_field)); - } - - i->idx_name__namespace__index__key_field = 0; - while (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field && c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field]) { - if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field]->fieldno == -1) { + i->idx_name__namespace__index = 0; + while (c->namespace[i->idx_name__namespace]->index && c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]) { + if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->__confetti_flags & CNF_FLAG_STRUCT_NOTSET) { res++; - _name__namespace__index__key_field__fieldno->next->next->index = i->idx_name__namespace__index__key_field; - _name__namespace__index__key_field__fieldno->next->index = i->idx_name__namespace__index; - _name__namespace__index__key_field__fieldno->index = i->idx_name__namespace; - out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index__key_field__fieldno)); - } + _name__namespace__index->next->index = i->idx_name__namespace__index; + _name__namespace__index->index = i->idx_name__namespace; + out_warning(CNF_NOTSET, "Option '%s' is not set", dumpOptDef(_name__namespace__index)); + } else { + if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->type != NULL && strcmp(c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->type, "") == 0) { + res++; + _name__namespace__index__type->next->index = i->idx_name__namespace__index; + _name__namespace__index__type->index = i->idx_name__namespace; + out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index__type)); + } + if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->unique == -1) { + res++; + _name__namespace__index__unique->next->index = i->idx_name__namespace__index; + _name__namespace__index__unique->index = i->idx_name__namespace; + out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index__unique)); + } + if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field == NULL) { + res++; + _name__namespace__index__key_field->next->index = i->idx_name__namespace__index; + _name__namespace__index__key_field->index = i->idx_name__namespace; + out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index__key_field)); + } + i->idx_name__namespace__index__key_field = 0; + while (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field && c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field]) { + if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field]->__confetti_flags & CNF_FLAG_STRUCT_NOTSET) { + res++; + _name__namespace__index__key_field->next->next->index = i->idx_name__namespace__index__key_field; + _name__namespace__index__key_field->next->index = i->idx_name__namespace__index; + _name__namespace__index__key_field->index = i->idx_name__namespace; + out_warning(CNF_NOTSET, "Option '%s' is not set", dumpOptDef(_name__namespace__index__key_field)); + } else { + if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field]->fieldno == -1) { + res++; + _name__namespace__index__key_field__fieldno->next->next->index = i->idx_name__namespace__index__key_field; + _name__namespace__index__key_field__fieldno->next->index = i->idx_name__namespace__index; + _name__namespace__index__key_field__fieldno->index = i->idx_name__namespace; + out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index__key_field__fieldno)); + } + if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field]->type != NULL && strcmp(c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field]->type, "") == 0) { + res++; + _name__namespace__index__key_field__type->next->next->index = i->idx_name__namespace__index__key_field; + _name__namespace__index__key_field__type->next->index = i->idx_name__namespace__index; + _name__namespace__index__key_field__type->index = i->idx_name__namespace; + out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index__key_field__type)); + } + } + + i->idx_name__namespace__index__key_field++; + } - if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field]->type != NULL && strcmp(c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field]->type, "") == 0) { - res++; - _name__namespace__index__key_field__type->next->next->index = i->idx_name__namespace__index__key_field; - _name__namespace__index__key_field__type->next->index = i->idx_name__namespace__index; - _name__namespace__index__key_field__type->index = i->idx_name__namespace; - out_warning(CNF_NOTSET, "Option '%s' is not set (or has a default value)", dumpOptDef(_name__namespace__index__key_field__type)); } - i->idx_name__namespace__index__key_field++; + i->idx_name__namespace__index++; } - i->idx_name__namespace__index++; } i->idx_name__namespace++; @@ -1598,19 +1693,19 @@ cleanFlags(tarantool_cfg* c, OptDef* opt) { if (c->namespace != NULL) { i->idx_name__namespace = 0; while (c->namespace[i->idx_name__namespace] != NULL) { - c->namespace[i->idx_name__namespace]->__confetti_flags = 0; + c->namespace[i->idx_name__namespace]->__confetti_flags &= ~CNF_FLAG_STRUCT_NEW; if (c->namespace[i->idx_name__namespace]->index != NULL) { i->idx_name__namespace__index = 0; while (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index] != NULL) { - c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->__confetti_flags = 0; + c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->__confetti_flags &= ~CNF_FLAG_STRUCT_NEW; if (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field != NULL) { i->idx_name__namespace__index__key_field = 0; while (c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field] != NULL) { - c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field]->__confetti_flags = 0; + c->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field]->__confetti_flags &= ~CNF_FLAG_STRUCT_NEW; i->idx_name__namespace__index__key_field++; @@ -1687,6 +1782,8 @@ dup_tarantool_cfg(tarantool_cfg* dst, tarantool_cfg* src) { dst->namespace = NULL; if (src->namespace != NULL) { i->idx_name__namespace = 0; + ARRAYALLOC(dst->namespace, 1, _name__namespace, 0, 0); + while (src->namespace[i->idx_name__namespace] != NULL) { ARRAYALLOC(dst->namespace, i->idx_name__namespace + 1, _name__namespace, 0, 0); @@ -1697,6 +1794,8 @@ dup_tarantool_cfg(tarantool_cfg* dst, tarantool_cfg* src) { dst->namespace[i->idx_name__namespace]->index = NULL; if (src->namespace[i->idx_name__namespace]->index != NULL) { i->idx_name__namespace__index = 0; + ARRAYALLOC(dst->namespace[i->idx_name__namespace]->index, 1, _name__namespace__index, 0, 0); + while (src->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index] != NULL) { ARRAYALLOC(dst->namespace[i->idx_name__namespace]->index, i->idx_name__namespace__index + 1, _name__namespace__index, 0, 0); @@ -1708,6 +1807,8 @@ dup_tarantool_cfg(tarantool_cfg* dst, tarantool_cfg* src) { dst->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field = NULL; if (src->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field != NULL) { i->idx_name__namespace__index__key_field = 0; + ARRAYALLOC(dst->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field, 1, _name__namespace__index__key_field, 0, 0); + while (src->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field[i->idx_name__namespace__index__key_field] != NULL) { ARRAYALLOC(dst->namespace[i->idx_name__namespace]->index[i->idx_name__namespace__index]->key_field, i->idx_name__namespace__index__key_field + 1, _name__namespace__index__key_field, 0, 0); diff --git a/cfg/tarantool_silverbox_cfg.cfg b/cfg/tarantool_silverbox_cfg.cfg index de8d1edb3e11d37d50ef0f03a2871435303cb78c..a10736571f9c87a9997d274882114f300b4cbe02 100644 --- a/cfg/tarantool_silverbox_cfg.cfg +++ b/cfg/tarantool_silverbox_cfg.cfg @@ -106,17 +106,14 @@ panic_on_wal_error = 0 remote_hot_standby = 0 wal_feeder_ipaddr = NULL wal_feeder_port = 0 -namespace = [ - { - enabled = 0 +namespace = [ { + enabled = -1 cardinality = -1 estimated_rows = 0 - index = [ - { + index = [ { type = "" unique = -1 - key_field = [ - { + key_field = [ { fieldno = -1 type = "" } diff --git a/cfg/tarantool_silverbox_cfg.h b/cfg/tarantool_silverbox_cfg.h index 149376684bda97522dd675be8e8d93b76103ae83..617fa98d3aeb6549ffc6cc9e5e7889c6a6a219be 100644 --- a/cfg/tarantool_silverbox_cfg.h +++ b/cfg/tarantool_silverbox_cfg.h @@ -160,6 +160,11 @@ typedef struct tarantool_cfg { tarantool_cfg_namespace** namespace; } tarantool_cfg; +#define CNF_FLAG_STRUCT_NEW 0x01 +#define CNF_FLAG_STRUCT_NOTSET 0x02 + +#define CNF_STRUCT_DEFINED(s) ((s) != NULL && ((s)->__confetti_flags & CNF_FLAG_STRUCT_NOTSET) == 0) + int fill_default_tarantool_cfg(tarantool_cfg *c); void parse_cfg_file_tarantool_cfg(tarantool_cfg *c, FILE *fh, int check_rdonly, int *n_accepted, int *n_skipped); @@ -172,9 +177,9 @@ int dup_tarantool_cfg(tarantool_cfg *dst, tarantool_cfg *src); void destroy_tarantool_cfg(tarantool_cfg *c); -char *cmp_tarantool_cfg(tarantool_cfg* c1, tarantool_cfg* c2, int only_check_rdonly) +char *cmp_tarantool_cfg(tarantool_cfg* c1, tarantool_cfg* c2, int only_check_rdonly); -;typedef struct tarantool_cfg_iterator_t tarantool_cfg_iterator_t; +typedef struct tarantool_cfg_iterator_t tarantool_cfg_iterator_t; tarantool_cfg_iterator_t* tarantool_cfg_iterator_init(); char* tarantool_cfg_iterator_next(tarantool_cfg_iterator_t* i, tarantool_cfg *c, char **v); diff --git a/core/tarantool.c b/core/tarantool.c index 9d5b6ddb0486312634427397dcf637947d45279b..9ca286288dec20c425bc23b7ea0f104ce321ee64 100644 --- a/core/tarantool.c +++ b/core/tarantool.c @@ -89,12 +89,13 @@ load_cfg(struct tarantool_cfg *conf, i32 check_rdonly) parse_cfg_file_tarantool_cfg(conf, f, check_rdonly, &n_accepted, &n_skipped); fclose(f); - if (n_accepted == 0 || n_skipped != 0) - return -1; if (check_cfg_tarantool_cfg(conf) != 0) return -1; + if (n_accepted == 0 || n_skipped != 0) + return -1; + return mod_check_config(conf); } diff --git a/mod/silverbox/box.c b/mod/silverbox/box.c index 8885d573af83c0ddc0d1bfcd73a135e272115f1f..069cd7a339396244f3c3872a959ce2097dbe1eae 100644 --- a/mod/silverbox/box.c +++ b/mod/silverbox/box.c @@ -1064,7 +1064,10 @@ custom_init(void) if (cfg.namespace[i] == NULL) break; - namespace[i].enabled = !!cfg.namespace[i]->enabled; + if (!CNF_STRUCT_DEFINED(cfg.namespace[i])) + namespace[i].enabled = false; + else + namespace[i].enabled = !!cfg.namespace[i]->enabled; if (!namespace[i].enabled) continue; diff --git a/mod/silverbox/silverbox_cfg.cfg_tmpl b/mod/silverbox/silverbox_cfg.cfg_tmpl index fa993db807c0d58a080fe9919bf26a9677f52b08..d6cd2b31440852d8ae58ce3f908acb5514fefe93 100644 --- a/mod/silverbox/silverbox_cfg.cfg_tmpl +++ b/mod/silverbox/silverbox_cfg.cfg_tmpl @@ -62,15 +62,21 @@ wal_feeder_port=0, ro namespace = [ - enabled = 0, ro, required - cardinality = -1, ro - estimated_rows = 0, ro - index = [ - type = "", ro, required - unique = -1, ro, required - key_field = [ - fieldno = -1, ro, required - type = "", ro, required - ], ro, required - ], ro, required + { + enabled = -1, required + cardinality = -1 + estimated_rows = 0 + index = [ + { + type = "", required + unique = -1, required + key_field = [ + { + fieldno = -1, required + type = "", required + }, ro, required + ], required + }, ro, required + ], required + }, ro ], ro, required diff --git a/test/box/tarantool_#708685.cfg b/test/box/tarantool_#708685.cfg new file mode 100644 index 0000000000000000000000000000000000000000..82042900fb34ff1ea23fc137e909844850d88f68 --- /dev/null +++ b/test/box/tarantool_#708685.cfg @@ -0,0 +1,21 @@ +slab_alloc_arena = 0.1 + +pid_file = "box.pid" + +primary_port = 33013 +secondary_port = 33014 +admin_port = 33015 + +rows_per_wal = 50 + +namespace[0].enabled = 1 +namespace[0].index[0].type = "HASH" +namespace[0].index[0].unique = 1 +namespace[0].index[0].key_field[0].fieldno = 0 +namespace[0].index[0].key_field[0].type = "NUM" + +namespace[2].enabled = 1 +namespace[2].index[0].type = "HASH" +namespace[2].index[0].unique = 1 +namespace[2].index[0].key_field[0].fieldno = 0 +namespace[2].index[0].key_field[0].type = "NUM" diff --git a/third_party/confetti/prscfg.c b/third_party/confetti/prscfg.c index fa30e44ae72d41b1d1a6fee026a25f093d98b636..e52d4931a3839de85a0ea47407a447f7afdb53d7 100644 --- a/third_party/confetti/prscfg.c +++ b/third_party/confetti/prscfg.c @@ -538,9 +538,9 @@ union yyalloc /* YYNNTS -- Number of nonterminals. */ #define YYNNTS 10 /* YYNRULES -- Number of rules. */ -#define YYNRULES 24 +#define YYNRULES 25 /* YYNRULES -- Number of states. */ -#define YYNSTATES 47 +#define YYNSTATES 48 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ #define YYUNDEFTOK 2 @@ -588,7 +588,7 @@ static const yytype_uint8 yyprhs[] = { 0, 0, 3, 5, 7, 9, 11, 16, 18, 22, 27, 31, 33, 37, 41, 45, 49, 53, 57, 64, - 71, 78, 80, 81, 86 + 71, 76, 83, 85, 86, 91 }; /* YYRHS -- A `-1'-separated list of the rules' RHS. */ @@ -601,9 +601,9 @@ static const yytype_int8 yyrhs[] = -1, 19, 11, 5, -1, 19, 11, 7, -1, 19, 11, 3, -1, 19, 11, 4, -1, 19, 11, 12, 21, 23, 13, -1, 19, 11, 8, 24, 23, 9, - -1, 20, 11, 12, 21, 23, 13, -1, 14, -1, - -1, 12, 21, 23, 13, -1, 24, 23, 12, 21, - 23, 13, -1 + -1, 19, 11, 8, 9, -1, 20, 11, 12, 21, + 23, 13, -1, 14, -1, -1, 12, 21, 23, 13, + -1, 24, 23, 12, 21, 23, 13, -1 }; /* YYRLINE[YYN] -- source line where rule number YYN was defined. */ @@ -611,7 +611,7 @@ static const yytype_uint8 yyrline[] = { 0, 92, 92, 96, 97, 101, 102, 111, 112, 116, 122, 126, 127, 131, 132, 133, 134, 135, 136, 137, - 138, 142, 143, 147, 158 + 138, 139, 143, 144, 148, 159 }; #endif @@ -642,7 +642,7 @@ static const yytype_uint8 yyr1[] = { 0, 15, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, 22, 22, 22, 22, 22, - 22, 23, 23, 24, 24 + 22, 22, 23, 23, 24, 24 }; /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ @@ -650,7 +650,7 @@ static const yytype_uint8 yyr2[] = { 0, 2, 1, 1, 1, 1, 4, 1, 3, 4, 3, 1, 3, 3, 3, 3, 3, 3, 6, 6, - 6, 1, 0, 4, 6 + 4, 6, 1, 0, 4, 6 }; /* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state @@ -658,17 +658,17 @@ static const yytype_uint8 yyr2[] = means the default is an error. */ static const yytype_uint8 yydefact[] = { - 0, 3, 4, 0, 5, 0, 0, 0, 22, 11, - 1, 0, 0, 0, 0, 21, 0, 0, 8, 10, + 0, 3, 4, 0, 5, 0, 0, 0, 23, 11, + 1, 0, 0, 0, 0, 22, 0, 0, 8, 10, 16, 17, 14, 13, 15, 0, 0, 0, 12, 6, - 0, 22, 22, 22, 22, 0, 0, 0, 0, 19, - 0, 18, 20, 23, 22, 0, 24 + 20, 0, 23, 23, 23, 23, 0, 0, 0, 0, + 19, 0, 18, 21, 24, 23, 0, 25 }; /* YYDEFGOTO[NTERM-NUM]. */ static const yytype_int8 yydefgoto[] = { - -1, 3, 4, 5, 6, 7, 8, 9, 16, 31 + -1, 3, 4, 5, 6, 7, 8, 9, 16, 32 }; /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing @@ -676,17 +676,17 @@ static const yytype_int8 yydefgoto[] = #define YYPACT_NINF -26 static const yytype_int8 yypact[] = { - 29, -26, -26, 6, -4, 4, 17, 24, 3, -26, - -26, 31, 29, 38, 26, -26, 29, 30, -26, -26, - -26, -26, -26, -26, -26, 35, 29, 29, -26, 37, - 29, 39, 39, 39, 39, 7, 5, 21, 23, -26, - 29, -26, -26, -26, 39, 27, -26 + 28, -26, -26, 10, -4, -5, 4, 23, 3, -26, + -26, 27, 28, 35, 32, -26, 28, 41, -26, -26, + -26, -26, -26, -26, -26, 36, 28, 28, -26, 25, + -26, 28, 38, 38, 38, 38, 37, 5, 16, 22, + -26, 28, -26, -26, -26, 38, 24, -26 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int8 yypgoto[] = { - -26, -26, -26, -26, 40, 42, -25, -16, -21, -26 + -26, -26, -26, -26, 39, 42, -25, -16, -21, -26 }; /* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If @@ -696,22 +696,22 @@ static const yytype_int8 yypgoto[] = #define YYTABLE_NINF -10 static const yytype_int8 yytable[] = { - 28, 32, 33, -2, 11, 34, 10, -7, 1, 2, - 35, 36, 37, 38, 12, 44, 39, 15, 41, 40, - 28, 28, 28, 45, 1, 2, 1, 2, 13, 28, - 1, 2, 1, 2, 42, 14, 43, 17, 27, 29, - 46, 20, 21, 22, 23, 24, 25, 30, -9, 0, - 26, 0, 18, 15, 19 + 28, 33, 34, -2, 11, 12, 35, -7, 1, 2, + 10, 36, 37, 38, 39, 13, 45, 15, 42, 1, + 2, 28, 28, 28, 46, 1, 2, 1, 2, 43, + 28, 1, 2, 17, 14, 44, -9, 47, 20, 21, + 22, 23, 24, 25, 27, 30, 40, 26, 31, 41, + 29, 18, 15, 0, 19 }; static const yytype_int8 yycheck[] = { - 16, 26, 27, 0, 8, 30, 0, 11, 3, 4, - 31, 32, 33, 34, 10, 40, 9, 14, 13, 12, - 36, 37, 38, 44, 3, 4, 3, 4, 11, 45, - 3, 4, 3, 4, 13, 11, 13, 6, 12, 9, - 13, 3, 4, 5, 6, 7, 8, 12, 11, -1, - 12, -1, 12, 14, 12 + 16, 26, 27, 0, 8, 10, 31, 11, 3, 4, + 0, 32, 33, 34, 35, 11, 41, 14, 13, 3, + 4, 37, 38, 39, 45, 3, 4, 3, 4, 13, + 46, 3, 4, 6, 11, 13, 11, 13, 3, 4, + 5, 6, 7, 8, 12, 9, 9, 12, 12, 12, + 9, 12, 14, -1, 12 }; /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing @@ -721,8 +721,8 @@ static const yytype_uint8 yystos[] = 0, 3, 4, 16, 17, 18, 19, 20, 21, 22, 0, 8, 10, 11, 11, 14, 23, 6, 19, 20, 3, 4, 5, 6, 7, 8, 12, 12, 22, 9, - 12, 24, 21, 21, 21, 23, 23, 23, 23, 9, - 12, 13, 13, 13, 21, 23, 13 + 9, 12, 24, 21, 21, 21, 23, 23, 23, 23, + 9, 12, 13, 13, 13, 21, 23, 13 }; #define yyerrok (yyerrstatus = 0) @@ -1678,14 +1678,14 @@ YYSTYPE yylval; /* Line 1455 of yacc.c */ #line 138 "prscfg.y" - { MakeScalarParam((yyval.node), struct, (yyvsp[(1) - (6)].atom), (yyvsp[(4) - (6)].node)); SetParent( (yyval.node), (yyvsp[(4) - (6)].node) ); } + { MakeScalarParam((yyval.node), array, (yyvsp[(1) - (4)].atom), NULL); } break; case 21: /* Line 1455 of yacc.c */ -#line 142 "prscfg.y" - { (yyval.str)=NULL; } +#line 139 "prscfg.y" + { MakeScalarParam((yyval.node), struct, (yyvsp[(1) - (6)].atom), (yyvsp[(4) - (6)].node)); SetParent( (yyval.node), (yyvsp[(4) - (6)].node) ); } break; case 22: @@ -1698,7 +1698,14 @@ YYSTYPE yylval; case 23: /* Line 1455 of yacc.c */ -#line 147 "prscfg.y" +#line 144 "prscfg.y" + { (yyval.str)=NULL; } + break; + + case 24: + +/* Line 1455 of yacc.c */ +#line 148 "prscfg.y" { OptDef *str; NameAtom *idx; @@ -1712,10 +1719,10 @@ YYSTYPE yylval; } break; - case 24: + case 25: /* Line 1455 of yacc.c */ -#line 158 "prscfg.y" +#line 159 "prscfg.y" { OptDef *str; NameAtom *idx; @@ -1733,7 +1740,7 @@ YYSTYPE yylval; /* Line 1455 of yacc.c */ -#line 1636 "y.tab.c" +#line 1643 "y.tab.c" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); @@ -1945,7 +1952,7 @@ YYSTYPE yylval; /* Line 1675 of yacc.c */ -#line 172 "prscfg.y" +#line 173 "prscfg.y" static int @@ -2061,7 +2068,28 @@ plainOptDef(OptDef *def, OptDef *list) { list = plainOptDef(def->paramValue.structval, list); break; case arrayType: - list = plainOptDef(def->paramValue.arrayval, list); + if (def->paramValue.arrayval == NULL) { + ptr = malloc(sizeof(*ptr)); + if (!ptr) { + out_warning(CNF_NOMEMORY, "No memory"); + freeCfgDef(def); + freeCfgDef(list); + return NULL; + } + *ptr = *def; + if (compileName(ptr)) { + freeName(ptr->name); + free(ptr); + freeCfgDef(def); + freeCfgDef(list); + return NULL; + } + ptr->parent = NULL; + ptr->next = list; + list = ptr; + } else { + list = plainOptDef(def->paramValue.arrayval, list); + } break; default: out_warning(CNF_INTERNALERROR, "Unkown paramType: %d", def->paramType); diff --git a/third_party/confetti/prscfg.h b/third_party/confetti/prscfg.h index 7012260257015a10a0403b4fff27381aed2129fe..ceeeab4e29ef39c42b1620fc38014a62d1adc38f 100644 --- a/third_party/confetti/prscfg.h +++ b/third_party/confetti/prscfg.h @@ -49,6 +49,4 @@ typedef enum ConfettyError { CNF_INTERNALERROR } ConfettyError; -#define CNF_FLAG_STRUCT_NEW 0x01 - #endif