[Tarantool-patches] [PATCH 1/2] session: store output format in struct session
Chris Sosnin
k.sosnin at tarantool.org
Mon Apr 6 17:33:29 MSK 2020
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)
More information about the Tarantool-patches
mailing list