src/evpq.h
author Tero Marttila <terom@fixme.fi>
Wed, 01 May 2013 00:11:39 +0300
changeset 66 fdd7f995af6c
parent 25 99a41f48e29b
permissions -rw-r--r--
MIT license
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#ifndef EVPQ_H
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#define EVPQ_H
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
/*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
 * Convenience functions for using libpq (the PostgreSQL client library) with libevent.
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
 */
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
#include <event2/event.h>
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
#include <postgresql/libpq-fe.h>
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
/*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
 * Our PGconn context wrapper.
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
struct evpq_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
/*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
 * Callback functions used
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
 */
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
struct evpq_callback_info {
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
     * This evpq_conn has connected succesfully \o/
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
     */
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
    void (*fn_connected)(struct evpq_conn *conn, void *arg);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
    /*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
     * Got a result.
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
    void (*fn_result)(struct evpq_conn *conn, PGresult *result, void *arg);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
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
     * No more results for the query
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
    void (*fn_done)(struct evpq_conn *conn, void *arg);
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
    /*
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    36
     * The evpq_conn has suffered a complete failure.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    37
     *
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    38
     * Most likely, this means that the connection to the server was lost, or not established at all.
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
     *
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
     * XXX: add a `what` arg?
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
    void (*fn_failure)(struct evpq_conn *conn, void *arg);
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
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
 * evpq_conn states
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
 */
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
enum evpq_state {
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    EVPQ_INIT,
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
    EVPQ_CONNECT,
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    EVPQ_CONNECTED,
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
    EVPQ_QUERY,
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
    EVPQ_FAILURE,
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
};
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
/*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
 * Create a new evpq connection.
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
 *
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
 * This corresponds directly to PQconnectStart, and handles all the libevent setup/polling needed.
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
 * The connection will initially be in the EVPQ_CONNECT state, and will then either callback via fn_connected
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
 * (EVPQ_CONNECTED) or fn_failure (EVPQ_FAILURE).
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
 * cb_info contains the callback functions (and the user argument) to use.
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
 */
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    69
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
    70
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
/*
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
 * Execute a query.
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
 * This corresponds directly to PQsendQuery. This evpq must be in the EVPQ_CONNECTED state, so you must wait after
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
 * calling evpq_connect, and you may not run two queries at the same time.
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
 * The query will result in a series of fn_result (EVPQ_RESULT) calls (if multiple queries in the query string),
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
 * followed by a fn_done (EVPQ_CONNECTED).
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
int evpq_query (struct evpq_conn *conn, const char *command);
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
/*
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    83
 * Execute a query with params.
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    84
 *
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    85
 * See evpq_query and PQsendQueryParams/PQexecParams
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    86
 */
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    87
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: 21
diff changeset
    88
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    89
/*
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    90
 * Connection state à la evpq.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    91
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    92
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
    93
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents: 12
diff changeset
    94
/*
12
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
 * Get the actual PGconn.
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
 * This can safely be used to access all of the normal PQ functions.
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
const PGconn *evpq_pgconn (struct evpq_conn *conn);
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
// convenience wrappers
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
#define evpq_error_message(conn) PQerrorMessage(evpq_pgconn(conn))
7f159ee3a3ff working basic evpq lib and test
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   104
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   105
 * Release the evpq_conn, closing all connections and freeing all resources.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   106
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   107
 * You must call this yourself in all cases after evpq_connect returns an evpq_conn.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   108
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   109
void evpq_release (struct evpq_conn *conn);
12
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
#endif /* EVPQ_H */