src/evsql.h
author Tero Marttila <terom@fixme.fi>
Fri, 17 Oct 2008 02:04:03 +0300
changeset 31 7804cd7b5cd5
parent 30 d8fabd347a8e
child 34 460f995d3769
permissions -rw-r--r--
write+setattr
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
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
     9
#include <stdint.h>
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
#include <postgresql/libpq-fe.h>
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
#include <event2/event.h>
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
/*
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
 * The generic context handle
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
struct evsql;
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
/*
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
 * A query handle
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
struct evsql_query;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
/*
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    24
 * Transaction handle
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    25
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    26
struct evsql_trans;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    27
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    28
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    29
 * Transaction type
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    30
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    31
enum evsql_trans_type {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    32
    EVSQL_TRANS_DEFAULT,
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    33
    EVSQL_TRANS_SERIALIZABLE,
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    34
    EVSQL_TRANS_REPEATABLE_READ,
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    35
    EVSQL_TRANS_READ_COMMITTED,
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    36
    EVSQL_TRANS_READ_UNCOMMITTED,
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    37
};
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    38
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    39
/*
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    40
 * Parameter type
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    41
 */
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    42
enum evsql_param_format {
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    43
    EVSQL_FMT_TEXT,
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    44
    EVSQL_FMT_BINARY,
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    45
};
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    46
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    47
enum evsql_param_type {
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    48
    EVSQL_PARAM_INVALID,
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    49
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    50
    EVSQL_PARAM_NULL_,
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    51
    
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
    52
    EVSQL_PARAM_BINARY,
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    53
    EVSQL_PARAM_STRING,
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    54
    EVSQL_PARAM_UINT16,
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    55
    EVSQL_PARAM_UINT32,
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    56
    EVSQL_PARAM_UINT64,
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    57
};
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    58
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    59
/*
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    60
 * Query parameter info.
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    61
 *
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    62
 * 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
    63
 */
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
struct evsql_query_params {
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    65
    // nonzero to get results in binary format
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    66
    enum evsql_param_format result_fmt;
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    67
    
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    68
    // the list of parameters, terminated by { 0, 0 }
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    69
    struct evsql_query_param {
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    70
        // the param type
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    71
        enum evsql_param_type type;
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    72
        
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    73
        // pointer to the raw data
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    74
        const char *data_raw;
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    75
        
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    76
        // the value
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    77
        union {
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    78
            uint16_t uint16;
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    79
            uint32_t uint32;
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    80
            uint64_t uint64;
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    81
        } data;
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    82
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    83
        // the explicit length of the parameter if it's binary, zero for text.
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    84
        // set to -1 to indicate that the value is still missing
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    85
        ssize_t length;
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    86
    } list[];
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    87
};
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
// macros for defining evsql_query_params
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    90
#define EVSQL_PARAMS(result_fmt)            { result_fmt, 
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    91
#define EVSQL_PARAM(typenam)                    { EVSQL_PARAM_ ## typenam, NULL }
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    92
#define EVSQL_PARAMS_END                        { EVSQL_PARAM_INVALID, NULL } \
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    93
                                              } // <<<
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
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
 * Result type
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
struct evsql_result_info {
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
    struct evsql *evsql;
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   100
    struct evsql_trans *trans;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
    
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    int error;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   104
    union evsql_result {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   105
        // libpq
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   106
        PGresult *pq;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   107
    } result;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
};
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
/*
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   111
 * Callback for handling query results.
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
 *
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   113
 * The query has completed, either succesfully or unsuccesfully (nonzero .error).
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   114
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   115
 * Use the evsql_result_* functions to manipulate the results.
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
 */
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   117
typedef void (*evsql_query_cb)(const struct evsql_result_info *res, void *arg);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
/*
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   120
 * Callback for handling global-level errors.
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
 *
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   122
 * The evsql is not useable anymore.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   123
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   124
 * XXX: this is not actually called yet, no retry logic implemented.
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
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
   127
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
/*
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   129
 * Callback for handling transaction-level errors.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   130
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   131
 * The transaction is not useable anymore.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   132
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   133
typedef void (*evsql_trans_error_cb)(struct evsql_trans *trans, void *arg);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   134
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   135
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   136
 * The transaction is ready for use.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   137
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   138
typedef void (*evsql_trans_ready_cb)(struct evsql_trans *trans, void *arg);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   139
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   140
/*
26
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   141
 * The transaction was commited, and should not be used anymore.
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   142
 */
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   143
typedef void (*evsql_trans_done_cb)(struct evsql_trans *trans, void *arg);
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   144
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   145
/*
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
 * Create a new PostgreSQL/libpq(evpq) -based evsql using the given conninfo.
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   147
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   148
 * The given conninfo must stay valid for the duration of the evsql's lifetime.
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
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
   151
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
/*
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   153
 * Create a new transaction.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   154
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   155
 * Transactions are separate connections that provide transaction-isolation.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   156
 *
26
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   157
 * Once the transaction is ready for use, ready_fn will be called. If the transaction fails, any pending query will be
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   158
 * forgotten, and error_fn called. This also includes some (but not all) cases where evsql_query returns nonzero.
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   159
 *
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
 */
26
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   161
struct evsql_trans *evsql_trans (struct evsql *evsql, enum evsql_trans_type type, evsql_trans_error_cb error_fn, evsql_trans_ready_cb ready_fn, evsql_trans_done_cb done_fn, void *cb_arg);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
/*
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   164
 * Queue the given query for execution.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   165
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   166
 * If trans is specified (not NULL), then the transaction must be idle, and the query will be executed in that
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   167
 * transaction's context. Otherwise, the query will be executed without a transaction, andmay be executed immediately,
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   168
 * or if other similar queries are running, it will be queued for later execution.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   169
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   170
 * Once the query is complete (got a result, got an error, the connection failed), then the query_cb will be triggered.
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   171
 */
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   172
struct evsql_query *evsql_query (struct evsql *evsql, struct evsql_trans *trans, const char *command, evsql_query_cb query_fn, void *cb_arg);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   173
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   174
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   175
 * Same as evsql_query, but uses the SQL-level support for binding parameters.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   176
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   177
struct evsql_query *evsql_query_params (struct evsql *evsql, struct evsql_trans *trans, const char *command, const struct evsql_query_params *params, evsql_query_cb query_fn, void *cb_arg);
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   178
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   179
/*
27
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   180
 * Abort a query, the query callback will not be called, the query and any possible results will be discarded.
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   181
 *
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   182
 * This does not garuntee that the query will not execute, simply that you won't get the results.
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   183
 *
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   184
 * If the query is part of a transaction, then trans must be given, and the query must be the query that is currently
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   185
 * executing on that trans. The transaction's ready_fn will be called once the query has been aborted.
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   186
 */
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   187
void evsql_query_abort (struct evsql_trans *trans, struct evsql_query *query);
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   188
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   189
/*
26
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   190
 * Commit a transaction, calling done_fn if it was succesfull (error_fn otherwise).
27
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   191
 *
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   192
 * trans must be idle, just like for evsql_query.
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   193
 *
28
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   194
 * done_fn will never be called directly, always via the event loop.
e944453ca924 split off dbfs components into a separate dir, improve dirop docs, error handling, etc
Tero Marttila <terom@fixme.fi>
parents: 27
diff changeset
   195
 *
27
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   196
 * You cannot abort a COMMIT, calling trans_abort on trans after a succesful trans_commit is a FATAL error.
26
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   197
 */
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   198
int evsql_trans_commit (struct evsql_trans *trans);
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   199
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   200
/*
27
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   201
 * Abort a transaction, rolling it back. No callbacks will be called.
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   202
 *
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   203
 * You cannot abort a COMMIT, calling trans_abort on trans after a succesful trans_commit is a FATAL error.
26
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   204
 */
27
461be4cd34a3 working open/read/close -dir
Tero Marttila <terom@fixme.fi>
parents: 26
diff changeset
   205
void evsql_trans_abort (struct evsql_trans *trans);
26
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   206
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   207
/*
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   208
 * Transaction-handling functions
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   209
 */
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   210
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   211
// error string, meant to be called from evsql_trans_error_cb
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   212
const char *evsql_trans_error (struct evsql_trans *trans);
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   213
61668c57f4bb preliminary *dir implementation
Tero Marttila <terom@fixme.fi>
parents: 25
diff changeset
   214
/*
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   215
 * Param-building functions
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   216
 */
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   217
int evsql_param_binary (struct evsql_query_params *params, size_t param, const char *ptr, size_t len);
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   218
int evsql_param_string (struct evsql_query_params *params, size_t param, const char *ptr);
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   219
int evsql_param_uint16 (struct evsql_query_params *params, size_t param, uint16_t uval);
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   220
int evsql_param_uint32 (struct evsql_query_params *params, size_t param, uint32_t uval);
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   221
int evsql_params_clear (struct evsql_query_params *params);
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   222
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   223
/*
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   224
 * Query-handling functions
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   225
 */
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   226
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   227
// print out a textual repr of the given query/params via DEBUG
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   228
void evsql_query_debug (const char *sql, const struct evsql_query_params *params);
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   229
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   230
/*
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   231
 * Result-handling functions
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   232
 */
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   233
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   234
// get error message associated with function
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   235
const char *evsql_result_error (const struct evsql_result_info *res);
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   236
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   237
// number of rows in the result
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   238
size_t evsql_result_rows (const struct evsql_result_info *res);
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   239
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   240
// number of columns in the result
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   241
size_t evsql_result_cols (const struct evsql_result_info *res);
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   242
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   243
// fetch the raw binary value from a result set, and return it via ptr
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   244
// if size is nonzero, check that the size of the field data matches
31
7804cd7b5cd5 write+setattr
Tero Marttila <terom@fixme.fi>
parents: 30
diff changeset
   245
int evsql_result_binary (const struct evsql_result_info *res, size_t row, size_t col, const char **ptr, size_t *size, int nullok);
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   246
int evsql_result_string (const struct evsql_result_info *res, size_t row, size_t col, const char **ptr, int nullok);
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   247
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   248
// fetch certain kinds of values from a binary result set
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   249
int evsql_result_uint16 (const struct evsql_result_info *res, size_t row, size_t col, uint16_t *uval, int nullok);
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   250
int evsql_result_uint32 (const struct evsql_result_info *res, size_t row, size_t col, uint32_t *uval, int nullok);
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   251
int evsql_result_uint64 (const struct evsql_result_info *res, size_t row, size_t col, uint64_t *uval, int nullok);
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   252
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   253
// release the result set, freeing its memory
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   254
void evsql_result_free (const struct evsql_result_info *res);
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   255
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   256
// platform-dependant aliases
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   257
#define evsql_result_ushort evsql_result_uint16
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   258
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   259
#if _LP64
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   260
#define evsql_result_ulong evsql_result_uint64
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   261
#else
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   262
#define evsql_result_ulong evsql_result_uint32
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   263
#endif /* _LP64 */
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   264
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   265
/*
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   266
 * 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
   267
 *
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
 * XXX: not implemented yet.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
 */
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
void evsql_close (struct evsql *evsql);
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
#endif /* EVSQL_H */