From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Vladislav Shpilevoy Subject: [PATCH 01/11] box: move info_handler interface into src/info Date: Fri, 30 Nov 2018 18:39:31 +0300 Message-Id: <265787a088a3b0625966ee726c16831e5cc877e4.1543590433.git.v.shpilevoy@tarantool.org> 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/. And alongside apply a bit refactoring: remove useless comments, comply with line width etc. Also, this API is needed for the forthcoming SWIM module which is going to be placed into src/. 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 | 84 +++++++++++++++--------------- src/lua/info.c | 118 +++++++++++++++++++++++++++++++++++++++++++ src/lua/info.h | 49 ++++++++++++++++++ 9 files changed, 218 insertions(+), 126 deletions(-) rename src/{box => }/info.h (72%) 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 72% rename from src/box/info.h rename to src/info.h index df82becd5..bf1809ca9 100644 --- a/src/box/info.h +++ b/src/info.h @@ -1,7 +1,7 @@ -#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. + * 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 @@ -35,9 +35,10 @@ /** * @file - * This module provides an adapter for Lua/C API to generate box.info() - * and index:info() introspection trees. The primary purpose of this - * adapter is to eliminate Engine <-> Lua interdependency. + * This module provides an adapter for Lua/C API to generate + * box.info() and index:info() introspection trees. The primary + * purpose of this adapter is to eliminate Engine <-> Lua + * interdependency. * * TREE STRUCTURE * @@ -57,20 +58,18 @@ * * IMPLEMENTATION DETAILS * - * Current implementation calls Lua/C API under the hood without any - * pcall() wrapping. As you may now, idiosyncratic Lua/C API unwinds - * C stacks on errors in a way you can't handle in C. Please ensure that - * all blocks of code which call info_append_XXX() functions are - * exception/longjmp safe. + * Current implementation calls Lua/C API under the hood without + * any pcall() wrapping. As you may now, idiosyncratic Lua/C API + * unwinds C stacks on errors in a way you can't handle in C. + * Please ensure that all blocks of code which call + * info_append_XXX() functions are exception/longjmp safe. */ #if defined(__cplusplus) extern "C" { #endif /* defined(__cplusplus) */ -/** - * Virtual method table for struct info_handler. - */ +/** Virtual method table for struct info_handler. */ struct info_handler_vtab { /** The begin of document. */ void (*begin)(struct info_handler *); @@ -86,13 +85,17 @@ struct info_handler_vtab { /** Set int64_t value. */ void (*append_int)(struct info_handler *, const char *key, int64_t value); + /** Set uint64_t value. */ + void (*append_uint)(struct info_handler *, const char *key, + uint64_t value); /** Set double value. */ void (*append_double)(struct info_handler *, const char *key, double value); }; /** - * Adapter for Lua/C API to generate box.info() sections from engines. + * Adapter for Lua/C API to generate box.info() sections from + * engines. */ struct info_handler { struct info_handler_vtab *vtab; @@ -102,8 +105,6 @@ struct info_handler { /** * Starts a new document and creates root-level associative array. - * @param info box.info() adapter. - * @throws C++ exception on OOM, see info.h comments. * @pre must be called once before any other functions. */ static inline void @@ -114,8 +115,6 @@ info_begin(struct info_handler *info) /** * Finishes the document and closes root-level associative array. - * @param info box.info() adapter. - * @throws C++ exception on OOM, see info.h comments. * @pre must be called at the end. */ static inline void @@ -125,11 +124,8 @@ info_end(struct info_handler *info) } /** - * Associates int64_t value with @a key in the current associative array. - * @param info box.info() adapter. - * @param key key. - * @param value value. - * @throws C++ exception on OOM, see info.h comments. + * Associates int64_t value with @a key in the current associative + * array. * @pre associative array is started. */ static inline void @@ -139,16 +135,24 @@ info_append_int(struct info_handler *info, const char *key, int64_t value) } /** - * Associates zero-terminated string with @a key in the current associative - * array. - * @param info box.info() adapter. - * @param key key. - * @param value value. - * @throws C++ exception on OOM, see info.h comments. + * Associates uint64_t value with @a key in the current + * associative array. + * @pre associative array is started. + */ +static inline void +info_append_uint(struct info_handler *info, const char *key, uint64_t value) +{ + return info->vtab->append_uint(info, key, value); +} + +/** + * Associates zero-terminated string with @a key in the current + * associative array. + * @pre associative array is started. */ static inline void info_append_str(struct info_handler *info, const char *key, - const char *value) + const char *value) { return info->vtab->append_str(info, key, value); } @@ -156,10 +160,7 @@ info_append_str(struct info_handler *info, const char *key, /** * Associates double value with @a key in the current associative * array. - * @param info box.info() adapter. - * @param key key. - * @param value value. - * @throws C++ exception on OOM, see info.h comments. + * @pre associative array is started. */ static inline void info_append_double(struct info_handler *info, const char *key, @@ -168,11 +169,9 @@ info_append_double(struct info_handler *info, const char *key, return info->vtab->append_double(info, key, value); } -/* +/** * Associates a new associative array with @a key. - * @param info box.info() adapter. - * @param key key. - * @throws C++ exception on OOM, see info.h comments. + * @pre associative array is started. */ static inline void info_table_begin(struct info_handler *info, const char *key) @@ -180,10 +179,9 @@ info_table_begin(struct info_handler *info, const char *key) return info->vtab->begin_table(info, key); } -/* +/** * Finishes the current active associative array. - * @param info box.info() adapter - * @throws C++ exception on OOM, see info.h comments. + * @pre associative array is started. */ static inline void info_table_end(struct info_handler *info) @@ -195,4 +193,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..f28cc48f7 --- /dev/null +++ b/src/lua/info.c @@ -0,0 +1,118 @@ +/* + * 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_uint(struct info_handler *info, const char *key, + uint64_t value) +{ + lua_State *L = (lua_State *) info->ctx; + lua_pushstring(L, key); + luaL_pushuint64(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_uint = luaT_info_append_uint, + .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)