src/evsql_test.c
branchnew-evsql
changeset 45 424ce5ab82fd
parent 44 9e76ee9729b6
child 46 75cecfc4603b
equal deleted inserted replaced
44:9e76ee9729b6 45:424ce5ab82fd
     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))