From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtpng3.m.smailru.net (smtpng3.m.smailru.net [94.100.177.149]) (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 56B5A4696C6 for ; Fri, 6 Mar 2020 14:48:31 +0300 (MSK) From: olegrok@tarantool.org Date: Fri, 6 Mar 2020 14:46:43 +0300 Message-Id: In-Reply-To: References: MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [Tarantool-patches] [PATCH 2/2] box: introduce "current" for sequence List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: tarantool-patches@dev.tarantool.org, v.shpilevoy@tarantool.org, korablev@tarantool.org Cc: Oleg Babin From: Oleg Babin This patch introduces "current" function for sequences. It returns current value of specified sequence or throws an error if sequence is not initialized ("next" called at least once). Closes #4752 @TarantoolBot document Title: sequence:current() New function returns current value of sequence of throws an error if used before sequence initialization. Example ```lua sq = box.schema.sequence.create('test') --- ... sq:current() --- - error: Sequence is not initialized yet ... sq:next() --- - 1 ... sq:current() --- - 1 ... sq:set(42) --- ... sq:current() --- - 42 ... ``` --- Issue: https://github.com/tarantool/tarantool/issues/4752 Branch: https://github.com/tarantool/tarantool/tree/olegrok/4752-sequence-current src/box/box.cc | 14 ++++++++++++++ src/box/box.h | 12 ++++++++++++ src/box/lua/schema.lua | 4 ++++ src/box/lua/sequence.c | 12 ++++++++++++ test/box/sequence.result | 32 ++++++++++++++++++++++++++++++++ test/box/sequence.test.lua | 12 ++++++++++++ 6 files changed, 86 insertions(+) diff --git a/src/box/box.cc b/src/box/box.cc index 09dd67ab4..a5052dba4 100644 --- a/src/box/box.cc +++ b/src/box/box.cc @@ -1414,6 +1414,20 @@ box_sequence_next(uint32_t seq_id, int64_t *result) *result = value; return 0; } + +int +box_sequence_current(uint32_t seq_id, int64_t *result) +{ + struct sequence *seq = sequence_cache_find(seq_id); + if (seq == NULL) + return -1; + if (access_check_sequence(seq) != 0) + return -1; + if (sequence_get_value(seq, result) != 0) + return -1; + return 0; +} + int box_sequence_set(uint32_t seq_id, int64_t value) { diff --git a/src/box/box.h b/src/box/box.h index f37a945eb..8fb723630 100644 --- a/src/box/box.h +++ b/src/box/box.h @@ -423,6 +423,18 @@ box_truncate(uint32_t space_id); API_EXPORT int box_sequence_next(uint32_t seq_id, int64_t *result); +/** + * Returns current value of sequence. + * + * \param seq_id sequence identifier + * \param[out] result pointer to a variable where the current sequence + * value will be stored on success + * \retval -1 on error (check box_error_last()) + * \retval 0 on success + */ +API_EXPORT int +box_sequence_current(uint32_t seq_id, int64_t *result); + /** * Set a sequence value. * diff --git a/src/box/lua/schema.lua b/src/box/lua/schema.lua index f537c3cec..0cd747350 100644 --- a/src/box/lua/schema.lua +++ b/src/box/lua/schema.lua @@ -1812,6 +1812,10 @@ sequence_mt.next = function(self) return internal.sequence.next(self.id) end +sequence_mt.current = function(self) + return internal.sequence.current(self.id) +end + sequence_mt.set = function(self, value) return internal.sequence.set(self.id, value) end diff --git a/src/box/lua/sequence.c b/src/box/lua/sequence.c index bf0714c1a..ae4b5d3ce 100644 --- a/src/box/lua/sequence.c +++ b/src/box/lua/sequence.c @@ -49,6 +49,17 @@ lbox_sequence_next(struct lua_State *L) return 1; } +static int +lbox_sequence_current(struct lua_State *L) +{ + uint32_t seq_id = luaL_checkinteger(L, 1); + int64_t result; + if (box_sequence_current(seq_id, &result) != 0) + luaT_error(L); + luaL_pushint64(L, result); + return 1; +} + static int lbox_sequence_set(struct lua_State *L) { @@ -174,6 +185,7 @@ box_lua_sequence_init(struct lua_State *L) { static const struct luaL_Reg sequence_internal_lib[] = { {"next", lbox_sequence_next}, + {"current", lbox_sequence_current}, {"set", lbox_sequence_set}, {"reset", lbox_sequence_reset}, {NULL, NULL} diff --git a/test/box/sequence.result b/test/box/sequence.result index 0a6cfee2c..5a4cc8153 100644 --- a/test/box/sequence.result +++ b/test/box/sequence.result @@ -2289,3 +2289,35 @@ box.space._space_sequence:update({s.id}, {{'=', 2, t[2]}}) s:drop() --- ... +-- +-- gh-4752 current value of sequence +-- +sq = box.schema.sequence.create('test') +--- +... +sq:current() +--- +- error: Sequence is not initialized yet +... +sq:next() +--- +- 1 +... +sq:current() +--- +- 1 +... +sq:set(42) +--- +... +sq:current() +--- +- 42 +... +sq:current() +--- +- 42 +... +sq:drop() +--- +... diff --git a/test/box/sequence.test.lua b/test/box/sequence.test.lua index 8e00571e5..54011225e 100644 --- a/test/box/sequence.test.lua +++ b/test/box/sequence.test.lua @@ -780,3 +780,15 @@ pk = s:create_index('pk', {sequence = true}) t = box.space._space_sequence:get({s.id}) box.space._space_sequence:update({s.id}, {{'=', 2, t[2]}}) s:drop() + +-- +-- gh-4752 current value of sequence +-- +sq = box.schema.sequence.create('test') +sq:current() +sq:next() +sq:current() +sq:set(42) +sq:current() +sq:current() +sq:drop() -- 2.23.0