vxx2 / vlib / orm / orm_mut_connection_test.v
121 lines · 98 sloc · 2.95 KB · f581cbb1c964f89133439f4e303136998ddcfcfb
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
83// execute is used internally by V's ORM for executing raw SQL queries
84fn (mut db Database) execute(query string) ![]orm.Row {
85 db.query(query)!
86 return []orm.Row{}
87}
88
89fn test_orm_mut_connection() {
90 mut db := Database{}
91
92 sql db {
93 create table User
94 }!
95
96 first_user := User{
97 name: 'first'
98 }
99 second_user := User{
100 name: 'second'
101 }
102
103 sql db {
104 insert first_user into User
105 insert second_user into User
106 }!
107
108 sql db {
109 drop table User
110 }!
111
112 assert db.last_query == 'DROP TABLE user;'
113}
114
115fn test_orm_execute_on_mock() {
116 mut db := Database{}
117
118 result := db.execute('SELECT 1 AS test_val')!
119 assert db.last_query == 'SELECT 1 AS test_val'
120 assert result.len == 0
121}
122