diff --git a/extra/exports b/extra/exports index 1a20cc69ffd983424d60b7456b4a1f91af27b7f9..ffd11145d62750d2a53dfad9ebfeff853416b8b1 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 6253678a4509d1821e71d0ae0dc9af3e1f64d74a..bd454c26954cc6f5f6eee8858eb108b30ec03a78 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 with respect to output format: * YAML document tagged with !push! global tag or Lua string. diff --git a/src/box/lua/console.lua b/src/box/lua/console.lua index 7de94c81b1f676baa9f944e804703353ad8c699c..2add9a79d5e74a8d60450caffef45ad11b8c574d 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') @@ -173,17 +188,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 -- Used by console_session_push. diff --git a/src/box/session.h b/src/box/session.h index 1c47b898696f40810880d277baad15dbfab9492f..86937990cc8fb5e0a6d87c811fe8e59b244b7c5e 100644 --- a/src/box/session.h +++ b/src/box/session.h @@ -61,6 +61,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[]; /** @@ -75,11 +81,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; }; /** @@ -102,7 +112,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.