diff --git a/src/cfg.cc b/src/cfg.cc index 4e01437ac4a218e00301101c1aeab6db0ca4a6fa..81b4b6b43d4c94a6480dfd0459d77cf6daae4ff4 100644 --- a/src/cfg.cc +++ b/src/cfg.cc @@ -52,22 +52,27 @@ cfg_geti(const char *param) return val; } -const char * -cfg_gets(const char *param) +static const char * +cfg_converts(struct lua_State *L) { - /* Support simultaneous cfg_gets("str1") and cfg_gets("str2") */ static char __thread values[MAX_STR_OPTS][MAX_OPT_VAL_LEN]; static int __thread i = 0; - struct lua_State *L = tarantool_L; - char *val; - cfg_get(param); if (lua_isnil(L, -1)) - val = NULL; + return NULL; else { - val = values[i++ % MAX_STR_OPTS]; - snprintf(val, MAX_OPT_VAL_LEN, "%s", lua_tostring(L, -1)); + snprintf(values[i % MAX_STR_OPTS], MAX_OPT_VAL_LEN, + "%s", lua_tostring(L, -1)); + return values[i++ % MAX_STR_OPTS]; } - lua_pop(L, 1); +} + +const char * +cfg_gets(const char *param) +{ + /* Support simultaneous cfg_gets("str1") and cfg_gets("str2") */ + cfg_get(param); + const char *val = cfg_converts(tarantool_L); + lua_pop(tarantool_L, 1); return val; } @@ -80,3 +85,24 @@ cfg_getd(const char *param) return val; } +int +cfg_getarr_size(const char *name) +{ + cfg_get(name); + luaL_checktype(tarantool_L, -1, LUA_TTABLE); + int result = luaL_getn(tarantool_L, -1); + lua_pop(tarantool_L, 1); + return result; +} + +const char * +cfg_getarr_elem(const char *name, int i) +{ + cfg_get(name); + luaL_checktype(tarantool_L, -1, LUA_TTABLE); + lua_rawgeti(tarantool_L, -1, i + 1); + const char *val = cfg_converts(tarantool_L); + lua_pop(tarantool_L, 2); + return val; +} + diff --git a/src/cfg.h b/src/cfg.h index 7bdefc022367aa471bc0ea2fe118b05b88fefff7..586f50628dcbb0efa76b799ef21bee431832269e 100644 --- a/src/cfg.h +++ b/src/cfg.h @@ -36,4 +36,11 @@ cfg_gets(const char *param); double cfg_getd(const char *param); + +int +cfg_getarr_size(const char *name); + +const char * +cfg_getarr_elem(const char *name, int i); + #endif /* INCLUDES_TARANTOOL_CFG_H */