v / vlib / orm / orm_mut_connection_test.v
107 lines · 87 sloc · 2.62 KB · e2e5cf8db56f3562c7baa735061690be936bdf3e
Raw
1// vtest retry: 3
2import orm
3
4struct Database {
5mut:
6 last_query string
7}
8
9struct User {
10 id int @[primary; sql: serial]
11 name string
12}
13
14fn (mut db Database) query(sql_stmt string) ! {
15 db.last_query = sql_stmt
16}
17
18// select is used internally by V's ORM for processing `SELECT` queries
19fn (mut db Database) select(config orm.SelectConfig, data orm.QueryData, where orm.QueryData) ![][]orm.Primitive {
20 // 1. Create query and bind necessary data
21 query := orm.orm_select_gen(config, '', true, ':', 1, where)
22 mut ret := [][]orm.Primitive{}
23 return ret
24}
25
26// insert is used internally by V's ORM for processing `INSERT` queries
27fn (mut db Database) insert(table orm.Table, data orm.QueryData) ! {
28 query, _ := orm.orm_stmt_gen(.sqlite, table, '', .insert, false, '?', 1, data, orm.QueryData{})
29
30 db.query(query)!
31}
32
33// update is used internally by V's ORM for processing `UPDATE` queries
34fn (mut db Database) update(table orm.Table, data orm.QueryData, where orm.QueryData) ! {
35 mut query, _ := orm.orm_stmt_gen(.sqlite, table, '', .update, true, ':', 1, data, where)
36
37 db.query(query)!
38}
39
40// delete is used internally by V's ORM for processing `DELETE ` queries
41fn (mut db Database) delete(table orm.Table, where orm.QueryData) ! {
42 query, converted := orm.orm_stmt_gen(.sqlite, table, '', .delete, true, ':', 1, orm.QueryData{},
43 where)
44
45 db.query(query)!
46}
47
48// last_id is used internally by V's ORM for post-processing `INSERT` queries
49fn (mut db Database) last_id() int {
50 return 0
51}
52
53// DDL (table creation/destroying etc)
54fn sqlite_type_from_v(typ int) !string {
55 return if typ in orm.nums || typ in orm.num64 || typ in [orm.serial, orm.time_, orm.enum_] {
56 'INTEGER'
57 } else if typ in orm.float {
58 'REAL'
59 } else if typ == orm.type_string {
60 'TEXT'
61 } else {
62 error('Unknown type ${typ}')
63 }
64}
65
66// create is used internally by V's ORM for processing table creation queries (DDL)
67fn (mut db Database) create(table orm.Table, fields []orm.TableField) ! {
68 mut query := orm.orm_table_gen(.sqlite, table, '', true, 0, fields, sqlite_type_from_v, false) or {
69 return err
70 }
71 db.query(query)!
72}
73
74// drop is used internally by V's ORM for processing table destroying queries (DDL)
75fn (mut db Database) drop(table orm.Table) ! {
76 query := 'DROP TABLE ${table.name};'
77 $if trace_orm ? {
78 eprintln('> vsql drop: ${query}')
79 }
80 db.query(query)!
81}
82
83fn test_orm_mut_connection() {
84 mut db := Database{}
85
86 sql db {
87 create table User
88 }!
89
90 first_user := User{
91 name: 'first'
92 }
93 second_user := User{
94 name: 'second'
95 }
96
97 sql db {
98 insert first_user into User
99 insert second_user into User
100 }!
101
102 sql db {
103 drop table User
104 }!
105
106 assert db.last_query == 'DROP TABLE user;'
107}
108