[tarantool-patches] Re: [PATCH v1 1/1] sql: remove struct Enc

Kirill Shcherbatov kshcherbatov at tarantool.org
Fri Aug 17 17:04:12 MSK 2018


On 17.08.2018 15:40, Vladislav Shpilevoy wrote:
> Hi! Please, do not use any Lua things in SQL.
> You should not even include this: #include "lua/msgpack.h".

======================================
diff --git a/src/box/sql.c b/src/box/sql.c
index f1e860d..321d3c4 100644
--- a/src/box/sql.c
+++ b/src/box/sql.c
@@ -56,7 +56,7 @@
 #include "xrow.h"
 #include "iproto_constants.h"
 #include "fkey.h"
-#include "lua/msgpack.h"
+#include "mpstream.h"
 #include "small/region.h"
 
 static sqlite3 *db = NULL;
@@ -1250,7 +1250,7 @@ sql_encode_table(struct region *region, struct Table *table, uint32_t *size)
 			pk_forced_int = pk;
 	}
 	uint32_t field_count = def->field_count;
-	luamp_encode_array(luaL_msgpack_default, &stream, field_count);
+	mpstream_encode_array(&stream, field_count);
 	for (uint32_t i = 0; i < field_count && !is_error; i++) {
 		const char *t;
 		uint32_t cid = def->fields[i].coll_id;
@@ -1261,13 +1261,10 @@ sql_encode_table(struct region *region, struct Table *table, uint32_t *size)
 			base_len += 1;
 		if (default_str != NULL)
 			base_len += 1;
-		luamp_encode_map(luaL_msgpack_default, &stream, base_len);
-		luamp_encode_str(luaL_msgpack_default, &stream, "name",
-				 strlen("name"));
-		luamp_encode_str(luaL_msgpack_default, &stream, field->name,
-				 strlen(field->name));
-		luamp_encode_str(luaL_msgpack_default, &stream, "type",
-				 strlen("type"));
+		mpstream_encode_map(&stream, base_len);
+		mpstream_encode_str(&stream, "name", strlen("name"));
+		mpstream_encode_str(&stream, field->name, strlen(field->name));
+		mpstream_encode_str(&stream, "type", strlen("type"));
 		if (i == pk_forced_int) {
 			t = "integer";
 		} else {
@@ -1280,32 +1277,30 @@ sql_encode_table(struct region *region, struct Table *table, uint32_t *size)
 		assert(def->fields[i].is_nullable ==
 			       action_is_nullable(def->fields[i].
 						  nullable_action));
-		luamp_encode_str(luaL_msgpack_default, &stream, t, strlen(t));
-		luamp_encode_str(luaL_msgpack_default, &stream, "affinity",
-				 strlen("affinity"));
-		luamp_encode_uint(luaL_msgpack_default, &stream,
+		mpstream_encode_str(&stream, t, strlen(t));
+		mpstream_encode_str(&stream, "affinity", strlen("affinity"));
+		mpstream_encode_uint(&stream,
 				  def->fields[i].affinity);
-		luamp_encode_str(luaL_msgpack_default, &stream, "is_nullable",
-				 strlen("is_nullable"));
-		luamp_encode_bool(luaL_msgpack_default, &stream,
+		mpstream_encode_str(&stream, "is_nullable",
+				    strlen("is_nullable"));
+		mpstream_encode_bool(&stream,
 				  def->fields[i].is_nullable);
-		luamp_encode_str(luaL_msgpack_default, &stream,
-				 "nullable_action", strlen("nullable_action"));
+		mpstream_encode_str(&stream, "nullable_action",
+				    strlen("nullable_action"));
 		assert(def->fields[i].nullable_action < on_conflict_action_MAX);
 		const char *action =
 			on_conflict_action_strs[def->fields[i].nullable_action];
-		luamp_encode_str(luaL_msgpack_default, &stream, action,
-				 strlen(action));
+		mpstream_encode_str(&stream, action, strlen(action));
 		if (cid != COLL_NONE) {
-			luamp_encode_str(luaL_msgpack_default, &stream,
-					 "collation", strlen("collation"));
-			luamp_encode_uint(luaL_msgpack_default, &stream, cid);
+			mpstream_encode_str(&stream, "collation",
+					    strlen("collation"));
+			mpstream_encode_uint(&stream, cid);
 		}
 		if (default_str != NULL) {
-			luamp_encode_str(luaL_msgpack_default, &stream,
-					 "default", strlen("default"));
-			luamp_encode_str(luaL_msgpack_default, &stream,
-					 default_str, strlen(default_str));
+			mpstream_encode_str(&stream, "default",
+					    strlen("default"));
+			mpstream_encode_str(&stream, default_str,
+					    strlen(default_str));
 		}
 	}
 	mpstream_flush(&stream);
@@ -1337,27 +1332,24 @@ sql_encode_table_opts(struct region *region, struct Table *table,
 		has_checks =  table->def->opts.checks != NULL;
 	}
 	uint32_t checks_cnt = has_checks ? table->def->opts.checks->nExpr : 0;
-	luamp_encode_map(luaL_msgpack_default, &stream,
-			 1 + is_view + (checks_cnt > 0));
+	mpstream_encode_map(&stream, 1 + is_view + (checks_cnt > 0));
 
-	luamp_encode_str(luaL_msgpack_default, &stream, "sql", strlen("sql"));
-	luamp_encode_str(luaL_msgpack_default, &stream, sql, strlen(sql));
+	mpstream_encode_str(&stream, "sql", strlen("sql"));
+	mpstream_encode_str(&stream, sql, strlen(sql));
 	if (is_view) {
-		luamp_encode_str(luaL_msgpack_default, &stream, "view",
-				 strlen("view"));
-		luamp_encode_bool(luaL_msgpack_default, &stream, true);
+		mpstream_encode_str(&stream, "view", strlen("view"));
+		mpstream_encode_bool(&stream, true);
 	}
 	if (checks_cnt == 0)
 		goto finish;
 
 	/* Encode checks. */
 	struct ExprList_item *a = table->def->opts.checks->a;
-	luamp_encode_str(luaL_msgpack_default, &stream, "checks",
-			 strlen("checks"));
-	luamp_encode_array(luaL_msgpack_default, &stream, checks_cnt);
+	mpstream_encode_str(&stream, "checks", strlen("checks"));
+	mpstream_encode_array(&stream, checks_cnt);
 	for (uint32_t i = 0; i < checks_cnt && !is_error; ++i) {
 		int items = (a[i].pExpr != NULL) + (a[i].zName != NULL);
-		luamp_encode_map(luaL_msgpack_default, &stream, items);
+		mpstream_encode_map(&stream, items);
 		/*
 		 * a[i].pExpr could be NULL for VIEW column names
 		 * represented as checks.
@@ -1365,17 +1357,14 @@ sql_encode_table_opts(struct region *region, struct Table *table,
 		if (a[i].pExpr != NULL) {
 			struct Expr *pExpr = a[i].pExpr;
 			assert(pExpr->u.zToken != NULL);
-			luamp_encode_str(luaL_msgpack_default, &stream, "expr",
-					 strlen("expr"));
-			luamp_encode_str(luaL_msgpack_default, &stream,
-					 pExpr->u.zToken,
-					 strlen(pExpr->u.zToken));
+			mpstream_encode_str(&stream, "expr", strlen("expr"));
+			mpstream_encode_str(&stream, pExpr->u.zToken,
+					    strlen(pExpr->u.zToken));
 		}
 		if (a[i].zName != NULL) {
-			luamp_encode_str(luaL_msgpack_default, &stream, "name",
-					 strlen("name"));
-			luamp_encode_str(luaL_msgpack_default, &stream,
-					 a[i].zName, strlen(a[i].zName));
+			mpstream_encode_str(&stream, "name", strlen("name"));
+			mpstream_encode_str(&stream, a[i].zName,
+					    strlen(a[i].zName));
 		}
 	}
 
@@ -1402,11 +1391,9 @@ fkey_encode_links(struct region *region, const struct fkey_def *def, int type,
 	mpstream_init(&stream, region, region_reserve_cb, region_alloc_cb,
 		      set_encode_error, &is_error);
 	uint32_t field_count = def->field_count;
-	luamp_encode_array(luaL_msgpack_default, &stream, field_count);
-	for (uint32_t i = 0; i < field_count && !is_error; ++i) {
-		luamp_encode_uint(luaL_msgpack_default, &stream,
-				  def->links[i].fields[type]);
-	}
+	mpstream_encode_array(&stream, field_count);
+	for (uint32_t i = 0; i < field_count && !is_error; ++i)
+		mpstream_encode_uint(&stream, def->links[i].fields[type]);
 	mpstream_flush(&stream);
 	if (is_error)
 		return NULL;
@@ -1451,7 +1438,7 @@ sql_encode_index_parts(struct region *region, struct SqliteIndex *index,
 	struct key_def *key_def = index->def->key_def;
 	uint32_t part_count = key_def->part_count;
 	struct key_part *part = key_def->parts;
-	luamp_encode_array(luaL_msgpack_default, &stream, part_count);
+	mpstream_encode_array(&stream, part_count);
 	for (uint32_t i = 0; i < part_count; ++i, ++part) {
 		uint32_t col = part->fieldno;
 		assert(fields[col].is_nullable ==
@@ -1465,37 +1452,33 @@ sql_encode_index_parts(struct region *region, struct SqliteIndex *index,
 		}
 		/* Do not decode default collation. */
 		uint32_t cid = part->coll_id;
-		luamp_encode_map(luaL_msgpack_default, &stream,
-				 5 + (cid != COLL_NONE));
-		luamp_encode_str(luaL_msgpack_default, &stream, "type",
-				 strlen("type"));
-		luamp_encode_str(luaL_msgpack_default, &stream, t, strlen(t));
-		luamp_encode_str(luaL_msgpack_default, &stream, "field",
-				 strlen("field"));
-		luamp_encode_uint(luaL_msgpack_default, &stream, col);
+		mpstream_encode_map(&stream, 5 + (cid != COLL_NONE));
+		mpstream_encode_str(&stream, "type", strlen("type"));
+		mpstream_encode_str(&stream, t, strlen(t));
+		mpstream_encode_str(&stream, "field", strlen("field"));
+		mpstream_encode_uint(&stream, col);
 		if (cid != COLL_NONE) {
-			luamp_encode_str(luaL_msgpack_default, &stream,
-					 "collation", strlen("collation"));
-			luamp_encode_uint(luaL_msgpack_default, &stream, cid);
+			mpstream_encode_str(&stream, "collation",
+					    strlen("collation"));
+			mpstream_encode_uint(&stream, cid);
 		}
-		luamp_encode_str(luaL_msgpack_default, &stream, "is_nullable",
-				 strlen("is_nullable"));
-		luamp_encode_bool(luaL_msgpack_default, &stream,
+		mpstream_encode_str(&stream, "is_nullable",
+				    strlen("is_nullable"));
+		mpstream_encode_bool(&stream,
 				  fields[col].is_nullable);
-		luamp_encode_str(luaL_msgpack_default, &stream,
-				 "nullable_action", strlen("nullable_action"));
+		mpstream_encode_str(&stream, "nullable_action",
+				    strlen("nullable_action"));
 		const char *action_str =
 			on_conflict_action_strs[fields[col].nullable_action];
-		luamp_encode_str(luaL_msgpack_default, &stream, action_str,
-				 strlen(action_str));
+		mpstream_encode_str(&stream, action_str, strlen(action_str));
 
-		luamp_encode_str(luaL_msgpack_default, &stream, "sort_order",
-				 strlen("sort_order"));
+		mpstream_encode_str(&stream, "sort_order",
+				    strlen("sort_order"));
 		enum sort_order sort_order = part->sort_order;
 		assert(sort_order < sort_order_MAX);
 		const char *sort_order_str = sort_order_strs[sort_order];
-		luamp_encode_str(luaL_msgpack_default, &stream, sort_order_str,
-				 strlen(sort_order_str));
+		mpstream_encode_str(&stream, sort_order_str,
+				    strlen(sort_order_str));
 	}
 	mpstream_flush(&stream);
 	if (is_error)
@@ -1518,10 +1501,9 @@ sql_encode_index_opts(struct region *region, struct SqliteIndex *index,
 	bool is_error = false;
 	mpstream_init(&stream, region, region_reserve_cb, region_alloc_cb,
 		      set_encode_error, &is_error);
-	luamp_encode_map(luaL_msgpack_default, &stream, 2);
+	mpstream_encode_map(&stream, 1 + (sql != NULL));
 	/* Mark as unique pk and unique indexes */
-	luamp_encode_str(luaL_msgpack_default, &stream, "unique",
-			 strlen("unique"));
+	mpstream_encode_str(&stream, "unique", strlen("unique"));
 	/* If user didn't defined ON CONFLICT OPTIONS, all uniqueness checks
 	 * will be made by Tarantool. However, Tarantool doesn't have ON
 	 * CONFLIT option, so in that case (except ON CONFLICT ABORT, which is
@@ -1529,10 +1511,11 @@ sql_encode_index_opts(struct region *region, struct SqliteIndex *index,
 	 * INSERT OR REPLACE/IGNORE uniqueness checks will be also done by
 	 * Tarantool.
 	 */
-	luamp_encode_bool(luaL_msgpack_default, &stream, IsUniqueIndex(index));
-	luamp_encode_str(luaL_msgpack_default, &stream, "sql", strlen("sql"));
-	luamp_encode_str(luaL_msgpack_default, &stream, sql,
-			 sql != NULL ? strlen(sql) : 0);
+	mpstream_encode_bool(&stream, IsUniqueIndex(index));
+	if (sql != NULL) {
+		mpstream_encode_str(&stream, "sql", strlen("sql"));
+		mpstream_encode_str(&stream, sql, strlen(sql));
+	}
 	mpstream_flush(&stream);
 	if (is_error)
 		return NULL;




More information about the Tarantool-patches mailing list