src/evpq.c
author Tero Marttila <terom@fixme.fi>
Sat, 13 Dec 2008 19:55:50 +0200
branchnew-evsql
changeset 53 0d6e07f4c9a1
parent 25 99a41f48e29b
permissions -rw-r--r--
separate evsql documentation
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <event2/event.h>
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <assert.h>
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <stdlib.h>
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
#include "evpq.h"
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
#include "lib/error.h"
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
struct evpq_conn {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    struct event_base *ev_base;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    struct evpq_callback_info user_cb;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    12
    void *user_cb_arg;
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    PGconn *pg_conn;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    struct event *ev;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    enum evpq_state state;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
};
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
/*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
 * This evpq_conn has experienced a GENERAL FAILURE.
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
 */
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
static void _evpq_failure (struct evpq_conn *conn) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    // update state
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
    conn->state = EVPQ_FAILURE;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    // notify
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    29
    conn->user_cb.fn_failure(conn, conn->user_cb_arg);
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
}
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
/*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
 * Initial connect was succesfull
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
 */
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
static void _evpq_connect_ok (struct evpq_conn *conn) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
    // update state
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    conn->state = EVPQ_CONNECTED;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
    // notify
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    40
    conn->user_cb.fn_connected(conn, conn->user_cb_arg);
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
}
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
/*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
 * Initial connect failed
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
 */
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
static void _evpq_connect_fail (struct evpq_conn *conn) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    // just mark it as a generic failure
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    _evpq_failure(conn);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
}
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
/*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
 * Receive a result and gives it to the user. If there was no more results, update state and tell the user.
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
 *
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
 * Returns zero if we got a result, 1 if there were/are no more results to handle.
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
 */
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
static int _evpq_query_result (struct evpq_conn *conn) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    PGresult *result;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    // get the result
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
    if ((result = PQgetResult(conn->pg_conn)) == NULL) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        // no more results, update state
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
        conn->state = EVPQ_CONNECTED;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
        // tell the user the query is done
22
85ba190a9e68 fix evpq/evpq_test compilation
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    65
        conn->user_cb.fn_done(conn, conn->user_cb_arg);
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
        // stop waiting for more results
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        return 1;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    } else {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
        // got a result, give it to the user
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    72
        conn->user_cb.fn_result(conn, result, conn->user_cb_arg);
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        // great
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
        return 0;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    }
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
}
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
/*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
 * Schedule a new _evpq_event for this connection.
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
 */ 
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
static int _evpq_schedule (struct evpq_conn *conn, short what, void (*handler)(evutil_socket_t, short, void *)) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
    assert(conn->pg_conn != NULL);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    // ensure we have a valid socket, this should be the case after the PQstatus check...
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    if (PQsocket(conn->pg_conn) < 0)
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
        FATAL("PQsocket gave invalid socket");
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    // reschedule with a new event
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
    if (conn->ev) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        event_assign(conn->ev, conn->ev_base, PQsocket(conn->pg_conn), what, handler, conn);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
    } else {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
        if ((conn->ev = event_new(conn->ev_base, PQsocket(conn->pg_conn), what, handler, conn)) == NULL)
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
            PERROR("event_new");
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
    }
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
    // add it
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    // XXX: timeouts?
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
    if (event_add(conn->ev, NULL))
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
        PERROR("event_add");
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
    // success
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    return 0;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
error:
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
    return -1;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
}
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
/*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
 * Handle events on the PQ socket while connecting
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
 */
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
static void _evpq_connect_event (evutil_socket_t fd, short what, void *arg) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    struct evpq_conn *conn = arg;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
    PostgresPollingStatusType poll_status;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    // this is only for connect events
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    assert(conn->state == EVPQ_CONNECT);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
    // XXX: timeouts?
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
    // ask PQ what to do 
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
    switch ((poll_status = PQconnectPoll(conn->pg_conn))) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
        case PGRES_POLLING_READING:
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
            // poll for read
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
            what = EV_READ;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
            
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
            // reschedule
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
            break;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
        case PGRES_POLLING_WRITING:
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
            // poll for write
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
            what = EV_WRITE;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
            
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
            // reschedule
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
            break;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
        case PGRES_POLLING_OK:
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
            // connected
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
            _evpq_connect_ok(conn);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
            
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
            // done
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
            return;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
        
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
        case PGRES_POLLING_FAILED:
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
            // faaaaail!
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
            _evpq_connect_fail(conn);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
            // done
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
            return;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
        
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
        default:
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
            FATAL("PQconnectPoll gave a weird value: %d", poll_status);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    }
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
    // reschedule
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
    if (_evpq_schedule(conn, what, _evpq_connect_event))
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
        goto error;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
    // done, wait for the next event
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
    return;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
error:
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
    // XXX: reset?
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
    _evpq_failure(conn);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
}
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
static void _evpq_query_event (evutil_socket_t fd, short what, void *arg) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
    struct evpq_conn *conn = arg;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
    // this is only for query events
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
    assert(conn->state == EVPQ_QUERY);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
    // XXX: PQflush, timeouts
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
    assert(what == EV_READ);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
    // we're going to assume that all queries will *require* data for their results
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    // this would break otherwise (PQconsumeInput might block?)
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
    assert(PQisBusy(conn->pg_conn) != 0);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
    // handle input
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
    if (PQconsumeInput(conn->pg_conn) == 0)
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
        ERROR("PQconsumeInput: %s", PQerrorMessage(conn->pg_conn));
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
    // handle results
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
    while (PQisBusy(conn->pg_conn) == 0) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
        // handle the result
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
        if (_evpq_query_result(conn) == 1) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
            // no need to wait for anything anymore
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
            return;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
        }
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
        // loop to handle the next result
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
    }
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
    // still need to wait for a result, so reschedule
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
    if (_evpq_schedule(conn, EV_READ, _evpq_query_event))
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
        goto error;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
        
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
    // done, wait for the next event
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
    return;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
error:
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
    // XXX: reset?
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
    _evpq_failure(conn);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
}
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   210
struct evpq_conn *evpq_connect (struct event_base *ev_base, const char *conninfo, const struct evpq_callback_info cb_info, void *cb_arg) {
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
    struct evpq_conn *conn = NULL;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
    // alloc our context
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
    if ((conn = calloc(1, sizeof(*conn))) == NULL)
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
        ERROR("calloc");
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
    // initial state
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
    conn->ev_base = ev_base;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
    conn->user_cb = cb_info;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   220
    conn->user_cb_arg = cb_arg;
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
    conn->state = EVPQ_INIT;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
    // create our PGconn
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
    if ((conn->pg_conn = PQconnectStart(conninfo)) == NULL)
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
        PERROR("PQconnectStart");
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
    // check for immediate failure
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
    if (PQstatus(conn->pg_conn) == CONNECTION_BAD)
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
        ERROR("PQstatus indicates CONNECTION_BAD after PQconnectStart");
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
    // assume PGRES_POLLING_WRITING
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
    if (_evpq_schedule(conn, EV_WRITE, _evpq_connect_event))
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
        goto error;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
    // connecting
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
    conn->state = EVPQ_CONNECT;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
    // success, wait for the connection to be established
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
    return conn;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
error:
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   242
    if (conn) 
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   243
        evpq_release(conn);
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
    return NULL;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
}
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   248
static int _evpq_check_query (struct evpq_conn *conn) {
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   249
    // just check the state
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
    if (conn->state != EVPQ_CONNECTED)
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
        ERROR("invalid evpq state: %d", conn->state);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
    
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   253
    // ok
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   254
    return 0;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   255
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   256
error:
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   257
    return -1;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   258
}
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   259
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   260
static int _evpq_handle_query (struct evpq_conn *conn) {
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
    // update state
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
    conn->state = EVPQ_QUERY;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
    
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   264
    // XXX: PQflush
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   265
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
    // poll for read
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
    if (_evpq_schedule(conn, EV_READ, _evpq_query_event))
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
        goto error;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
    // and then we wait
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
    return 0;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
error:
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
    return -1;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
}
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   277
int evpq_query (struct evpq_conn *conn, const char *command) {
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   278
    // check state
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   279
    if (_evpq_check_query(conn))
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   280
        goto error;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   281
    
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   282
    // do the query
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   283
    if (PQsendQuery(conn->pg_conn, command) == 0)
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   284
        ERROR("PQsendQuery: %s", PQerrorMessage(conn->pg_conn));
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   285
    
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   286
    // handle it
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   287
    if (_evpq_handle_query(conn))
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   288
        goto error;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   289
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   290
    // success
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   291
    return 0;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   292
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   293
error:
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   294
    return -1;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   295
}
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   296
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   297
int evpq_query_params (struct evpq_conn *conn, const char *command, int nParams, const Oid *paramTypes, const char * const *paramValues, const int *paramLengths, const int *paramFormats, int resultFormat) {
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   298
    // check state
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   299
    if (_evpq_check_query(conn))
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   300
        goto error;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   301
    
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   302
    // do the query
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   303
    if (PQsendQueryParams(conn->pg_conn, command, nParams, paramTypes, paramValues, paramLengths, paramFormats, resultFormat) == 0)
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   304
        ERROR("PQsendQueryParams: %s", PQerrorMessage(conn->pg_conn));
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   305
    
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   306
    // handle it
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   307
    if (_evpq_handle_query(conn))
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   308
        goto error;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   309
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   310
    // success
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   311
    return 0;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   312
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   313
error:
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   314
    return -1;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   315
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   316
}
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 22
diff changeset
   317
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   318
void evpq_release (struct evpq_conn *conn) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   319
    if (conn->ev)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   320
        event_free(conn->ev);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   321
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   322
    if (conn->pg_conn)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   323
        PQfinish(conn->pg_conn);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   324
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   325
    free(conn);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   326
}
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   327
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   328
enum evpq_state evpq_state (struct evpq_conn *conn) {
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   329
    return conn->state;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   330
}
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
   331
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   332
const PGconn *evpq_pgconn (struct evpq_conn *conn) {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   333
    return conn->pg_conn;
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   334
}