From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp61.i.mail.ru (smtp61.i.mail.ru [217.69.128.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id 30465446448 for ; Wed, 23 Sep 2020 04:40:51 +0300 (MSK) From: Alexander Turenko Date: Wed, 23 Sep 2020 04:40:29 +0300 Message-Id: <8220fef6603624997e238414911c410cc6485754.1600824556.git.alexander.turenko@tarantool.org> In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH 1.10 16/16] WIP: module api: add box_key_def_validate_key() List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Vladislav Shpilevoy Cc: tarantool-patches@dev.tarantool.org, Alexander Turenko XXX: Add a module API test. Part of #5273 (cherry picked from commit 501646b13840c7f8166e47c7ce75385b76dc00b0) --- extra/exports | 1 + src/box/key_def_api.c | 13 +++++++++++++ src/box/key_def_api.h | 15 +++++++++++++++ 3 files changed, 29 insertions(+) diff --git a/extra/exports b/extra/exports index 1684da57d..a4ac03530 100644 --- a/extra/exports +++ b/extra/exports @@ -150,6 +150,7 @@ box_key_def_delete box_key_def_dump_parts box_key_def_new_ex box_key_def_merge +box_key_def_validate_key box_key_part_def_create box_tuple_format_default box_tuple_new diff --git a/src/box/key_def_api.c b/src/box/key_def_api.c index cce605e35..55fbc53ce 100644 --- a/src/box/key_def_api.c +++ b/src/box/key_def_api.c @@ -282,4 +282,17 @@ box_tuple_extract_key_ex(box_tuple_t *tuple, box_key_def_t *key_def, return tuple_extract_key(tuple, key_def, key_size_ptr); } +int +box_key_def_validate_key(const box_key_def_t *key_def, const char *key, + bool allow_nullable) +{ + uint32_t part_count = mp_decode_array(&key); + if (part_count > key_def->part_count) { + diag_set(ClientError, ER_KEY_PART_COUNT, key_def->part_count, + part_count); + return -1; + } + return key_validate_parts(key_def, key, part_count, allow_nullable); +} + /* }}} API functions implementations */ diff --git a/src/box/key_def_api.h b/src/box/key_def_api.h index cf4f3c9b7..b85ed7f3c 100644 --- a/src/box/key_def_api.h +++ b/src/box/key_def_api.h @@ -36,6 +36,7 @@ extern "C" { #endif /* defined(__cplusplus) */ #include +#include #include "trivia/util.h" typedef struct tuple box_tuple_t; @@ -242,6 +243,20 @@ API_EXPORT char * box_tuple_extract_key_ex(box_tuple_t *tuple, box_key_def_t *key_def, int ignored, uint32_t *key_size_ptr); +/** + * Check that parts of the key match with the key definition. + * + * @param key_def Key definition. + * @param key MessagePack'ed data for matching. + * @param allow_nullable True if nullable parts are allowed. + * + * @retval 0 The key is valid. + * @retval -1 The key is invalid. + */ +API_EXPORT int +box_key_def_validate_key(const box_key_def_t *key_def, const char *key, + bool allow_nullable); + /** \endcond public */ /* -- 2.25.0