From: Chris Sosnin <k.sosnin@tarantool.org> To: korablev@tarantool.org, tarantool-patches@dev.tarantool.org Subject: [Tarantool-patches] [PATCH 3/4] box: provide a user friendly frontend for accessing session settings Date: Mon, 17 Feb 2020 15:12:11 +0300 [thread overview] Message-ID: <80558927f63a1ad49a4b7c699bfff0bedd727a11.1581940900.git.k.sosnin@tarantool.org> (raw) In-Reply-To: <cover.1581940899.git.k.sosnin@tarantool.org> - space_object:update() is hard to use for configuring session settings, so we provide box.session.setting table, which can be used in a much more native way. - Prior to this patch sql settings were not accessible before box.cfg() call, even though these flags can be set right after session creation. Part of #4711 --- src/box/lua/session.c | 92 +++++++++++++++++++ src/box/session.cc | 1 + src/box/session.h | 2 + src/box/sql.c | 5 - ...rontend.result => session_settings.result} | 63 +++++++++++++ ...end.test.lua => session_settings.test.lua} | 20 ++++ 6 files changed, 178 insertions(+), 5 deletions(-) rename test/box/{gh-4511-access-settings-from-any-frontend.result => session_settings.result} (86%) rename test/box/{gh-4511-access-settings-from-any-frontend.test.lua => session_settings.test.lua} (85%) diff --git a/src/box/lua/session.c b/src/box/lua/session.c index c6a600f6f..c0b4d6184 100644 --- a/src/box/lua/session.c +++ b/src/box/lua/session.c @@ -42,6 +42,8 @@ #include "box/user.h" #include "box/schema.h" #include "box/port.h" +#include "box/session_settings.h" +#include "tt_static.h" static const char *sessionlib_name = "box.session"; @@ -411,6 +413,95 @@ lbox_session_on_access_denied(struct lua_State *L) lbox_push_on_access_denied_event, NULL); } +static int +lbox_session_setting_get(struct lua_State *L) +{ + lua_getfield(L, -1, "_id"); + int sid = lua_tointeger(L, -1); + const char *mp_pair, *mp_pair_end; + session_settings[sid].get(sid, &mp_pair, &mp_pair_end); + uint32_t len; + mp_decode_array(&mp_pair); + mp_decode_str(&mp_pair, &len); + enum field_type field_type = session_settings[sid].field_type; + if (field_type == FIELD_TYPE_BOOLEAN) { + bool value = mp_decode_bool(&mp_pair); + lua_pushboolean(L, value); + } else { + const char *str = mp_decode_str(&mp_pair, &len); + lua_pushlstring(L, str, len); + } + return 1; +} + +static int +lbox_session_setting_set(struct lua_State *L) +{ + if (lua_gettop(L) != 2) + return luaL_error(L, "Usage: box.session.settings:set(value)"); + int arg_type = lua_type(L, -1); + lua_getfield(L, -2, "_id"); + int sid = lua_tointeger(L, -1); + struct session_setting *setting = &session_settings[sid]; + lua_pop(L, 1); + switch (arg_type) { + case LUA_TBOOLEAN: { + bool value = lua_toboolean(L, -1); + size_t size = mp_sizeof_bool(value); + char *mp_value = (char *) static_alloc(size); + mp_encode_bool(mp_value, value); + if (setting->set(sid, mp_value) != 0) + return luaT_push_nil_and_error(L); + break; + } + case LUA_TSTRING: { + const char *str = lua_tostring(L, -1); + size_t len = strlen(str); + uint32_t size = mp_sizeof_str(len); + char *mp_value = (char *) static_alloc(size); + if (mp_value == NULL) { + diag_set(OutOfMemory, size, "static_alloc", + "mp_value"); + return luaT_error(L); + } + mp_encode_str(mp_value, str, len); + if (setting->set(sid, mp_value) != 0) + return luaT_push_nil_and_error(L); + break; + } + default: + diag_set(ClientError, ER_SESSION_SETTING_INVALID_VALUE, + session_setting_strs[sid], + field_type_strs[setting->field_type]); + return luaT_push_nil_and_error(L); + } + return 0; +} + +static void +lbox_session_settings_init(struct lua_State *L) +{ + lua_createtable(L, 0, 2); + lua_pushcfunction(L, lbox_session_setting_get); + lua_setfield(L, -2, "__serialize"); + lua_createtable(L, 0, 1); + lua_pushcfunction(L, lbox_session_setting_set); + lua_setfield(L, -2, "set"); + lua_setfield(L, -2, "__index"); + + lua_newtable(L); + for (int id = 0; id < SESSION_SETTING_COUNT; ++id) { + lua_newtable(L); + lua_pushinteger(L, id); + lua_setfield(L, -2, "_id"); + lua_pushvalue(L, -3); + lua_setmetatable(L, -2); + lua_setfield(L, -2, session_setting_strs[id]); + } + lua_setfield(L, -3, "settings"); + lua_pop(L, 1); +} + void session_storage_cleanup(int sid) { @@ -478,5 +569,6 @@ box_lua_session_init(struct lua_State *L) {NULL, NULL} }; luaL_register_module(L, sessionlib_name, sessionlib); + lbox_session_settings_init(L); lua_pop(L, 1); } diff --git a/src/box/session.cc b/src/box/session.cc index 881318252..b557eed62 100644 --- a/src/box/session.cc +++ b/src/box/session.cc @@ -283,6 +283,7 @@ session_init() panic("out of memory"); mempool_create(&session_pool, &cord()->slabc, sizeof(struct session)); credentials_create(&admin_credentials, admin_user); + sql_session_settings_init(); } void diff --git a/src/box/session.h b/src/box/session.h index 6dfc7cba5..1c47b8986 100644 --- a/src/box/session.h +++ b/src/box/session.h @@ -41,6 +41,8 @@ extern "C" { #endif /* defined(__cplusplus) */ +extern void sql_session_settings_init(); + struct port; struct session_vtab; diff --git a/src/box/sql.c b/src/box/sql.c index 1256df856..ba98ce5df 100644 --- a/src/box/sql.c +++ b/src/box/sql.c @@ -64,14 +64,9 @@ static const uint32_t default_sql_flags = SQL_EnableTrigger | SQL_AutoIndex | SQL_RecTriggers; -extern void -sql_session_settings_init(); - void sql_init() { - sql_session_settings_init(); - default_flags |= default_sql_flags; current_session()->sql_flags |= default_sql_flags; diff --git a/test/box/gh-4511-access-settings-from-any-frontend.result b/test/box/session_settings.result similarity index 86% rename from test/box/gh-4511-access-settings-from-any-frontend.result rename to test/box/session_settings.result index bae77192e..6d7074e8c 100644 --- a/test/box/gh-4511-access-settings-from-any-frontend.result +++ b/test/box/session_settings.result @@ -298,3 +298,66 @@ s:update('sql_defer_foreign_keys', {{'=', 'value', '1'}}) | --- | - error: Session setting sql_defer_foreign_keys expected a value of type boolean | ... + +-- gh-4711: Provide a user-friendly frontend for accessing session settings. +settings = box.session.settings + | --- + | ... +assert(settings ~= nil) + | --- + | - true + | ... + +s:update('sql_default_engine', {{'=', 2, 'vinyl'}}) + | --- + | - ['sql_default_engine', 'vinyl'] + | ... +settings.sql_default_engine + | --- + | - vinyl + | ... +settings.sql_default_engine:set('memtx') + | --- + | ... +s:get('sql_default_engine').value + | --- + | - memtx + | ... +settings.sql_defer_foreign_keys:set(true) + | --- + | ... +s:get('sql_defer_foreign_keys').value + | --- + | - true + | ... +s:update('sql_defer_foreign_keys', {{'=', 2, false}}) + | --- + | - ['sql_defer_foreign_keys', false] + | ... +settings.sql_defer_foreign_keys + | --- + | - false + | ... + +settings.sql_default_engine:set(true) + | --- + | - null + | - Session setting sql_default_engine expected a value of type string + | ... +settings.sql_defer_foreign_keys:set(false, 1, 2, 3) + | --- + | - error: 'Usage: box.session.settings:set(value)' + | ... +settings.sql_parser_debug:set('string') + | --- + | - null + | - Session setting sql_parser_debug expected a value of type boolean + | ... + +str = string.rep('a', 20 * 1024) + | --- + | ... +box.session.settings.sql_default_engine:set(str) + | --- + | - error: Failed to allocate 20483 bytes in static_alloc for mp_value + | ... diff --git a/test/box/gh-4511-access-settings-from-any-frontend.test.lua b/test/box/session_settings.test.lua similarity index 85% rename from test/box/gh-4511-access-settings-from-any-frontend.test.lua rename to test/box/session_settings.test.lua index b243be15e..23799874a 100644 --- a/test/box/gh-4511-access-settings-from-any-frontend.test.lua +++ b/test/box/session_settings.test.lua @@ -118,3 +118,23 @@ s:update('sql_defer_foreign_keys', {{'=', 'some text', true}}) s:update('sql_defer_foreign_keys', {{'=', 'value', 1}}) s:update('sql_defer_foreign_keys', {{'=', 'value', {1}}}) s:update('sql_defer_foreign_keys', {{'=', 'value', '1'}}) + +-- gh-4711: Provide a user-friendly frontend for accessing session settings. +settings = box.session.settings +assert(settings ~= nil) + +s:update('sql_default_engine', {{'=', 2, 'vinyl'}}) +settings.sql_default_engine +settings.sql_default_engine:set('memtx') +s:get('sql_default_engine').value +settings.sql_defer_foreign_keys:set(true) +s:get('sql_defer_foreign_keys').value +s:update('sql_defer_foreign_keys', {{'=', 2, false}}) +settings.sql_defer_foreign_keys + +settings.sql_default_engine:set(true) +settings.sql_defer_foreign_keys:set(false, 1, 2, 3) +settings.sql_parser_debug:set('string') + +str = string.rep('a', 20 * 1024) +box.session.settings.sql_default_engine:set(str) -- 2.21.1 (Apple Git-122.3)
next prev parent reply other threads:[~2020-02-17 12:12 UTC|newest] Thread overview: 22+ messages / expand[flat|nested] mbox.gz Atom feed top 2020-02-17 12:12 [Tarantool-patches] [PATCH 0/4] box: session settings fixes Chris Sosnin 2020-02-17 12:12 ` [Tarantool-patches] [PATCH 1/4] box: replace session_settings modules with a single array Chris Sosnin 2020-02-17 12:12 ` [Tarantool-patches] [PATCH 2/4] box: add binary search for _session_settings space Chris Sosnin 2020-03-16 14:16 ` Nikita Pettik 2020-03-16 22:53 ` Vladislav Shpilevoy 2020-03-17 17:24 ` Nikita Pettik 2020-02-17 12:12 ` Chris Sosnin [this message] 2020-03-16 16:08 ` [Tarantool-patches] [PATCH 3/4] box: provide a user friendly frontend for accessing session settings Nikita Pettik 2020-03-16 22:53 ` Vladislav Shpilevoy 2020-03-17 14:27 ` Nikita Pettik 2020-03-17 14:36 ` Chris Sosnin 2020-02-17 12:12 ` [Tarantool-patches] [PATCH 4/4] sql: " Chris Sosnin 2020-03-16 17:02 ` Nikita Pettik 2020-03-16 22:53 ` Vladislav Shpilevoy 2020-03-17 17:26 ` Chris Sosnin 2020-03-17 20:12 ` Nikita Pettik 2020-03-17 21:00 ` Chris Sosnin 2020-03-18 10:00 ` Chris Sosnin -- strict thread matches above, loose matches on Subject: below -- 2020-03-30 9:13 [Tarantool-patches] [PATCH 0/4] session settings fixes Chris Sosnin 2020-03-30 9:13 ` [Tarantool-patches] [PATCH 3/4] box: provide a user friendly frontend for accessing session settings Chris Sosnin 2020-04-03 14:47 ` Nikita Pettik 2020-02-03 22:17 [Tarantool-patches] [PATCH v4 3/3] " Vladislav Shpilevoy 2020-02-04 19:31 ` [Tarantool-patches] [PATCH 3/4] " Chris Sosnin 2020-02-06 22:15 ` Vladislav Shpilevoy
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=80558927f63a1ad49a4b7c699bfff0bedd727a11.1581940900.git.k.sosnin@tarantool.org \ --to=k.sosnin@tarantool.org \ --cc=korablev@tarantool.org \ --cc=tarantool-patches@dev.tarantool.org \ --subject='Re: [Tarantool-patches] [PATCH 3/4] box: provide a user friendly frontend for accessing session settings' \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: link
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox