From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Vladislav Shpilevoy Subject: [PATCH 1/2] box: move info_handler interface into src/info Date: Tue, 4 Dec 2018 00:47:05 +0300 Message-Id: In-Reply-To: References: In-Reply-To: References: To: tarantool-patches@freelists.org Cc: vdavydov.dev@gmail.com List-ID: Box/info.h defines info_handler interface with a set of virtual functions. It allows to hide Lua from code not depending on this language, and is used in things like index:info(), box.info() to build Lua table with some info. But it does not depend on box/ so move it to src/. Also, this API is needed for the forthcoming SWIM module which is going to be placed into src/lib and needs info to dump its state to Lua from C without strict Lua dependency. Needed for #3234 --- src/CMakeLists.txt | 1 + src/box/lua/index.c | 4 +- src/box/lua/info.c | 78 +------------------------------ src/box/lua/sql.c | 4 +- src/box/lua/stat.c | 4 +- src/box/sql.c | 2 +- src/{box => }/info.h | 6 +-- src/lua/info.c | 107 +++++++++++++++++++++++++++++++++++++++++++ src/lua/info.h | 49 ++++++++++++++++++++ 9 files changed, 169 insertions(+), 86 deletions(-) rename src/{box => }/info.h (97%) create mode 100644 src/lua/info.c create mode 100644 src/lua/info.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e004f2154..7d0734f55 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -179,6 +179,7 @@ set (server_sources lua/crypto.c lua/httpc.c lua/utf8.c + lua/info.c ${lua_sources} ${PROJECT_SOURCE_DIR}/third_party/lua-yaml/lyaml.cc ${PROJECT_SOURCE_DIR}/third_party/lua-yaml/b64.c diff --git a/src/box/lua/index.c b/src/box/lua/index.c index ef89c397d..6265c044a 100644 --- a/src/box/lua/index.c +++ b/src/box/lua/index.c @@ -30,10 +30,10 @@ */ #include "box/lua/index.h" #include "lua/utils.h" +#include "lua/info.h" +#include #include "box/box.h" #include "box/index.h" -#include "box/info.h" -#include "box/lua/info.h" #include "box/lua/tuple.h" #include "box/lua/misc.h" /* lbox_encode_tuple_on_gc() */ diff --git a/src/box/lua/info.c b/src/box/lua/info.c index 03b953288..f94121e61 100644 --- a/src/box/lua/info.c +++ b/src/box/lua/info.c @@ -32,7 +32,7 @@ #define _GNU_SOURCE #endif -#include "box/lua/info.h" +#include "lua/info.h" #include /* tolower() */ @@ -45,7 +45,7 @@ #include "box/iproto.h" #include "box/wal.h" #include "box/replication.h" -#include "box/info.h" +#include #include "box/gc.h" #include "box/engine.h" #include "box/vinyl.h" @@ -448,80 +448,6 @@ lbox_info_gc(struct lua_State *L) return 1; } -static void -luaT_info_begin(struct info_handler *info) -{ - lua_State *L = (lua_State *) info->ctx; - lua_newtable(L); -} - -static void -luaT_info_end(struct info_handler *info) -{ - (void) info; -} - -static void -luaT_info_begin_table(struct info_handler *info, const char *key) -{ - lua_State *L = (lua_State *) info->ctx; - lua_pushstring(L, key); - lua_newtable(L); -} - -static void -luaT_info_end_table(struct info_handler *info) -{ - lua_State *L = (lua_State *) info->ctx; - lua_settable(L, -3); -} - -static void -luaT_info_append_double(struct info_handler *info, - const char *key, double value) -{ - lua_State *L = (lua_State *) info->ctx; - lua_pushstring(L, key); - lua_pushnumber(L, value); - lua_settable(L, -3); -} - -static void -luaT_info_append_int(struct info_handler *info, const char *key, - int64_t value) -{ - lua_State *L = (lua_State *) info->ctx; - lua_pushstring(L, key); - luaL_pushint64(L, value); - lua_settable(L, -3); -} - -static void -luaT_info_append_str(struct info_handler *info, const char *key, - const char *value) -{ - lua_State *L = (lua_State *) info->ctx; - lua_pushstring(L, key); - lua_pushstring(L, value); - lua_settable(L, -3); -} - -void -luaT_info_handler_create(struct info_handler *h, struct lua_State *L) -{ - static struct info_handler_vtab lua_vtab = { - .begin = luaT_info_begin, - .end = luaT_info_end, - .begin_table = luaT_info_begin_table, - .end_table = luaT_info_end_table, - .append_int = luaT_info_append_int, - .append_str = luaT_info_append_str, - .append_double = luaT_info_append_double - }; - h->vtab = &lua_vtab; - h->ctx = L; -} - static int lbox_info_vinyl_call(struct lua_State *L) { diff --git a/src/box/lua/sql.c b/src/box/lua/sql.c index 17e269423..692366607 100644 --- a/src/box/lua/sql.c +++ b/src/box/lua/sql.c @@ -3,9 +3,9 @@ #include "lua/msgpack.h" #include "box/sql/sqliteInt.h" -#include "box/info.h" +#include +#include "lua/info.h" #include "lua/utils.h" -#include "info.h" static void lua_push_column_names(struct lua_State *L, struct sqlite3_stmt *stmt) diff --git a/src/box/lua/stat.c b/src/box/lua/stat.c index 83a5b64e6..3fce81f61 100644 --- a/src/box/lua/stat.c +++ b/src/box/lua/stat.c @@ -42,8 +42,8 @@ #include "box/iproto.h" #include "box/engine.h" #include "box/vinyl.h" -#include "box/info.h" -#include "box/lua/info.h" +#include +#include "lua/info.h" #include "lua/utils.h" extern struct rmean *rmean_box; diff --git a/src/box/sql.c b/src/box/sql.c index c3418008c..1fcd3e809 100644 --- a/src/box/sql.c +++ b/src/box/sql.c @@ -36,7 +36,7 @@ #include "sql/vdbeInt.h" #include "index.h" -#include "info.h" +#include #include "schema.h" #include "box.h" #include "txn.h" diff --git a/src/box/info.h b/src/info.h similarity index 97% rename from src/box/info.h rename to src/info.h index df82becd5..0198c31d4 100644 --- a/src/box/info.h +++ b/src/info.h @@ -1,5 +1,5 @@ -#ifndef INCLUDES_TARANTOOL_BOX_INFO_H -#define INCLUDES_TARANTOOL_BOX_INFO_H +#ifndef INCLUDES_TARANTOOL_INFO_H +#define INCLUDES_TARANTOOL_INFO_H /* * Copyright 2010-2017, Tarantool AUTHORS, please see AUTHORS file. * @@ -195,4 +195,4 @@ info_table_end(struct info_handler *info) } /* extern "C" */ #endif /* defined(__cplusplus) */ -#endif /* INCLUDES_TARANTOOL_BOX_INFO_H */ +#endif /* INCLUDES_TARANTOOL_INFO_H */ diff --git a/src/lua/info.c b/src/lua/info.c new file mode 100644 index 000000000..5ccbc611c --- /dev/null +++ b/src/lua/info.c @@ -0,0 +1,107 @@ +/* + * Copyright 2010-2018, Tarantool AUTHORS, please see AUTHORS file. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ +#include "lua/info.h" +#include +#include "lua/utils.h" + +static void +luaT_info_begin(struct info_handler *info) +{ + lua_State *L = (lua_State *) info->ctx; + lua_newtable(L); +} + +static void +luaT_info_end(struct info_handler *info) +{ + (void) info; +} + +static void +luaT_info_begin_table(struct info_handler *info, const char *key) +{ + lua_State *L = (lua_State *) info->ctx; + lua_pushstring(L, key); + lua_newtable(L); +} + +static void +luaT_info_end_table(struct info_handler *info) +{ + lua_State *L = (lua_State *) info->ctx; + lua_settable(L, -3); +} + +static void +luaT_info_append_double(struct info_handler *info, + const char *key, double value) +{ + lua_State *L = (lua_State *) info->ctx; + lua_pushstring(L, key); + lua_pushnumber(L, value); + lua_settable(L, -3); +} + +static void +luaT_info_append_int(struct info_handler *info, const char *key, + int64_t value) +{ + lua_State *L = (lua_State *) info->ctx; + lua_pushstring(L, key); + luaL_pushint64(L, value); + lua_settable(L, -3); +} + +static void +luaT_info_append_str(struct info_handler *info, const char *key, + const char *value) +{ + lua_State *L = (lua_State *) info->ctx; + lua_pushstring(L, key); + lua_pushstring(L, value); + lua_settable(L, -3); +} + +void +luaT_info_handler_create(struct info_handler *h, struct lua_State *L) +{ + static struct info_handler_vtab lua_vtab = { + .begin = luaT_info_begin, + .end = luaT_info_end, + .begin_table = luaT_info_begin_table, + .end_table = luaT_info_end_table, + .append_int = luaT_info_append_int, + .append_str = luaT_info_append_str, + .append_double = luaT_info_append_double + }; + h->vtab = &lua_vtab; + h->ctx = L; +} diff --git a/src/lua/info.h b/src/lua/info.h new file mode 100644 index 000000000..712d0f78d --- /dev/null +++ b/src/lua/info.h @@ -0,0 +1,49 @@ +#ifndef INCLUDES_TARANTOOL_LUA_INFO_H +#define INCLUDES_TARANTOOL_LUA_INFO_H + +/* + * Copyright 2010-2016, Tarantool AUTHORS, please see AUTHORS file. + * + * Redistribution and use in source and binary forms, with or + * without modification, are permitted provided that the following + * conditions are met: + * + * 1. Redistributions of source code must retain the above + * copyright notice, this list of conditions and the + * following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following + * disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL + * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR + * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF + * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#if defined(__cplusplus) +extern "C" { +#endif /* defined(__cplusplus) */ + +struct lua_State; +struct info_handler; + +void +luaT_info_handler_create(struct info_handler *h, struct lua_State *L); + +#if defined(__cplusplus) +} /* extern "C" */ +#endif /* defined(__cplusplus) */ + +#endif /* INCLUDES_TARANTOOL_LUA_INFO_H */ -- 2.17.2 (Apple Git-113)