author | Tero Marttila <terom@fixme.fi> |
Wed, 01 May 2013 00:11:39 +0300 | |
changeset 66 | fdd7f995af6c |
parent 25 | 99a41f48e29b |
permissions | -rw-r--r-- |
12 | 1 |
#ifndef EVPQ_H |
2 |
#define EVPQ_H |
|
3 |
||
4 |
/* |
|
5 |
* Convenience functions for using libpq (the PostgreSQL client library) with libevent. |
|
6 |
*/ |
|
7 |
||
8 |
#include <event2/event.h> |
|
9 |
#include <postgresql/libpq-fe.h> |
|
10 |
||
11 |
/* |
|
12 |
* Our PGconn context wrapper. |
|
13 |
*/ |
|
14 |
struct evpq_conn; |
|
15 |
||
16 |
/* |
|
17 |
* Callback functions used |
|
18 |
*/ |
|
19 |
struct evpq_callback_info { |
|
20 |
/* |
|
21 |
* This evpq_conn has connected succesfully \o/ |
|
22 |
*/ |
|
23 |
void (*fn_connected)(struct evpq_conn *conn, void *arg); |
|
24 |
||
25 |
/* |
|
26 |
* Got a result. |
|
27 |
*/ |
|
28 |
void (*fn_result)(struct evpq_conn *conn, PGresult *result, void *arg); |
|
29 |
||
30 |
/* |
|
31 |
* No more results for the query |
|
32 |
*/ |
|
33 |
void (*fn_done)(struct evpq_conn *conn, void *arg); |
|
34 |
||
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 | 39 |
* |
40 |
* XXX: add a `what` arg? |
|
41 |
*/ |
|
42 |
void (*fn_failure)(struct evpq_conn *conn, void *arg); |
|
43 |
}; |
|
44 |
||
45 |
/* |
|
46 |
* evpq_conn states |
|
47 |
*/ |
|
48 |
enum evpq_state { |
|
49 |
EVPQ_INIT, |
|
50 |
||
51 |
EVPQ_CONNECT, |
|
52 |
EVPQ_CONNECTED, |
|
53 |
||
54 |
EVPQ_QUERY, |
|
55 |
||
56 |
EVPQ_FAILURE, |
|
57 |
}; |
|
58 |
||
59 |
/* |
|
60 |
* Create a new evpq connection. |
|
61 |
* |
|
62 |
* This corresponds directly to PQconnectStart, and handles all the libevent setup/polling needed. |
|
63 |
* |
|
64 |
* The connection will initially be in the EVPQ_CONNECT state, and will then either callback via fn_connected |
|
65 |
* (EVPQ_CONNECTED) or fn_failure (EVPQ_FAILURE). |
|
66 |
* |
|
67 |
* cb_info contains the callback functions (and the user argument) to use. |
|
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 | 70 |
|
71 |
/* |
|
72 |
* Execute a query. |
|
73 |
* |
|
74 |
* This corresponds directly to PQsendQuery. This evpq must be in the EVPQ_CONNECTED state, so you must wait after |
|
75 |
* calling evpq_connect, and you may not run two queries at the same time. |
|
76 |
* |
|
77 |
* The query will result in a series of fn_result (EVPQ_RESULT) calls (if multiple queries in the query string), |
|
78 |
* followed by a fn_done (EVPQ_CONNECTED). |
|
79 |
*/ |
|
80 |
int evpq_query (struct evpq_conn *conn, const char *command); |
|
81 |
||
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 | 95 |
* Get the actual PGconn. |
96 |
* |
|
97 |
* This can safely be used to access all of the normal PQ functions. |
|
98 |
*/ |
|
99 |
const PGconn *evpq_pgconn (struct evpq_conn *conn); |
|
100 |
||
101 |
// convenience wrappers |
|
102 |
#define evpq_error_message(conn) PQerrorMessage(evpq_pgconn(conn)) |
|
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 | 110 |
|
111 |
#endif /* EVPQ_H */ |