mirror of
https://github.com/vlang/v.git
synced 2023-08-10 21:13:21 +03:00
orm: fix time (#11026)
This commit is contained in:
parent
6dcf72fe9b
commit
a55ba08fad
@ -256,7 +256,7 @@ fn mysql_type_from_v(typ int) ?string {
|
||||
6, 10 {
|
||||
'SMALLINT'
|
||||
}
|
||||
7, 11 {
|
||||
7, 11, orm.time {
|
||||
'INT'
|
||||
}
|
||||
8, 12 {
|
||||
|
@ -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 ctyp := sql_from_v(sql_field_type(field)) or {
|
||||
field_name = '${field_name}_id'
|
||||
sql_from_v(8) ?
|
||||
sql_from_v(7) ?
|
||||
}
|
||||
if ctyp == '' {
|
||||
return error('Unknown type ($field.typ) for field $field.name in struct $table')
|
||||
|
@ -1,6 +1,7 @@
|
||||
// import os
|
||||
// import pg
|
||||
// import term
|
||||
import time
|
||||
import sqlite
|
||||
|
||||
struct Module {
|
||||
@ -23,6 +24,11 @@ struct Foo {
|
||||
age int
|
||||
}
|
||||
|
||||
struct TestTime {
|
||||
id int [primary; sql: serial]
|
||||
create time.Time
|
||||
}
|
||||
|
||||
fn test_orm_sqlite() {
|
||||
db := sqlite.connect(':memory:') or { panic(err) }
|
||||
db.exec('drop table if exists User')
|
||||
@ -287,4 +293,24 @@ fn test_orm_sqlite() {
|
||||
}
|
||||
|
||||
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
|
||||
}
|
||||
|
@ -181,7 +181,7 @@ fn pg_type_from_v(typ int) ?string {
|
||||
6, 10 {
|
||||
'SMALLINT'
|
||||
}
|
||||
7, 11 {
|
||||
7, 11, orm.time {
|
||||
'INT'
|
||||
}
|
||||
8, 12 {
|
||||
|
@ -140,7 +140,8 @@ fn (stmt Stmt) sqlite_select_column(idx int, typ int) ?orm.Primitive {
|
||||
} else if typ == orm.string {
|
||||
primitive = stmt.get_text(idx).clone()
|
||||
} else if typ == orm.time {
|
||||
primitive = time.unix(stmt.get_int(idx))
|
||||
d := stmt.get_int(idx)
|
||||
primitive = time.unix(d)
|
||||
} else {
|
||||
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 {
|
||||
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'
|
||||
} else if typ in orm.float {
|
||||
'REAL'
|
||||
|
@ -7651,9 +7651,10 @@ fn (mut c Checker) sql_expr(mut node ast.SqlExpr) ast.Type {
|
||||
info := sym.info as ast.Struct
|
||||
fields := c.fetch_and_verify_orm_fields(info, node.table_expr.pos, sym.name)
|
||||
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(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_ {
|
||||
f.typ
|
||||
} 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
|
||||
fields := c.fetch_and_verify_orm_fields(info, node.table_expr.pos, table_sym.name)
|
||||
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(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_ {
|
||||
f.typ
|
||||
} else if c.table.get_type_symbol(f.typ).kind == .array {
|
||||
|
@ -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)
|
||||
g.write('(orm__TableField){')
|
||||
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_time = ${int(g.table.get_type_name(field.typ) == 'time__Time')},')
|
||||
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 {
|
||||
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)]
|
||||
} else if sym.kind == .array {
|
||||
mut f_key := ''
|
||||
@ -206,12 +210,12 @@ fn (mut g Gen) sql_insert(node ast.SqlStmtLine, expr string, table_name string,
|
||||
continue
|
||||
}
|
||||
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)),')
|
||||
structs++
|
||||
continue
|
||||
}
|
||||
mut typ := sym.cname
|
||||
if typ == 'time__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 {
|
||||
g.write('_SLIT("${g.get_field_name(field)}"),')
|
||||
sym := g.table.get_type_symbol(field.typ)
|
||||
if sym.name == 'time.Time' {
|
||||
types << -2
|
||||
continue
|
||||
}
|
||||
if sym.kind == .struct_ {
|
||||
types << int(ast.int_type)
|
||||
continue
|
||||
@ -664,7 +672,7 @@ fn (mut g Gen) sql_select(node ast.SqlExpr, expr string, left string) {
|
||||
for i, field in fields {
|
||||
sel := '(*(orm__Primitive*) array_get((*(Array_orm__Primitive*) array_get($res, $idx)), $i))'
|
||||
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 where_expr := sub.where_expr as ast.InfixExpr
|
||||
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)
|
||||
if sym.kind == .struct_ {
|
||||
if sym.kind == .struct_ && sym.name != 'time.Time' {
|
||||
name = '${name}_id'
|
||||
}
|
||||
return name
|
||||
|
Loading…
Reference in New Issue
Block a user