1 |
|
2 #include <event2/event.h> |
|
3 |
1 |
4 #include "evsql.h" |
2 #include "evsql.h" |
5 #include "lib/log.h" |
3 #include "lib/log.h" |
6 #include "lib/signals.h" |
4 #include "lib/signals.h" |
7 #include "lib/misc.h" |
5 #include "lib/misc.h" |
8 |
6 |
|
7 #include <event2/event.h> |
|
8 #include <assert.h> |
|
9 |
9 #define CONNINFO_DEFAULT "dbname=dbfs port=5433" |
10 #define CONNINFO_DEFAULT "dbname=dbfs port=5433" |
10 |
11 |
11 void db_results (struct evsql_result *result, void *arg) { |
12 void query_results (struct evsql_result *result, void *arg) { |
12 uint32_t val; |
13 uint32_t val; |
13 |
14 |
14 static struct evsql_result_info result_info = { |
15 static struct evsql_result_info result_info = { |
15 0, { |
16 0, { |
16 { EVSQL_FMT_BINARY, EVSQL_TYPE_UINT32 }, |
17 { EVSQL_FMT_BINARY, EVSQL_TYPE_UINT32 }, |
17 { 0, 0 } |
18 { 0, 0 } |
18 } |
19 } |
19 }; |
20 }; |
20 |
21 |
|
22 // begin |
|
23 assert(evsql_result_begin(&result_info, result) == 0); |
21 |
24 |
|
25 // one row |
|
26 assert(evsql_result_next(result, |
|
27 &val |
|
28 ) > 0); |
|
29 |
|
30 // print |
|
31 INFO("[evsql_test.results] got result: %p: val=%lu", result, (unsigned long) val); |
|
32 |
|
33 // done |
|
34 evsql_result_end(result); |
22 } |
35 } |
23 |
36 |
24 void do_query (struct evsql *db) { |
37 void query_send (struct evsql *db, struct evsql_trans *trans) { |
25 struct evsql_query *query = NULL; |
38 struct evsql_query *query = NULL; |
|
39 static int query_id = 0; |
26 |
40 |
27 static struct evsql_query_info query_info = { |
41 static struct evsql_query_info query_info = { |
28 .sql = "SELECT $1::int4 + 5", |
42 .sql = "SELECT $1::int4 + 5", |
29 |
43 |
30 .params = { |
44 .params = { |
32 { 0, 0 } |
46 { 0, 0 } |
33 } |
47 } |
34 }; |
48 }; |
35 |
49 |
36 // query |
50 // query |
37 assert((query = evsql_query_exec(db, NULL, &query_info, (uint32_t) 4, db_results, NULL)) != NULL); |
51 assert((query = evsql_query_exec(db, trans, &query_info, query_results, NULL, |
|
52 (uint32_t) ++query_id |
|
53 )) != NULL); |
|
54 |
|
55 INFO("[evsql_test.query_send] enqueued query, trans=%p: %p: %d", trans, query, query_id); |
38 } |
56 } |
39 |
57 |
40 int main (char argc, char **argv) { |
58 void trans_create_result (struct evsql_result *res, void *arg) { |
|
59 // check |
|
60 if (evsql_result_check(res)) |
|
61 FATAL("query failed: %s", evsql_result_error(res)); |
|
62 |
|
63 INFO("[evsql_test.create_result] table created succesfully: %p", res); |
|
64 |
|
65 // free |
|
66 evsql_result_free(res); |
|
67 } |
|
68 |
|
69 void trans_create_query (struct evsql *db, struct evsql_trans *trans) { |
|
70 struct evsql_query *query = NULL; |
|
71 |
|
72 // the query info |
|
73 static struct evsql_query_info query_info = { |
|
74 .sql = "CREATE TEMPORARY TABLE evsql_test ( id serial4, str varchar(32) DEFAULT $1::varchar ) ON COMMIT DROP", |
|
75 |
|
76 .params = { |
|
77 { EVSQL_FMT_BINARY, EVSQL_TYPE_STRING }, |
|
78 { 0, 0, } |
|
79 } |
|
80 }; |
|
81 |
|
82 // run the query |
|
83 assert((query = evsql_query_exec(db, trans, &query_info, trans_create_result, NULL, |
|
84 (const char *) "foobar" |
|
85 )) != NULL); |
|
86 |
|
87 INFO("[evsql_test.trans_create_query] enqueued query: %p", query); |
|
88 } |
|
89 |
|
90 void trans_error (struct evsql_trans *trans, void *arg) { |
|
91 struct evsql *db = arg; |
|
92 |
|
93 FATAL("[evsql_test.trans_error] failure: %s", evsql_trans_error(trans)); |
|
94 } |
|
95 |
|
96 void trans_ready (struct evsql_trans *trans, void *arg) { |
|
97 struct evsql *db = arg; |
|
98 |
|
99 INFO("[evsql_test.trans_ready] ready"); |
|
100 |
|
101 trans_create_query(db, trans); |
|
102 } |
|
103 |
|
104 void trans_done (struct evsql_trans *trans, void *arg) { |
|
105 struct evsql *db = arg; |
|
106 |
|
107 INFO("[evsql_test.trans_done] done"); |
|
108 } |
|
109 |
|
110 void begin_transaction (struct evsql *db) { |
|
111 struct evsql_trans *trans; |
|
112 |
|
113 assert((trans = evsql_trans(db, EVSQL_TRANS_DEFAULT, |
|
114 &trans_error, &trans_ready, &trans_done, |
|
115 db |
|
116 )) != NULL); |
|
117 |
|
118 INFO("[evsql_test.begin_trans] created transaction"); |
|
119 } |
|
120 |
|
121 int main (int argc, char **argv) { |
41 struct event_base *ev_base = NULL; |
122 struct event_base *ev_base = NULL; |
42 struct signals *signals = NULL; |
123 struct signals *signals = NULL; |
43 struct evsql *db = NULL; |
124 struct evsql *db = NULL; |
44 |
125 |
45 const char *db_conninfo; |
126 const char *db_conninfo; |
56 ERROR("signals_default"); |
137 ERROR("signals_default"); |
57 |
138 |
58 // setup evsql |
139 // setup evsql |
59 if ((db = evsql_new_pq(ev_base, db_conninfo, NULL, NULL)) == NULL) |
140 if ((db = evsql_new_pq(ev_base, db_conninfo, NULL, NULL)) == NULL) |
60 ERROR("evsql_new_pq"); |
141 ERROR("evsql_new_pq"); |
|
142 |
|
143 // send query |
|
144 query_send(db, NULL); |
|
145 |
|
146 // being transaction |
|
147 begin_transaction(db); |
|
148 |
|
149 // send query |
|
150 query_send(db, NULL); |
61 |
151 |
62 // run libevent |
152 // run libevent |
63 INFO("running libevent loop"); |
153 INFO("running libevent loop"); |
64 |
154 |
65 if (event_base_dispatch(ev_base)) |
155 if (event_base_dispatch(ev_base)) |