[tarantool-patches] [PATCH v7 2/7] box: introduce OPT_ARRAY opt_type to decode arrays

Kirill Shcherbatov kshcherbatov at tarantool.org
Wed May 23 17:05:29 MSK 2018


As we need to store Checks array in opt_def MsgPack in future
introduced special type and decode callback to_array used in opt_set
function.

Part of #3272.
---
 src/box/opt_def.c |  9 +++++++++
 src/box/opt_def.h | 19 ++++++++++++++-----
 2 files changed, 23 insertions(+), 5 deletions(-)

diff --git a/src/box/opt_def.c b/src/box/opt_def.c
index cd93c23..c8440c9 100644
--- a/src/box/opt_def.c
+++ b/src/box/opt_def.c
@@ -44,6 +44,7 @@ const char *opt_type_strs[] = {
 	/* [OPT_STR]	= */ "string",
 	/* [OPT_STRPTR] = */ "string",
 	/* [OPT_ENUM]   = */ "enum",
+	/* [OPT_ARRAY]  = */ "array",
 };
 
 static int
@@ -135,6 +136,14 @@ opt_set(void *opts, const struct opt_def *def, const char **val,
 			unreachable();
 		};
 		break;
+	case OPT_ARRAY:
+		if (mp_typeof(**val) != MP_ARRAY)
+			return -1;
+		ival = mp_decode_array(val);
+		assert(def->to_array != NULL);
+		if (def->to_array(val, ival, opt) != 0)
+			return -1;
+		break;
 	default:
 		unreachable();
 	}
diff --git a/src/box/opt_def.h b/src/box/opt_def.h
index 633832a..71fef3a 100644
--- a/src/box/opt_def.h
+++ b/src/box/opt_def.h
@@ -47,12 +47,14 @@ enum opt_type {
 	OPT_STR,	/* char[] */
 	OPT_STRPTR,	/* char*  */
 	OPT_ENUM,	/* enum */
+	OPT_ARRAY,	/* array */
 	opt_type_MAX,
 };
 
 extern const char *opt_type_strs[];
 
 typedef int64_t (*opt_def_to_enum_cb)(const char *str, uint32_t len);
+typedef int (*opt_def_to_array_cb)(const char **str, uint32_t len, char *opt);
 
 struct opt_def {
 	const char *name;
@@ -64,19 +66,26 @@ struct opt_def {
 	int enum_size;
 	const char **enum_strs;
 	uint32_t enum_max;
-	/** If not NULL, used to get a enum value by a string. */
-	opt_def_to_enum_cb to_enum;
+	/** If not NULL, used to get a value by a string. */
+	union {
+		opt_def_to_enum_cb to_enum;
+		opt_def_to_array_cb to_array;
+	};
 };
 
 #define OPT_DEF(key, type, opts, field) \
 	{ key, type, offsetof(opts, field), sizeof(((opts *)0)->field), \
-	  NULL, 0, NULL, 0, NULL }
+	  NULL, 0, NULL, 0, {NULL} }
 
 #define OPT_DEF_ENUM(key, enum_name, opts, field, to_enum) \
 	{ key, OPT_ENUM, offsetof(opts, field), sizeof(int), #enum_name, \
-	  sizeof(enum enum_name), enum_name##_strs, enum_name##_MAX, to_enum }
+	  sizeof(enum enum_name), enum_name##_strs, enum_name##_MAX, {to_enum} }
 
-#define OPT_END {NULL, opt_type_MAX, 0, 0, NULL, 0, NULL, 0, NULL}
+#define OPT_DEF_ARRAY(key, opts, field, to_array) \
+	 { key, OPT_ARRAY, offsetof(opts, field), sizeof(((opts *)0)->field), \
+	   NULL, 0, NULL, 0, {to_array} }
+
+#define OPT_END {NULL, opt_type_MAX, 0, 0, NULL, 0, NULL, 0, {NULL}}
 
 struct region;
 
-- 
2.7.4





More information about the Tarantool-patches mailing list