From 20fad78eea246f154be8734f5a38ca20953f5b9f Mon Sep 17 00:00:00 2001
From: Dmitry Simonenko <pmwkaa@gmail.com>
Date: Tue, 27 Aug 2013 15:23:11 +0400
Subject: [PATCH] lua-plus-dict: convert any tuple to table for proper yaml
 output, fix end-of-document marker for multi documents return.

---
 src/admin.cc                 | 10 ----------
 src/lua/init.cc              | 18 ++++++++++++++++--
 third_party/lua-yaml/lyaml.c |  6 +-----
 3 files changed, 17 insertions(+), 17 deletions(-)

diff --git a/src/admin.cc b/src/admin.cc
index e452cd4460..a0a74501ef 100644
--- a/src/admin.cc
+++ b/src/admin.cc
@@ -68,17 +68,7 @@ admin_dispatch(struct ev_io *coio, struct iobuf *iobuf, lua_State *L)
 			return -1;
 	}
 	eol[0] = '\0';
-
 	tarantool_lua(L, out, in->pos);
-
-	/* put end-of-document if the output doesn't has one */
-	int eof =
-	((out->size >= 4 && !memcmp(out->data + out->size - 4, "...\n", 4)) ||
-	 (out->size >= 5 && !memcmp(out->data + out->size - 5, "...\n\n", 5)));
-
-	if (! eof)
-		tbuf_printf(out, "...\n");
-
 	in->pos = (eol + 1);
 	coio_write(coio, out->data, out->size);
 	return 0;
diff --git a/src/lua/init.cc b/src/lua/init.cc
index aef9371b39..9045960ba5 100644
--- a/src/lua/init.cc
+++ b/src/lua/init.cc
@@ -656,13 +656,27 @@ tarantool_lua(struct lua_State *L,
 		lua_replace(L, 1);
 		assert(lua_gettop(L) == 1);
 	}
-	/* Convert Lua stack to YAML and append to the given tbuf. */
+	/* Convert Lua stack to YAML and append to the given tbuf */
 	int top = lua_gettop(L);
 	if (top == 0) {
-		tbuf_printf(out, "---\n");
+		tbuf_printf(out, "---\n...\n");
 		lua_settop(L, 0);
 		return;
 	}
+	/* convert all tuples to tables */
+	for (int i = 1; i <= top; i++) {
+		if (lua_getmetatable(L, i) == 0)
+			continue;
+		luaL_getmetatable(L, "box.tuple");
+		int is_tuple = 0;
+		if (lua_equal(L, -1, -2))
+			is_tuple = 1;
+		lua_pop(L, 2);
+		if (is_tuple) {
+			luaL_callmeta(L, i, "totable");
+			lua_replace(L, i);
+		}
+	}
 	yamlL_encode(L);
 	lua_replace(L, 1);
 	lua_pop(L, 1);
diff --git a/third_party/lua-yaml/lyaml.c b/third_party/lua-yaml/lyaml.c
index 23b0f869f8..9c2a67dc59 100644
--- a/third_party/lua-yaml/lyaml.c
+++ b/third_party/lua-yaml/lyaml.c
@@ -549,10 +549,6 @@ static int figure_table_type(lua_State *L) {
 
 static int dump_null(struct lua_yaml_dumper *dumper) {
    yaml_event_t ev;
-   /*
-   yaml_scalar_event_initialize(&ev, NULL, NULL,
-      (unsigned char *)"~", 1, 1, 1, YAML_PLAIN_SCALAR_STYLE);
-	  */
    yaml_scalar_event_initialize(&ev, NULL, NULL,
       (unsigned char *)"null", 4, 1, 1, YAML_PLAIN_SCALAR_STYLE);
    return yaml_emitter_emit(&dumper->emitter, &ev);
@@ -606,7 +602,7 @@ static void dump_document(struct lua_yaml_dumper *dumper) {
    if (!dump_node(dumper) || dumper->error)
       return;
 
-   yaml_document_end_event_initialize(&ev, 1);
+   yaml_document_end_event_initialize(&ev, 0);
    yaml_emitter_emit(&dumper->emitter, &ev);
 }
 
-- 
GitLab