From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp40.i.mail.ru (smtp40.i.mail.ru [94.100.177.100]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id B1CA94696C3 for ; Mon, 6 Apr 2020 17:33:32 +0300 (MSK) From: Chris Sosnin Date: Mon, 6 Apr 2020 17:33:29 +0300 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH 1/2] session: store output format in struct session List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tarantool-patches@dev.tarantool.org, korablev@tarantool.org box.session.storage is a general-purpose table, which can be used by user. Therefore, we shouldn't store any internal details in it. Needed for #4686 --- extra/exports | 2 ++ src/box/lua/console.c | 12 ++++++++++++ src/box/lua/console.lua | 36 +++++++++++++++++++++++++++++------- src/box/session.h | 22 ++++++++++++++++------ 4 files changed, 59 insertions(+), 13 deletions(-) diff --git a/extra/exports b/extra/exports index cbb5adcf4..f71cb7d93 100644 --- a/extra/exports +++ b/extra/exports @@ -43,6 +43,8 @@ tnt_iconv_close tnt_iconv exception_get_string exception_get_int +console_get_output_format +console_set_output_format tarantool_lua_ibuf uuid_nil diff --git a/src/box/lua/console.c b/src/box/lua/console.c index 57e7e7f4f..603f7c11b 100644 --- a/src/box/lua/console.c +++ b/src/box/lua/console.c @@ -377,6 +377,18 @@ console_session_fd(struct session *session) return session->meta.fd; } +enum output_format +console_get_output_format() +{ + return current_session()->meta.output_format; +} + +void +console_set_output_format(enum output_format output_format) +{ + current_session()->meta.output_format = output_format; +} + /** * Dump port lua data as a YAML document tagged with !push! global * tag. diff --git a/src/box/lua/console.lua b/src/box/lua/console.lua index 17e2c91b2..7208d3d30 100644 --- a/src/box/lua/console.lua +++ b/src/box/lua/console.lua @@ -2,6 +2,21 @@ -- -- vim: ts=4 sw=4 et +local ffi = require('ffi') +ffi.cdef[[ + enum output_format { + OUTPUT_FORMAT_YAML = 0, + OUTPUT_FORMAT_LUA_LINE, + OUTPUT_FORMAT_LUA_BLOCK, + }; + + enum output_format + console_get_output_format(); + + void + console_set_output_format(enum output_format output_format); +]] + local serpent = require('serpent') local internal = require('console') local session_internal = require('box.internal.session') @@ -172,17 +187,24 @@ local function output_save(fmt, opts) -- Output format descriptors are saved per -- session thus each console may specify -- own mode. - box.session.storage.console_output_format = { - ["fmt"] = fmt, ["opts"] = opts - } + if fmt == "yaml" then + ffi.C.console_set_output_format(ffi.C.OUTPUT_FORMAT_YAML) + elseif fmt == "lua" and opts == "block" then + ffi.C.console_set_output_format(ffi.C.OUTPUT_FORMAT_LUA_BLOCK) + else + ffi.C.console_set_output_format(ffi.C.OUTPUT_FORMAT_LUA_LINE) + end end local function current_output() - local d = box.session.storage.console_output_format - if d == nil then - return default_output_format + local fmt = ffi.C.console_get_output_format() + if fmt == ffi.C.OUTPUT_FORMAT_YAML then + return { ["fmt"] = "yaml", ["opts"] = nil } + elseif fmt == ffi.C.OUTPUT_FORMAT_LUA_LINE then + return { ["fmt"] = "lua", ["opts"] = "line" } + elseif fmt == ffi.C.OUTPUT_FORMAT_LUA_BLOCK then + return { ["fmt"] = "lua", ["opts"] = "block" } end - return d end -- diff --git a/src/box/session.h b/src/box/session.h index 6dfc7cba5..9ade6e7a5 100644 --- a/src/box/session.h +++ b/src/box/session.h @@ -59,6 +59,12 @@ enum session_type { session_type_MAX, }; +enum output_format { + OUTPUT_FORMAT_YAML = 0, + OUTPUT_FORMAT_LUA_LINE, + OUTPUT_FORMAT_LUA_BLOCK, +}; + extern const char *session_type_strs[]; /** @@ -73,11 +79,15 @@ extern uint32_t default_flags; * types, and allows to do not store attributes in struct session, * that are used only by a session of particular type. */ -union session_meta { - /** IProto connection. */ - void *connection; - /** Console file/socket descriptor. */ - int fd; +struct session_meta { + union { + /** IProto connection. */ + void *connection; + /** Console file/socket descriptor. */ + int fd; + }; + /** Console output format. */ + enum output_format output_format; }; /** @@ -100,7 +110,7 @@ struct session { /** Session virtual methods. */ const struct session_vtab *vtab; /** Session metadata. */ - union session_meta meta; + struct session_meta meta; /** * ID of statements prepared in current session. * This map is allocated on demand. -- 2.21.1 (Apple Git-122.3)