1 | // import db.mysql |
2 | // import db.pg |
3 | import time |
4 | import db.sqlite |
5 | |
6 | const ( |
7 | offset_const = 2 |
8 | ) |
9 | |
10 | struct Module { |
11 | id int [primary; sql: serial] |
12 | name string |
13 | nr_downloads int |
14 | test_id u64 |
15 | user User |
16 | created time.Time |
17 | } |
18 | |
19 | [table: 'userlist'] |
20 | struct User { |
21 | id int [primary; sql: serial] |
22 | age int |
23 | name string [sql: 'username'] |
24 | is_customer bool |
25 | skipped_string string [skip] |
26 | skipped_string2 string [sql: '-'] |
27 | skipped_array []string [skip] |
28 | skipped_array2 []string [sql: '-'] |
29 | } |
30 | |
31 | struct Foo { |
32 | age int |
33 | } |
34 | |
35 | struct TestTime { |
36 | id int [primary; sql: serial] |
37 | create time.Time |
38 | } |
39 | |
40 | fn test_use_struct_field_as_limit() { |
41 | db := sqlite.connect(':memory:') or { panic(err) } |
42 | |
43 | sql db { |
44 | create table User |
45 | }! |
46 | |
47 | foo := Foo{ |
48 | age: 10 |
49 | } |
50 | |
51 | sam := User{ |
52 | age: 29 |
53 | name: 'Sam' |
54 | skipped_string2: 'this should be ignored' |
55 | skipped_array: ['ignored', 'array'] |
56 | skipped_array2: ['another', 'ignored', 'array'] |
57 | } |
58 | |
59 | sql db { |
60 | insert sam into User |
61 | }! |
62 | |
63 | users := sql db { |
64 | select from User limit foo.age |
65 | }! |
66 | |
67 | assert users.len == 1 |
68 | assert users[0].name == 'Sam' |
69 | assert users[0].age == 29 |
70 | assert users[0].skipped_string == '' |
71 | assert users[0].skipped_string2 == '' |
72 | assert users[0].skipped_array == [], 'skipped because of the [skip] tag, used for both sql and json' |
73 | assert users[0].skipped_array2 == [], "should be skipped, because of the sql specific [sql: '-'] tag" |
74 | } |
75 | |
76 | fn test_orm() { |
77 | db := sqlite.connect(':memory:') or { panic(err) } |
78 | |
79 | sql db { |
80 | create table Module |
81 | }! |
82 | sql db { |
83 | create table User |
84 | }! |
85 | |
86 | name := 'Peter' |
87 | |
88 | sam := User{ |
89 | age: 29 |
90 | name: 'Sam' |
91 | } |
92 | |
93 | peter := User{ |
94 | age: 31 |
95 | name: 'Peter' |
96 | } |
97 | |
98 | k := User{ |
99 | age: 30 |
100 | name: 'Kate' |
101 | is_customer: true |
102 | } |
103 | |
104 | sql db { |
105 | insert sam into User |
106 | insert peter into User |
107 | insert k into User |
108 | }! |
109 | |
110 | c := sql db { |
111 | select count from User where id != 1 |
112 | }! |
113 | assert c == 2 |
114 | |
115 | nr_all_users := sql db { |
116 | select count from User |
117 | }! |
118 | assert nr_all_users == 3 |
119 | |
120 | nr_users1 := sql db { |
121 | select count from User where id == 1 |
122 | }! |
123 | assert nr_users1 == 1 |
124 | |
125 | nr_peters := sql db { |
126 | select count from User where id == 2 && name == 'Peter' |
127 | }! |
128 | assert nr_peters == 1 |
129 | |
130 | nr_peters2 := sql db { |
131 | select count from User where id == 2 && name == name |
132 | }! |
133 | assert nr_peters2 == 1 |
134 | |
135 | nr_peters3 := sql db { |
136 | select count from User where name == name |
137 | }! |
138 | assert nr_peters3 == 1 |
139 | |
140 | peters := sql db { |
141 | select from User where name == name |
142 | }! |
143 | assert peters.len == 1 |
144 | assert peters[0].name == 'Peter' |
145 | |
146 | mut users := sql db { |
147 | select from User where name == name limit 1 |
148 | }! |
149 | |
150 | one_peter := users.first() |
151 | assert one_peter.name == 'Peter' |
152 | assert one_peter.id == 2 |
153 | |
154 | users = sql db { |
155 | select from User where id == 1 |
156 | }! |
157 | |
158 | user := users.first() |
159 | assert user.name == 'Sam' |
160 | assert user.id == 1 |
161 | assert user.age == 29 |
162 | |
163 | users = sql db { |
164 | select from User where id > 0 |
165 | }! |
166 | assert users.len == 3 |
167 | assert users[0].name == 'Sam' |
168 | assert users[1].name == 'Peter' |
169 | assert users[1].age == 31 |
170 | |
171 | users2 := sql db { |
172 | select from User where id < 0 |
173 | }! |
174 | assert users2.len == 0 |
175 | |
176 | users3 := sql db { |
177 | select from User where age == 29 || age == 31 |
178 | }! |
179 | |
180 | assert users3.len == 2 |
181 | assert users3[0].age == 29 |
182 | assert users3[1].age == 31 |
183 | |
184 | new_user := User{ |
185 | name: 'New user' |
186 | age: 30 |
187 | } |
188 | sql db { |
189 | insert new_user into User |
190 | }! |
191 | |
192 | users = sql db { |
193 | select from User where id == 4 |
194 | }! |
195 | |
196 | x := users.first() |
197 | assert x.age == 30 |
198 | assert x.id == 4 |
199 | assert x.name == 'New user' |
200 | |
201 | users = sql db { |
202 | select from User where id == 3 |
203 | }! |
204 | |
205 | kate := users.first() |
206 | assert kate.is_customer == true |
207 | |
208 | users = sql db { |
209 | select from User where is_customer == true limit 1 |
210 | }! |
211 | |
212 | customer := users.first() |
213 | assert customer.is_customer == true |
214 | assert customer.name == 'Kate' |
215 | |
216 | sql db { |
217 | update User set age = 31 where name == 'Kate' |
218 | }! |
219 | |
220 | users = sql db { |
221 | select from User where id == 3 |
222 | }! |
223 | kate2 := users.first() |
224 | assert kate2.age == 31 |
225 | assert kate2.name == 'Kate' |
226 | |
227 | sql db { |
228 | update User set age = 32, name = 'Kate N' where name == 'Kate' |
229 | }! |
230 | |
231 | users = sql db { |
232 | select from User where id == 3 |
233 | }! |
234 | mut kate3 := users.first() |
235 | assert kate3.age == 32 |
236 | assert kate3.name == 'Kate N' |
237 | |
238 | new_age := 33 |
239 | sql db { |
240 | update User set age = new_age, name = 'Kate N' where id == 3 |
241 | }! |
242 | |
243 | users = sql db { |
244 | select from User where id == 3 |
245 | }! |
246 | |
247 | kate3 = users.first() |
248 | assert kate3.age == 33 |
249 | assert kate3.name == 'Kate N' |
250 | |
251 | foo := Foo{34} |
252 | sql db { |
253 | update User set age = foo.age, name = 'Kate N' where id == 3 |
254 | }! |
255 | |
256 | users = sql db { |
257 | select from User where id == 3 |
258 | }! |
259 | kate3 = users.first() |
260 | assert kate3.age == 34 |
261 | assert kate3.name == 'Kate N' |
262 | |
263 | no_user := sql db { |
264 | select from User where id == 30 |
265 | }! |
266 | |
267 | assert no_user.len == 0 |
268 | |
269 | two_users := sql db { |
270 | select from User limit 2 |
271 | }! |
272 | assert two_users.len == 2 |
273 | assert two_users[0].id == 1 |
274 | |
275 | y := sql db { |
276 | select from User limit 2 offset 1 |
277 | }! |
278 | assert y.len == 2 |
279 | assert y[0].id == 2 |
280 | |
281 | z := sql db { |
282 | select from User order by id limit 2 offset offset_const |
283 | }! |
284 | assert z.len == 2 |
285 | assert z[0].id == 3 |
286 | |
287 | users = sql db { |
288 | select from User order by age desc limit 1 |
289 | }! |
290 | |
291 | oldest := users.first() |
292 | assert oldest.age == 34 |
293 | |
294 | offs := 1 |
295 | users = sql db { |
296 | select from User order by age desc limit 1 offset offs |
297 | }! |
298 | |
299 | second_oldest := users.first() |
300 | assert second_oldest.age == 31 |
301 | sql db { |
302 | delete from User where age == 34 |
303 | }! |
304 | |
305 | users = sql db { |
306 | select from User order by age desc limit 1 |
307 | }! |
308 | updated_oldest := users.first() |
309 | assert updated_oldest.age == 31 |
310 | |
311 | // Remove this when pg is used |
312 | // db.exec('insert into User (name, age) values (NULL, 31)') |
313 | users = sql db { |
314 | select from User where id == 5 |
315 | }! |
316 | assert users.len == 0 |
317 | |
318 | users = sql db { |
319 | select from User where id == 1 |
320 | }! |
321 | age_test := users.first() |
322 | |
323 | assert age_test.age == 29 |
324 | |
325 | sql db { |
326 | update User set age = age + 1 where id == 1 |
327 | }! |
328 | |
329 | users = sql db { |
330 | select from User where id == 1 |
331 | }! |
332 | |
333 | mut first := users.first() |
334 | assert first.age == 30 |
335 | |
336 | sql db { |
337 | update User set age = age * 2 where id == 1 |
338 | }! |
339 | |
340 | users = sql db { |
341 | select from User where id == 1 |
342 | }! |
343 | |
344 | first = users.first() |
345 | assert first.age == 60 |
346 | |
347 | sql db { |
348 | create table TestTime |
349 | }! |
350 | |
351 | tnow := time.now() |
352 | |
353 | time_test := TestTime{ |
354 | create: tnow |
355 | } |
356 | |
357 | sql db { |
358 | insert time_test into TestTime |
359 | }! |
360 | |
361 | data := sql db { |
362 | select from TestTime where create == tnow |
363 | }! |
364 | |
365 | assert data.len == 1 |
366 | assert tnow.unix == data[0].create.unix |
367 | |
368 | mod := Module{} |
369 | |
370 | sql db { |
371 | insert mod into Module |
372 | }! |
373 | |
374 | sql db { |
375 | update Module set test_id = 11 where id == 1 |
376 | }! |
377 | |
378 | mut modules := sql db { |
379 | select from Module where id == 1 |
380 | }! |
381 | |
382 | assert modules.first().test_id == 11 |
383 | |
384 | t := time.now() |
385 | sql db { |
386 | update Module set created = t where id == 1 |
387 | }! |
388 | |
389 | modules = sql db { |
390 | select from Module where id == 1 |
391 | }! |
392 | |
393 | // Note: usually updated_time_mod.created != t, because t has |
394 | // its microseconds set, while the value retrieved from the DB |
395 | // has them zeroed, because the db field resolution is seconds. |
396 | assert modules.first().created.format_ss() == t.format_ss() |
397 | |
398 | users = sql db { |
399 | select from User where (name == 'Sam' && is_customer == true) || id == 1 |
400 | }! |
401 | |
402 | assert users.first() == first |
403 | |
404 | sql db { |
405 | drop table Module |
406 | drop table TestTime |
407 | }! |
408 | } |