From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from localhost (localhost [127.0.0.1]) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTP id 09B41244DC for ; Thu, 5 Sep 2019 17:28:43 -0400 (EDT) Received: from turing.freelists.org ([127.0.0.1]) by localhost (turing.freelists.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id DwuN6ooSIrUd for ; Thu, 5 Sep 2019 17:28:42 -0400 (EDT) Received: from mail-lj1-f196.google.com (mail-lj1-f196.google.com [209.85.208.196]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by turing.freelists.org (Avenir Technologies Mail Multiplex) with ESMTPS id B881020BA1 for ; Thu, 5 Sep 2019 17:28:42 -0400 (EDT) Received: by mail-lj1-f196.google.com with SMTP id u14so3976256ljj.11 for ; Thu, 05 Sep 2019 14:28:42 -0700 (PDT) From: Cyrill Gorcunov Subject: [tarantool-patches] [PATCH 2/6] box/console: Add explicit output EOS mapping Date: Fri, 6 Sep 2019 00:28:11 +0300 Message-Id: <20190905212815.7311-3-gorcunov@gmail.com> In-Reply-To: <20190905212815.7311-1-gorcunov@gmail.com> References: <20190905212815.7311-1-gorcunov@gmail.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Sender: tarantool-patches-bounce@freelists.org Errors-to: tarantool-patches-bounce@freelists.org Reply-To: tarantool-patches@freelists.org List-Help: List-Unsubscribe: List-software: Ecartis version 1.0.0 List-Id: tarantool-patches List-Subscribe: List-Owner: List-post: List-Archive: To: tml Cc: Konstantin Osipov , Alexander Turenko , Cyrill Gorcunov This will help us to distinguish end of string/stream in text protocols (such as remote console connection). Note that we start printing ";" terminator for every lua output. Actually current yaml output does the same but inside console.c module. And since lua output is yet a new feature in stabilization phase we're safe to make such changes without breaking api. We keep the eos values in table because we will need to fetch eos from active format in later patches, thus it is easier to use dictionary here. Moreover in future we might need to extend this eos table for other serializers. Part-of #3834 --- src/box/lua/console.lua | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/box/lua/console.lua b/src/box/lua/console.lua index 22bafab3a..5430e6787 100644 --- a/src/box/lua/console.lua +++ b/src/box/lua/console.lua @@ -11,7 +11,6 @@ local urilib = require('uri') local yaml = require('yaml') local net_box = require('net.box') -local YAML_TERM = '\n...\n' local PUSH_TAG_HANDLE = '!push!' -- @@ -20,6 +19,11 @@ local PUSH_TAG_HANDLE = '!push!' local default_output_format = { ["fmt"] = "yaml", ["opts"] = nil } local output_handlers = { } +-- +-- End of streams/strings. They will allow to recognize blocks +-- depending on output format. +local output_eos = { ["yaml"] = '\n...\n', ["lua"] = ';' } + output_handlers["yaml"] = function(status, opts, ...) local err if status then @@ -42,9 +46,11 @@ end output_handlers["lua"] = function(status, opts, ...) -- - -- Don't print nil if there is no data + -- If no data present at least EOS should be put, + -- otherwise wire readers won't be able to find + -- where end of string is. if not ... then - return "" + return output_eos["lua"] end -- Map internal symbols in case if they are -- not inside tables and serpent won't handle @@ -54,7 +60,7 @@ output_handlers["lua"] = function(status, opts, ...) } for k,v in pairs(map_direct_symbols) do if k == ... then - return v + return v .. output_eos["lua"] end end -- @@ -75,9 +81,9 @@ output_handlers["lua"] = function(status, opts, ...) nocode = true, } if opts == "block" then - return serpent.block(..., serpent_opts) + return serpent.block(..., serpent_opts) .. output_eos["lua"] end - return serpent.line(..., serpent_opts) + return serpent.line(..., serpent_opts) .. output_eos["lua"] end local function output_verify_opts(fmt, opts) @@ -309,7 +315,7 @@ local text_connection_mt = { -- @retval nil Error. -- read = function(self) - local ret = self._socket:read(YAML_TERM) + local ret = self._socket:read(output_eos["yaml"]) if ret and ret ~= '' then return ret end -- 2.20.1