From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: From: Vladimir Davydov Subject: [PATCH 06/12] vinyl: move vy_key_dup to generic code Date: Thu, 21 Feb 2019 13:26:06 +0300 Message-Id: <3735b650cb3759eb7f48f4689aa9d784ca08f534.1550744027.git.vdavydov.dev@gmail.com> In-Reply-To: References: In-Reply-To: References: To: kostja@tarantool.org Cc: tarantool-patches@freelists.org List-ID: This helper function has nothing to do with vinyl - it's simply duplicates a msgpack array. Let's move it to tuple.c and rename it to key_dup. --- src/box/tuple.c | 15 +++++++++++++++ src/box/tuple.h | 9 +++++++++ src/box/vy_run.c | 16 ++++++++-------- src/box/vy_stmt.c | 15 --------------- src/box/vy_stmt.h | 8 -------- 5 files changed, 32 insertions(+), 31 deletions(-) diff --git a/src/box/tuple.c b/src/box/tuple.c index 0770db66..6769a487 100644 --- a/src/box/tuple.c +++ b/src/box/tuple.c @@ -758,3 +758,18 @@ mp_str(const char *data) return ""; return buf; } + +char * +key_dup(const char *key) +{ + assert(mp_typeof(*key) == MP_ARRAY); + const char *end = key; + mp_next(&end); + char *res = malloc(end - key); + if (res == NULL) { + diag_set(OutOfMemory, end - key, "malloc", "key"); + return NULL; + } + memcpy(res, key, end - key); + return res; +} diff --git a/src/box/tuple.h b/src/box/tuple.h index e803260c..d8a020e0 100644 --- a/src/box/tuple.h +++ b/src/box/tuple.h @@ -1012,6 +1012,15 @@ tuple_bless(struct tuple *tuple) ssize_t tuple_to_buf(const struct tuple *tuple, char *buf, size_t size); +/** + * Duplicate a raw key (MsgPack array). + * @param key the key to duplicate. + * @retval not NULL Pointer to the key copy allocated with malloc(). + * @retval NULL Memory error. + */ +char * +key_dup(const char *key); + #if defined(__cplusplus) } /* extern "C" */ diff --git a/src/box/vy_run.c b/src/box/vy_run.c index 14975bdf..b85582b2 100644 --- a/src/box/vy_run.c +++ b/src/box/vy_run.c @@ -206,7 +206,7 @@ vy_page_info_create(struct vy_page_info *page_info, uint64_t offset, memset(page_info, 0, sizeof(*page_info)); page_info->offset = offset; page_info->unpacked_size = 0; - page_info->min_key = vy_key_dup(min_key); + page_info->min_key = key_dup(min_key); return page_info->min_key == NULL ? -1 : 0; } @@ -510,7 +510,7 @@ vy_page_info_decode(struct vy_page_info *page, const struct xrow_header *xrow, case VY_PAGE_INFO_MIN_KEY: key_beg = pos; mp_next(&pos); - page->min_key = vy_key_dup(key_beg); + page->min_key = key_dup(key_beg); if (page->min_key == NULL) return -1; break; @@ -595,14 +595,14 @@ vy_run_info_decode(struct vy_run_info *run_info, case VY_RUN_INFO_MIN_KEY: tmp = pos; mp_next(&pos); - run_info->min_key = vy_key_dup(tmp); + run_info->min_key = key_dup(tmp); if (run_info->min_key == NULL) return -1; break; case VY_RUN_INFO_MAX_KEY: tmp = pos; mp_next(&pos); - run_info->max_key = vy_key_dup(tmp); + run_info->max_key = key_dup(tmp); if (run_info->max_key == NULL) return -1; break; @@ -2157,7 +2157,7 @@ vy_run_writer_start_page(struct vy_run_writer *writer, return -1; if (run->info.page_count == 0) { assert(run->info.min_key == NULL); - run->info.min_key = vy_key_dup(key); + run->info.min_key = key_dup(key); if (run->info.min_key == NULL) return -1; } @@ -2311,7 +2311,7 @@ vy_run_writer_commit(struct vy_run_writer *writer) goto out; assert(run->info.max_key == NULL); - run->info.max_key = vy_key_dup(key); + run->info.max_key = key_dup(key); if (run->info.max_key == NULL) goto out; @@ -2424,7 +2424,7 @@ vy_run_rebuild_index(struct vy_run *run, const char *dir, if (key == NULL) goto close_err; if (run->info.min_key == NULL) { - run->info.min_key = vy_key_dup(key); + run->info.min_key = key_dup(key); if (run->info.min_key == NULL) goto close_err; } @@ -2454,7 +2454,7 @@ vy_run_rebuild_index(struct vy_run *run, const char *dir, } if (key != NULL) { - run->info.max_key = vy_key_dup(key); + run->info.max_key = key_dup(key); if (run->info.max_key == NULL) goto close_err; } diff --git a/src/box/vy_stmt.c b/src/box/vy_stmt.c index 618e6025..9d9f2c75 100644 --- a/src/box/vy_stmt.c +++ b/src/box/vy_stmt.c @@ -252,21 +252,6 @@ vy_stmt_new_select(struct tuple_format *format, const char *key, return stmt; } -char * -vy_key_dup(const char *key) -{ - assert(mp_typeof(*key) == MP_ARRAY); - const char *end = key; - mp_next(&end); - char *res = malloc(end - key); - if (res == NULL) { - diag_set(OutOfMemory, end - key, "malloc", "key"); - return NULL; - } - memcpy(res, key, end - key); - return res; -} - /** * Create a statement without type and with reserved space for operations. * Operations can be saved in the space available by @param extra. diff --git a/src/box/vy_stmt.h b/src/box/vy_stmt.h index 3efad12c..dff0b94f 100644 --- a/src/box/vy_stmt.h +++ b/src/box/vy_stmt.h @@ -424,14 +424,6 @@ vy_stmt_new_select(struct tuple_format *format, const char *key, uint32_t part_count); /** - * Copy the key in a new memory area. - * @retval not NULL Success. - * @retval NULL Memory error. - */ -char * -vy_key_dup(const char *key); - -/** * Create a new surrogate DELETE from @a key using format. * * Example: -- 2.11.0