| 38 "person_id integer primary key autoincrement, " |
38 "person_id integer primary key autoincrement, " |
| 39 "name text, " |
39 "name text, " |
| 40 "email text, " |
40 "email text, " |
| 41 "age integer, " |
41 "age integer, " |
| 42 "iscustomer integer , " |
42 "iscustomer integer , " |
| 43 "hash integer);"; |
43 "hash integer, " |
| |
44 "address_id integer);"; |
| |
45 |
| |
46 const char *sql_create_table_address = |
| |
47 "create table if not exists Address (" |
| |
48 "address_id integer primary key autoincrement, " |
| |
49 "street text, " |
| |
50 "zip text, " |
| |
51 "city text);"; |
| |
52 |
| 44 |
53 |
| 45 const char *sql_check_table = |
54 const char *sql_check_table = |
| 46 "select person_id from Person limit 1;"; |
55 "select person_id from Person limit 1;"; |
| 47 |
56 |
| 48 const char *sql_create_test_data = |
57 |
| 49 "insert into person (name, email, age, iscustomer, hash) " |
58 |
| |
59 const char *sql_create_test_data1 = |
| |
60 "insert into address (street, zip, city) " |
| 50 "values " |
61 "values " |
| 51 "('alice', 'alice@example.com', 30, 1, 123456789), " |
62 "('street 1', '12343', 'city 17'), " |
| 52 "('bob', 'bob@example.com', 25, 0, 987654321);"; |
63 "('street 2', '23456', 'city 18');"; |
| |
64 |
| |
65 const char *sql_create_test_data2 = |
| |
66 "insert into person (name, email, age, iscustomer, hash, address_id) " |
| |
67 "values " |
| |
68 "('alice', 'alice@example.com', 30, 1, 123456789, (select address_id from address where street = 'street 1')), " |
| |
69 "('bob', 'bob@example.com', 25, 0, 987654321, (select address_id from address where street = 'street 2'));"; |
| |
70 |
| |
71 typedef struct Address { |
| |
72 int64_t address_id; |
| |
73 |
| |
74 cxmutstr street; |
| |
75 cxmutstr zip; |
| |
76 cxmutstr city; |
| |
77 } Address; |
| 53 |
78 |
| 54 typedef struct Person { |
79 typedef struct Person { |
| 55 int64_t person_id; |
80 int64_t person_id; |
| 56 |
81 |
| 57 cxmutstr name; |
82 cxmutstr name; |
| 58 cxmutstr email; |
83 cxmutstr email; |
| 59 int age; |
84 int age; |
| 60 bool iscustomer; |
85 bool iscustomer; |
| 61 uint64_t hash; |
86 uint64_t hash; |
| |
87 |
| |
88 Address *address; |
| 62 } Person; |
89 } Person; |
| 63 |
90 |
| |
91 |
| |
92 |
| 64 static int create_test_data(sqlite3 *db); |
93 static int create_test_data(sqlite3 *db); |
| 65 |
94 |
| 66 int main(int argc, char **argv) { |
95 int main(int argc, char **argv) { |
| 67 |
96 |
| 68 |
97 |
| 69 DBUContext *ctx = dbuContextCreate(); |
98 DBUContext *ctx = dbuContextCreate(); |
| |
99 |
| |
100 DBUClass *address = dbuRegisterClass(ctx, "address", Address, address_id); |
| |
101 dbuClassAdd(address, Address, street); |
| |
102 dbuClassAdd(address, Address, zip); |
| |
103 dbuClassAdd(address, Address, city); |
| 70 |
104 |
| 71 DBUClass *person = dbuRegisterClass(ctx, "person", Person, person_id); |
105 DBUClass *person = dbuRegisterClass(ctx, "person", Person, person_id); |
| 72 dbuClassAdd(person, Person, name); |
106 dbuClassAdd(person, Person, name); |
| 73 dbuClassAdd(person, Person, email); |
107 dbuClassAdd(person, Person, email); |
| 74 dbuClassAdd(person, Person, age); |
108 dbuClassAdd(person, Person, age); |
| 75 dbuClassAdd(person, Person, iscustomer); |
109 dbuClassAdd(person, Person, iscustomer); |
| 76 dbuClassAdd(person, Person, hash); |
110 dbuClassAdd(person, Person, hash); |
| 77 |
111 dbuClassAddObj(person, "address_id", offsetof(Person, address), address); |
| 78 |
112 |
| 79 |
113 |
| 80 // Open or create the database |
114 // Open or create the database |
| 81 sqlite3 *db; |
115 sqlite3 *db; |
| 82 int rc = sqlite3_open("test.db", &db); |
116 int rc = sqlite3_open("test.db", &db); |
| 90 return 1; |
124 return 1; |
| 91 } |
125 } |
| 92 |
126 |
| 93 DBUConnection *conn = dbuSQLiteConnectionFromDB(db, true); |
127 DBUConnection *conn = dbuSQLiteConnectionFromDB(db, true); |
| 94 DBUQuery *query = conn->createQuery(conn, NULL); |
128 DBUQuery *query = conn->createQuery(conn, NULL); |
| 95 dbuQuerySetSQL(query, "select * from Person;"); |
129 dbuQuerySetSQL(query, "select p.*, a.address_id as [__address__address_id], a.street, a.zip, a.city from Person p inner join Address a on p.address_id = a.address_id;"); |
| 96 |
130 |
| 97 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, cxDefaultAllocator); |
131 DBUObjectBuilder *builder = dbuObjectBuilder(person, query, cxDefaultAllocator); |
| 98 CxList *persons = dbuObjectBuilderGetList(builder); |
132 CxList *persons = dbuObjectBuilderGetList(builder); |
| 99 if(persons) { |
133 if(persons) { |
| 100 CxIterator i = cxListIterator(persons); |
134 CxIterator i = cxListIterator(persons); |
| 119 sqlite3_free(err_msg); |
153 sqlite3_free(err_msg); |
| 120 sqlite3_close(db); |
154 sqlite3_close(db); |
| 121 return 1; |
155 return 1; |
| 122 } |
156 } |
| 123 |
157 |
| |
158 rc = sqlite3_exec(db, sql_create_table_address, 0, 0, &err_msg); |
| |
159 if(rc != SQLITE_OK) { |
| |
160 fprintf(stderr, "SQLite error: %s\n", err_msg); |
| |
161 sqlite3_free(err_msg); |
| |
162 sqlite3_close(db); |
| |
163 return 1; |
| |
164 } |
| |
165 |
| 124 |
166 |
| 125 sqlite3_stmt *stmt; |
167 sqlite3_stmt *stmt; |
| 126 rc = sqlite3_prepare_v2(db, sql_check_table, -1, &stmt, 0); |
168 rc = sqlite3_prepare_v2(db, sql_check_table, -1, &stmt, 0); |
| 127 if(rc != SQLITE_OK) { |
169 if(rc != SQLITE_OK) { |
| 128 fprintf(stderr, "SQLite error: %s\n", sqlite3_errmsg(db)); |
170 fprintf(stderr, "SQLite error: %s\n", sqlite3_errmsg(db)); |
| 138 |
180 |
| 139 if(exists) { |
181 if(exists) { |
| 140 return 0; |
182 return 0; |
| 141 } |
183 } |
| 142 |
184 |
| 143 rc = sqlite3_exec(db, sql_create_test_data, 0, 0, &err_msg); |
185 rc = sqlite3_exec(db, sql_create_test_data1, 0, 0, &err_msg); |
| |
186 if(rc != SQLITE_OK) { |
| |
187 fprintf(stderr, "SQLite error: %s\n", err_msg); |
| |
188 sqlite3_free(err_msg); |
| |
189 sqlite3_close(db); |
| |
190 return 1; |
| |
191 } |
| |
192 |
| |
193 rc = sqlite3_exec(db, sql_create_test_data2, 0, 0, &err_msg); |
| 144 if(rc != SQLITE_OK) { |
194 if(rc != SQLITE_OK) { |
| 145 fprintf(stderr, "SQLite error: %s\n", err_msg); |
195 fprintf(stderr, "SQLite error: %s\n", err_msg); |
| 146 sqlite3_free(err_msg); |
196 sqlite3_free(err_msg); |
| 147 sqlite3_close(db); |
197 sqlite3_close(db); |
| 148 return 1; |
198 return 1; |