[Tarantool-patches] [PATCH] exports: allow to use json tools via FFI
Timur Safin
tsafin at tarantool.org
Fri Aug 21 19:50:20 MSK 2020
LGTM as fairly trivial patch
Thanks,
Timur
: From: olegrok at tarantool.org <olegrok at tarantool.org>
: Subject: [PATCH] exports: allow to use json tools via FFI
:
: From: Oleg Babin <babinoleg at mail.ru>
:
: This patch exports some json functions to be used via FFI. We solve
: following problem: currently we don't have any tools to inspect
: jsonpaths. E.g. user wants to ban or restrict an access to some
: tuple fields, it could be some system fields. Tarantool doesn't
: have hidden fields and to solve such problem we should fairly
: parse input jsonpaths. Before this patch user should write its own
: or some external tools. This patch allows to use functions from
: built-in json-lexer directly from Tarantool via FFI.
:
: Part of #5203
: ---
: Issue: https://github.com/tarantool/tarantool/issues/5203
: Branch: https://github.com/tarantool/tarantool/tree/olegrok/5203-expose-
: json-helpers
: Also issue contains an example of usage this feature.
:
: @Changelog:
: - Some symbols from tarantool json moudule are exported now
: (gh-5203).
:
: src/exports.h | 4 ++
: test/box-tap/gh-5203-json-exports.test.lua | 82 ++++++++++++++++++++++
: 2 files changed, 86 insertions(+)
: create mode 100755 test/box-tap/gh-5203-json-exports.test.lua
:
: diff --git a/src/exports.h b/src/exports.h
: index 7cf283e5b..83c90a8bc 100644
: --- a/src/exports.h
: +++ b/src/exports.h
: @@ -152,6 +152,10 @@ EXPORT(ibuf_create)
: EXPORT(ibuf_destroy)
: EXPORT(ibuf_reinit)
: EXPORT(ibuf_reserve_slow)
: +EXPORT(json_lexer_next_token)
: +EXPORT(json_path_cmp)
: +EXPORT(json_path_validate)
: +EXPORT(json_path_multikey_offset)
: EXPORT(lbox_socket_local_resolve)
: EXPORT(lbox_socket_nonblock)
: EXPORT(log_format)
: diff --git a/test/box-tap/gh-5203-json-exports.test.lua b/test/box-tap/gh-
: 5203-json-exports.test.lua
: new file mode 100755
: index 000000000..1b8eb9afa
: --- /dev/null
: +++ b/test/box-tap/gh-5203-json-exports.test.lua
: @@ -0,0 +1,82 @@
: +#!/usr/bin/env tarantool
: +
: +local tap = require('tap')
: +local ffi = require('ffi')
: +ffi.cdef([[
: + void *dlsym(void *handle, const char *symbol);
: + /**
: + * Lexer for JSON paths:
: + * <field>, <.field>, <[123]>, <['field']> and their combinations.
: + */
: + struct json_lexer {
: + /** Source string. */
: + const char *src;
: + /** Length of string. */
: + int src_len;
: + /** Current lexer's offset in bytes. */
: + int offset;
: + /** Current lexer's offset in symbols. */
: + int symbol_count;
: + /**
: + * Base field offset for emitted JSON_TOKEN_NUM tokens,
: + * e.g. 0 for C and 1 for Lua.
: + */
: + int index_base;
: + };
: +
: + enum json_token_type {
: + JSON_TOKEN_NUM,
: + JSON_TOKEN_STR,
: + JSON_TOKEN_ANY,
: + /** Lexer reached end of path. */
: + JSON_TOKEN_END,
: + };
: +
: + int
: + json_lexer_next_token(struct json_lexer *lexer, struct json_token
: *token);
: +
: + int
: + json_path_cmp(const char *a, int a_len, const char *b, int b_len,
: + int index_base);
: +
: + int
: + json_path_validate(const char *path, int path_len, int index_base);
: +
: + int
: + json_path_multikey_offset(const char *path, int path_len, int
: index_base);
: +]])
: +
: +local test = tap.test('json-features')
: +test:plan(1)
: +
: +local RTLD_DEFAULT
: +-- See `man 3 dlsym`:
: +-- RTLD_DEFAULT
: +-- Find the first occurrence of the desired symbol using the default
: +-- shared object search order. The search will include global symbols
: +-- in the executable and its dependencies, as well as symbols in shared
: +-- objects that were dynamically loaded with the RTLD_GLOBAL flag.
: +if jit.os == "OSX" then
: + RTLD_DEFAULT = ffi.cast("void *", -2LL)
: +else
: + RTLD_DEFAULT = ffi.cast("void *", 0LL)
: +end
: +
: +local json_symbols = {
: + 'json_lexer_next_token',
: + 'json_path_cmp',
: + 'json_path_validate',
: + 'json_path_multikey_offset',
: +}
: +
: +test:test('json_symbols', function(t)
: + t:plan(#json_symbols)
: + for _, sym in ipairs(json_symbols) do
: + t:ok(
: + ffi.C.dlsym(RTLD_DEFAULT, sym) ~= nil,
: + ('Symbol %q found'):format(sym)
: + )
: + end
: +end)
: +
: +os.exit(test:check() and 0 or 1)
: --
: 2.23.0
More information about the Tarantool-patches
mailing list