orm: fix time (#11026)

pull/11036/head
Louis Schmieder 2021-08-03 04:17:00 +02:00 committed by GitHub
parent 6dcf72fe9b
commit a55ba08fad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
7 changed files with 52 additions and 15 deletions

View File

@ -256,7 +256,7 @@ fn mysql_type_from_v(typ int) ?string {
6, 10 { 6, 10 {
'SMALLINT' 'SMALLINT'
} }
7, 11 { 7, 11, orm.time {
'INT' 'INT'
} }
8, 12 { 8, 12 {

View File

@ -342,7 +342,7 @@ pub fn orm_table_gen(table string, para string, defaults bool, def_unique_len in
mut field_name := sql_field_name(field) mut field_name := sql_field_name(field)
mut ctyp := sql_from_v(sql_field_type(field)) or { mut ctyp := sql_from_v(sql_field_type(field)) or {
field_name = '${field_name}_id' field_name = '${field_name}_id'
sql_from_v(8) ? sql_from_v(7) ?
} }
if ctyp == '' { if ctyp == '' {
return error('Unknown type ($field.typ) for field $field.name in struct $table') return error('Unknown type ($field.typ) for field $field.name in struct $table')

View File

@ -1,6 +1,7 @@
// import os // import os
// import pg // import pg
// import term // import term
import time
import sqlite import sqlite
struct Module { struct Module {
@ -23,6 +24,11 @@ struct Foo {
age int age int
} }
struct TestTime {
id int [primary; sql: serial]
create time.Time
}
fn test_orm_sqlite() { fn test_orm_sqlite() {
db := sqlite.connect(':memory:') or { panic(err) } db := sqlite.connect(':memory:') or { panic(err) }
db.exec('drop table if exists User') db.exec('drop table if exists User')
@ -287,4 +293,24 @@ fn test_orm_sqlite() {
} }
assert first.age == 60 assert first.age == 60
sql db {
create table TestTime
}
tnow := time.now()
time_test := TestTime{
create: tnow
}
sql db {
insert time_test into TestTime
}
data := sql db {
select from TestTime where create == tnow
}
assert data.len == 1
} }

View File

@ -181,7 +181,7 @@ fn pg_type_from_v(typ int) ?string {
6, 10 { 6, 10 {
'SMALLINT' 'SMALLINT'
} }
7, 11 { 7, 11, orm.time {
'INT' 'INT'
} }
8, 12 { 8, 12 {

View File

@ -140,7 +140,8 @@ fn (stmt Stmt) sqlite_select_column(idx int, typ int) ?orm.Primitive {
} else if typ == orm.string { } else if typ == orm.string {
primitive = stmt.get_text(idx).clone() primitive = stmt.get_text(idx).clone()
} else if typ == orm.time { } else if typ == orm.time {
primitive = time.unix(stmt.get_int(idx)) d := stmt.get_int(idx)
primitive = time.unix(d)
} else { } else {
return error('Unknown type $typ') return error('Unknown type $typ')
} }
@ -149,7 +150,7 @@ fn (stmt Stmt) sqlite_select_column(idx int, typ int) ?orm.Primitive {
} }
fn sqlite_type_from_v(typ int) ?string { fn sqlite_type_from_v(typ int) ?string {
return if typ in orm.nums || typ < 0 || typ in orm.num64 { return if typ in orm.nums || typ < 0 || typ in orm.num64 || typ == orm.time {
'INTEGER' 'INTEGER'
} else if typ in orm.float { } else if typ in orm.float {
'REAL' 'REAL'

View File

@ -7651,9 +7651,10 @@ fn (mut c Checker) sql_expr(mut node ast.SqlExpr) ast.Type {
info := sym.info as ast.Struct info := sym.info as ast.Struct
fields := c.fetch_and_verify_orm_fields(info, node.table_expr.pos, sym.name) fields := c.fetch_and_verify_orm_fields(info, node.table_expr.pos, sym.name)
mut sub_structs := map[int]ast.SqlExpr{} mut sub_structs := map[int]ast.SqlExpr{}
for f in fields.filter(c.table.type_symbols[int(it.typ)].kind == .struct_ for f in fields.filter((c.table.type_symbols[int(it.typ)].kind == .struct_
|| (c.table.get_type_symbol(it.typ).kind == .array || (c.table.get_type_symbol(it.typ).kind == .array
&& c.table.get_type_symbol(c.table.get_type_symbol(it.typ).array_info().elem_type).kind == .struct_)) { && c.table.get_type_symbol(c.table.get_type_symbol(it.typ).array_info().elem_type).kind == .struct_))
&& c.table.get_type_name(it.typ) != 'time.Time') {
typ := if c.table.get_type_symbol(f.typ).kind == .struct_ { typ := if c.table.get_type_symbol(f.typ).kind == .struct_ {
f.typ f.typ
} else if c.table.get_type_symbol(f.typ).kind == .array { } else if c.table.get_type_symbol(f.typ).kind == .array {
@ -7752,9 +7753,10 @@ fn (mut c Checker) sql_stmt_line(mut node ast.SqlStmtLine) ast.Type {
info := table_sym.info as ast.Struct info := table_sym.info as ast.Struct
fields := c.fetch_and_verify_orm_fields(info, node.table_expr.pos, table_sym.name) fields := c.fetch_and_verify_orm_fields(info, node.table_expr.pos, table_sym.name)
mut sub_structs := map[int]ast.SqlStmtLine{} mut sub_structs := map[int]ast.SqlStmtLine{}
for f in fields.filter((c.table.type_symbols[int(it.typ)].kind == .struct_) for f in fields.filter(((c.table.type_symbols[int(it.typ)].kind == .struct_)
|| (c.table.get_type_symbol(it.typ).kind == .array || (c.table.get_type_symbol(it.typ).kind == .array
&& c.table.get_type_symbol(c.table.get_type_symbol(it.typ).array_info().elem_type).kind == .struct_)) { && c.table.get_type_symbol(c.table.get_type_symbol(it.typ).array_info().elem_type).kind == .struct_))
&& c.table.get_type_name(it.typ) != 'time.Time') {
typ := if c.table.get_type_symbol(f.typ).kind == .struct_ { typ := if c.table.get_type_symbol(f.typ).kind == .struct_ {
f.typ f.typ
} else if c.table.get_type_symbol(f.typ).kind == .array { } else if c.table.get_type_symbol(f.typ).kind == .array {

View File

@ -114,7 +114,11 @@ fn (mut g Gen) sql_create_table(node ast.SqlStmtLine, expr string, table_name st
sym := g.table.get_type_symbol(field.typ) sym := g.table.get_type_symbol(field.typ)
g.write('(orm__TableField){') g.write('(orm__TableField){')
g.write('.name = _SLIT("$field.name"),') g.write('.name = _SLIT("$field.name"),')
g.write('.typ = ${int(field.typ)},') mut typ := int(field.typ)
if sym.name == 'time.Time' {
typ = -2
}
g.write('.typ = $typ,')
g.write('.is_arr = ${sym.kind == .array}, ') g.write('.is_arr = ${sym.kind == .array}, ')
g.write('.is_time = ${int(g.table.get_type_name(field.typ) == 'time__Time')},') g.write('.is_time = ${int(g.table.get_type_name(field.typ) == 'time__Time')},')
g.write('.default_val = (string){.str = (byteptr) "$field.default_val", .is_lit = 1},') g.write('.default_val = (string){.str = (byteptr) "$field.default_val", .is_lit = 1},')
@ -151,7 +155,7 @@ fn (mut g Gen) sql_insert(node ast.SqlStmtLine, expr string, table_name string,
for f in node.fields { for f in node.fields {
sym := g.table.get_type_symbol(f.typ) sym := g.table.get_type_symbol(f.typ)
if sym.kind == .struct_ { if sym.kind == .struct_ && sym.name != 'time.Time' {
subs << node.sub_structs[int(f.typ)] subs << node.sub_structs[int(f.typ)]
} else if sym.kind == .array { } else if sym.kind == .array {
mut f_key := '' mut f_key := ''
@ -206,12 +210,12 @@ fn (mut g Gen) sql_insert(node ast.SqlStmtLine, expr string, table_name string,
continue continue
} }
mut sym := g.table.get_type_symbol(f.typ) mut sym := g.table.get_type_symbol(f.typ)
if sym.kind == .struct_ { mut typ := sym.cname
if sym.kind == .struct_ && typ != 'time__Time' {
g.write('(*(orm__Primitive*) array_get($last_ids_arr, $structs)),') g.write('(*(orm__Primitive*) array_get($last_ids_arr, $structs)),')
structs++ structs++
continue continue
} }
mut typ := sym.cname
if typ == 'time__Time' { if typ == 'time__Time' {
typ = 'time' typ = 'time'
} }
@ -571,6 +575,10 @@ fn (mut g Gen) sql_select(node ast.SqlExpr, expr string, left string) {
for field in select_fields { for field in select_fields {
g.write('_SLIT("${g.get_field_name(field)}"),') g.write('_SLIT("${g.get_field_name(field)}"),')
sym := g.table.get_type_symbol(field.typ) sym := g.table.get_type_symbol(field.typ)
if sym.name == 'time.Time' {
types << -2
continue
}
if sym.kind == .struct_ { if sym.kind == .struct_ {
types << int(ast.int_type) types << int(ast.int_type)
continue continue
@ -664,7 +672,7 @@ fn (mut g Gen) sql_select(node ast.SqlExpr, expr string, left string) {
for i, field in fields { for i, field in fields {
sel := '(*(orm__Primitive*) array_get((*(Array_orm__Primitive*) array_get($res, $idx)), $i))' sel := '(*(orm__Primitive*) array_get((*(Array_orm__Primitive*) array_get($res, $idx)), $i))'
sym := g.table.get_type_symbol(field.typ) sym := g.table.get_type_symbol(field.typ)
if sym.kind == .struct_ { if sym.kind == .struct_ && sym.name != 'time.Time' {
mut sub := node.sub_structs[int(field.typ)] mut sub := node.sub_structs[int(field.typ)]
mut where_expr := sub.where_expr as ast.InfixExpr mut where_expr := sub.where_expr as ast.InfixExpr
mut ident := where_expr.right as ast.Ident mut ident := where_expr.right as ast.Ident
@ -819,7 +827,7 @@ fn (mut g Gen) get_field_name(field ast.StructField) string {
} }
} }
sym := g.table.get_type_symbol(field.typ) sym := g.table.get_type_symbol(field.typ)
if sym.kind == .struct_ { if sym.kind == .struct_ && sym.name != 'time.Time' {
name = '${name}_id' name = '${name}_id'
} }
return name return name