diff --git a/vlib/v/ast/ast.v b/vlib/v/ast/ast.v index a18f440837..f12428f98d 100644 --- a/vlib/v/ast/ast.v +++ b/vlib/v/ast/ast.v @@ -819,8 +819,8 @@ pub struct SqlInsertExpr { pub: db_var_name string // `db` in `sql db {` table_name string - fields []table.Field object_var_name string // `user` + table_type table.Type } pub struct SqlExpr { diff --git a/vlib/v/gen/cgen.v b/vlib/v/gen/cgen.v index e3f57b1db3..b3558295a9 100644 --- a/vlib/v/gen/cgen.v +++ b/vlib/v/gen/cgen.v @@ -661,7 +661,7 @@ fn (mut g Gen) stmt(node ast.Stmt) { } } ast.FnDecl { - g.tmp_count = 0 + //g.tmp_count = 0 TODO mut skip := false pos := g.out.buf.len if g.pref.build_mode == .build_module { diff --git a/vlib/v/gen/sql.v b/vlib/v/gen/sql.v index 6d352bcbf2..0618139838 100644 --- a/vlib/v/gen/sql.v +++ b/vlib/v/gen/sql.v @@ -13,33 +13,37 @@ const ( ) fn (mut g Gen) sql_insert_expr(node ast.SqlInsertExpr) { + sym := g.table.get_type_symbol(node.table_type) + info := sym.info as table.Struct + fields := info.fields.filter(it.typ in [table.string_type, table.int_type, table.bool_type]) g.writeln('\n\t// sql insert') db_name := g.new_tmp_var() g.sql_stmt_name = g.new_tmp_var() g.writeln('${dbtype}__DB $db_name = $node.db_var_name;') mut q := 'insert into $node.table_name (' - for i, field in node.fields { + for i, field in fields { if field.name == 'id' { continue } q += '$field.name' - if i < node.fields.len - 1 { + if i < fields.len - 1 { q += ', ' } } q += ') values (' - for i, field in node.fields { + for i, field in fields { if field.name == 'id' { continue } q += '?${i+0}' - if i < node.fields.len - 1 { + if i < fields.len - 1 { q += ', ' } } q += ')' + println(q) g.writeln('sqlite3_stmt* $g.sql_stmt_name = ${dbtype}__DB_init_stmt($db_name, tos_lit("$q"));') - for i, field in node.fields { + for i, field in fields { if field.name == 'id' { continue } @@ -51,6 +55,7 @@ fn (mut g Gen) sql_insert_expr(node ast.SqlInsertExpr) { } } g.writeln('sqlite3_step($g.sql_stmt_name);') + g.writeln('puts(sqlite3_errmsg(${db_name}.conn));') g.writeln('sqlite3_finalize($g.sql_stmt_name);') } diff --git a/vlib/v/parser/sql.v b/vlib/v/parser/sql.v index df5d49b59e..c973b3241e 100644 --- a/vlib/v/parser/sql.v +++ b/vlib/v/parser/sql.v @@ -125,14 +125,14 @@ fn (mut p Parser) sql_insert_expr() ast.SqlInsertExpr { } table_type := p.parse_type() // `User` sym := p.table.get_type_symbol(table_type) - info := sym.info as table.Struct - fields := info.fields.filter(it.typ in [table.string_type, table.int_type, table.bool_type]) + // info := sym.info as table.Struct + // fields := info.fields.filter(it.typ in [table.string_type, table.int_type, table.bool_type]) table_name := sym.name p.check(.rcbr) return ast.SqlInsertExpr{ db_var_name: db_var_name table_name: table_name - fields: fields + table_type: table_type object_var_name: object_var_name } }