[PATCH 06/12] vinyl: move vy_key_dup to generic code

Vladimir Davydov vdavydov.dev at gmail.com
Thu Feb 21 13:26:06 MSK 2019


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 "<failed to format message pack>";
 	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




More information about the Tarantool-patches mailing list