test/main.c

changeset 5
f0c66b2139ea
parent 4
1908c8b1599f
child 7
c98ff52cd806
equal deleted inserted replaced
4:1908c8b1599f 5:f0c66b2139ea
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;

mercurial