test/database.c

Tue, 09 Dec 2025 18:24:48 +0100

author
Olaf Wintermann <olaf.wintermann@gmail.com>
date
Tue, 09 Dec 2025 18:24:48 +0100
changeset 26
dc36aa437249
parent 25
0bb91d1f9bba
permissions
-rw-r--r--

implement json primitives serialization

23
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
1 /*
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
3 *
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
4 * Copyright 2025 Olaf Wintermann. All rights reserved.
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
5 *
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
6 * Redistribution and use in source and binary forms, with or without
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
7 * modification, are permitted provided that the following conditions are met:
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
8 *
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
9 * 1. Redistributions of source code must retain the above copyright
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
10 * notice, this list of conditions and the following disclaimer.
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
11 *
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
12 * 2. Redistributions in binary form must reproduce the above copyright
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
13 * notice, this list of conditions and the following disclaimer in the
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
14 * documentation and/or other materials provided with the distribution.
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
15 *
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
17 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
18 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
19 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
20 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
21 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
22 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
23 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
24 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
25 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
26 * POSSIBLIITY OF SUCH DAMAGE.
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
27 */
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
28
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
29 #include "database.h"
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
30
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
31 #include <stdio.h>
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
32 #include <stdlib.h>
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
33 #include <errno.h>
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
34 #include <unistd.h>
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
35
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
36 #include <cx/buffer.h>
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
37 #include <cx/streams.h>
25
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
38 #include <cx/mempool.h>
23
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
39
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
40 #define TEST_DB "test.db"
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
41 #define TEST_DATA_FILE "testdata.sql"
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
42
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
43
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
44 // create test.db and execute testdata script
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
45 int init_test_db(void) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
46 sqlite3 *db;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
47 char *err_msg = NULL;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
48
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
49 FILE *f = fopen(TEST_DATA_FILE, "r");
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
50 if(!f) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
51 fprintf(stderr, "Cannot open test data file %s: %s\n", TEST_DATA_FILE, strerror(errno));
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
52 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
53
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
54 if(unlink(TEST_DB)) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
55 if(errno != ENOENT) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
56 fprintf(stderr, "Cannot unlink %s: %s\n", TEST_DB, strerror(errno));
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
57 fclose(f);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
58 return 1;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
59 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
60 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
61 if(sqlite3_open(TEST_DB, &db) != SQLITE_OK) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
62 fprintf(stderr, "Cannot open database %s: %s\n", TEST_DB, sqlite3_errmsg(db));
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
63 fclose(f);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
64 return 1;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
65 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
66
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
67 CxBuffer *buf = cxBufferCreate(NULL, 2048, NULL, CX_BUFFER_AUTO_EXTEND | CX_BUFFER_FREE_CONTENTS);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
68 cx_stream_copy(f, buf, (cx_read_func)fread, (cx_write_func)cxBufferWrite);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
69 int err = 0;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
70 if(buf->size > 0) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
71 cxBufferTerminate(buf);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
72
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
73 if(sqlite3_exec(db, buf->space, 0, 0, &err_msg) != SQLITE_OK) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
74 fprintf(stderr, "SQL error: %s\n", err_msg);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
75 sqlite3_free(err_msg);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
76 err = 1;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
77 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
78 } else {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
79 fprintf(stderr, "Error: no file content\n");
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
80 err = 1;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
81 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
82 cxBufferFree(buf);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
83 sqlite3_close(db);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
84
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
85 return err;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
86 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
87
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
88
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
89
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
90 static DBUContext *ctx;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
91 static DBUConnection *conn;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
92
25
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
93 static DBUClass *address;
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
94 static DBUClass *person;
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
95 static DBUClass *role;
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
96
23
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
97 typedef struct Address {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
98 int64_t address_id;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
99
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
100 cxmutstr street;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
101 cxmutstr zip;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
102 cxmutstr city;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
103 } Address;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
104
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
105 typedef struct Person {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
106 int64_t person_id;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
107
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
108 cxmutstr name;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
109 cxmutstr email;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
110 int age;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
111 bool iscustomer;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
112 uint64_t hash;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
113
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
114 Address *address;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
115
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
116 CxList *roles;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
117 } Person;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
118
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
119 typedef struct Role {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
120 int64_t role_id;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
121 int64_t person_id;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
122 cxmutstr name;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
123 } Role;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
124
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
125 int init_db_tests(void) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
126 ctx = dbuContextCreate();
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
127
25
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
128 address = dbuRegisterClass(ctx, "address", Address, address_id);
23
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
129 dbuClassAdd(address, Address, street);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
130 dbuClassAdd(address, Address, zip);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
131 dbuClassAdd(address, Address, city);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
132
25
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
133 role = dbuRegisterClass(ctx, "role", Role, role_id);
23
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
134
25
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
135 person = dbuRegisterClass(ctx, "person", Person, person_id);
23
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
136 dbuClassAdd(person, Person, name);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
137 dbuClassAdd(person, Person, email);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
138 dbuClassAdd(person, Person, age);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
139 dbuClassAdd(person, Person, iscustomer);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
140 dbuClassAdd(person, Person, hash);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
141 dbuClassAddObj(person, "address_id", offsetof(Person, address), address);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
142 dbuClassAddCxLinkedList(person, "person_id", offsetof(Person, roles), role);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
143
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
144 dbuClassAddForeignKey(role, Role, person_id, person);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
145 dbuClassAdd(role, Role, name);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
146
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
147 return 0;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
148 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
149
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
150 void cleanup_db_tests(void) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
151 if(conn) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
152 dbuConnectionFree(conn);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
153 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
154 dbuContextFree(ctx);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
155 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
156
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
157 CX_TEST(testSqliteConnection) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
158 CX_TEST_DO {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
159 conn = dbuSQLiteConnection(TEST_DB);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
160 CX_TEST_ASSERT(conn);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
161 CX_TEST_ASSERT(dbuConnectionIsActive(conn));
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
162 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
163 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
164
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
165 CX_TEST(testConnectionExec) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
166 CX_TEST_DO {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
167 CX_TEST_ASSERT(conn);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
168
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
169 int t1 = dbuConnectionExec(conn, "create table ExecTest1(a int);");
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
170 CX_TEST_ASSERT(t1 == 0);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
171
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
172 int t2 = dbuConnectionExec(conn, "insert into ExecTest1(a) values (1);");
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
173 CX_TEST_ASSERT(t2 == 0);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
174
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
175 int t3 = dbuConnectionExec(conn, "drop table ExecTest1;");
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
176 CX_TEST_ASSERT(t3 == 0);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
177
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
178 int fail = dbuConnectionExec(conn, "select * from Fail;");
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
179 CX_TEST_ASSERT(fail != 0);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
180 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
181 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
182
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
183 CX_TEST(testSingleValueQuery) {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
184 CX_TEST_DO {
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
185 CX_TEST_ASSERT(conn);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
186
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
187 DBUQuery *q = dbuConnectionQuery(conn, NULL);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
188 CX_TEST_ASSERT(q);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
189 CX_TEST_ASSERT(dbuQuerySetSQL(q, "select 12;") == 0);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
190 CX_TEST_ASSERT(dbuQueryExec(q) == 0);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
191
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
192 DBUResult *r = dbuQueryGetResult(q);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
193 CX_TEST_ASSERT(r);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
194 int value;
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
195 CX_TEST_ASSERT(dbuResultAsValue(r, &value) == 0);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
196 CX_TEST_ASSERT(value == 12);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
197
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
198 dbuQueryFree(q);
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
199
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
200 }
b26390e77237 add first tests
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff changeset
201 }
24
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
202
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
203 CX_TEST(testSqlExec) {
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
204 CX_TEST_DO {
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
205 CX_TEST_ASSERT(conn);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
206
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
207 DBUResult *r = dbuSqlExec(conn, NULL, "select email from person where name = 'alice';");
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
208 CX_TEST_ASSERT(r);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
209 cxmutstr value;
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
210 CX_TEST_ASSERT(dbuResultAsValue(r, &value) == 0);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
211 CX_TEST_ASSERT(!cx_strcmp(value, "alice@example.com"));
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
212 free(value.ptr);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
213 }
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
214 }
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
215
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
216 CX_TEST(testSqlExecParam) {
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
217 CX_TEST_DO {
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
218 CX_TEST_ASSERT(conn);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
219
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
220 DBUResult *r = dbuSqlExecParam(conn, NULL, "select email from person where name = ?;", "alice");
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
221 CX_TEST_ASSERT(r);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
222 cxmutstr value;
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
223 CX_TEST_ASSERT(dbuResultAsValue(r, &value) == 0);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
224 CX_TEST_ASSERT(!cx_strcmp(value, "alice@example.com"));
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
225 free(value.ptr);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
226
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
227 r = dbuSqlExecParam(conn, NULL, "select name from person where hash = ?;", 987654321);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
228 CX_TEST_ASSERT(r);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
229 CX_TEST_ASSERT(dbuResultAsValue(r, &value) == 0);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
230 CX_TEST_ASSERT(!cx_strcmp(value, "bob"));
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
231 free(value.ptr);
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
232 }
df671b62538e add dbuSqlExec API
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 23
diff changeset
233 }
25
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
234
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
235 CX_TEST(testSingleTableQuery) {
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
236 CxMempool *mp = cxMempoolCreateSimple(64);
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
237
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
238 CX_TEST_DO {
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
239 DBUQuery *query = dbuQueryCreate(conn, mp->allocator, "select * from address order by street;");
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
240 DBUObjectBuilder *builder = dbuObjectBuilder(address, query, mp->allocator);
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
241 CxList *adr = dbuObjectBuilderGetList(builder);
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
242
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
243 CX_TEST_ASSERT(adr);
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
244 CX_TEST_ASSERT(cxListSize(adr) == 2);
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
245
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
246 Address *a0 = cxListAt(adr, 0);
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
247 Address *a1 = cxListAt(adr, 1);
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
248 CX_TEST_ASSERT(a0);
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
249 CX_TEST_ASSERT(a1);
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
250 CX_TEST_ASSERT(!cx_strcmp(a0->street, "street 1"));
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
251 CX_TEST_ASSERT(!cx_strcmp(a1->street, "street 2"));
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
252 CX_TEST_ASSERT(!cx_strcmp(a0->zip, "12343"));
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
253 CX_TEST_ASSERT(!cx_strcmp(a1->zip, "23456"));
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
254 CX_TEST_ASSERT(!cx_strcmp(a0->city, "city 17"));
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
255 CX_TEST_ASSERT(!cx_strcmp(a1->city, "city 18"));
26
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 25
diff changeset
256
dc36aa437249 implement json primitives serialization
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 25
diff changeset
257 dbuObjectBuilderDestroy(builder);
25
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
258 }
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
259
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
260 cxMempoolFree(mp);
0bb91d1f9bba add single table query test
Olaf Wintermann <olaf.wintermann@gmail.com>
parents: 24
diff changeset
261 }

mercurial