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

  • From: Kirill Shcherbatov <kshcherbatov@xxxxxxxxxxxxx>
  • To: tarantool-patches@xxxxxxxxxxxxx, Nikita Pettik <korablev@xxxxxxxxxxxxx>
  • Date: Fri, 17 Aug 2018 17:04:12 +0300

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;

Other related posts: