src/evsql.h
author Tero Marttila <terom@fixme.fi>
Sun, 12 Oct 2008 01:09:00 +0300
changeset 23 1dee73ae4ad0
parent 21 e5da1d428e3e
child 24 82cfdb6680d1
permissions -rw-r--r--
evsql_query_params compiles...
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#ifndef EVSQL_H
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#define EVSQL_H
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
/*
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
 * An event-based (Postgre)SQL client API using libevent
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
// XXX: libpq
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
#include <postgresql/libpq-fe.h>
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
#include <event2/event.h>
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
/*
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
 * The generic context handle
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
struct evsql;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
/*
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
 * A query handle
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
struct evsql_query;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
/*
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    23
 * Query parameter info.
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    24
 *
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    25
 * Use the EVSQL_PARAM_* macros to define the value of list
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    26
 */
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
struct evsql_query_params {
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    28
    // nonzero to get results in binary format
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    29
    int result_binary;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    30
    
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    31
    // the list of parameters, terminated by { 0, 0 }
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    32
    struct evsql_query_param {
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    33
        // the textual or binary value for this parameter
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    34
        char *value;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    35
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    36
        // the explicit length of the parameter if it's binary. Must be non-zero for NULL values.
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    37
        int length;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    38
    } list[];
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    39
};
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    40
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    41
// macros for defining evsql_query_params
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    42
#define EVSQL_PARAM_NULL                    { NULL, 1 }
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    43
#define EVSQL_PARAM_TEXT(value)             { value, 0 }
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    44
#define EVSQL_PARAM_BINARY(value, length)   { value, length }
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
/*
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
 * Result type
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
struct evsql_result_info {
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    struct evsql *evsql;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    int error;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    union {
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        // XXX: libpq
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
        PGresult *pq;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    } result;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
};
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
/*
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
 * Callback for handling query-level errors.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
 *
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
 * The query has completed, either succesfully or unsuccesfully (look at info.error).
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
 * info.result contains the result à la the evsql's type.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
typedef void (*evsql_query_cb)(struct evsql_result_info info, void *arg);
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
/*
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
 * Callback for handling connection-level errors.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
 *
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
 * The SQL context/connection suffered an error. It is not valid anymore, and may not be used.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
typedef void (*evsql_error_cb)(struct evsql *evsql, void *arg);
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
/*
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
 * Create a new PostgreSQL/libpq(evpq) -based evsql using the given conninfo.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
struct evsql *evsql_new_pq (struct event_base *ev_base, const char *pq_conninfo, evsql_error_cb error_fn, void *cb_arg);
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
/*
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
 * Queue the given query for execution.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
struct evsql_query *evsql_query (struct evsql *evsql, const char *command, evsql_query_cb query_fn, void *cb_arg);
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
/*
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    87
 * Same, but uses the SQL-level support for binding parameters.
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
struct evsql_query *evsql_query_params (struct evsql *evsql, const char *command, struct evsql_query_params params, evsql_query_cb query_fn, void *cb_arg);
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    90
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    91
/*
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
 * Close a connection. Callbacks for waiting queries will not be run.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
 *
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
 * XXX: not implemented yet.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
void evsql_close (struct evsql *evsql);
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
#endif /* EVSQL_H */