src/evsql.c
author Tero Marttila <terom@fixme.fi>
Sun, 12 Oct 2008 20:10:47 +0300
changeset 25 99a41f48e29b
parent 24 82cfdb6680d1
child 26 61668c57f4bb
permissions -rw-r--r--
evsql transactions, it compiles...
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#define _GNU_SOURCE
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <stdlib.h>
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <assert.h>
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <string.h>
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
#include "evsql.h"
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
     7
#include "evsql_internal.h"
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
#include "evpq.h"
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
#include "lib/log.h"
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
#include "lib/error.h"
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
#include "lib/misc.h"
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    13
21
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
 * Actually execute the given query.
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
 * The backend should be able to accept the query at this time.
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
 *
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    19
 * You should assume that if trying to execute a query fails, then the connection should also be considred as failed.
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
 */
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    21
static int _evsql_query_exec (struct evsql_conn *conn, struct evsql_query *query, const char *command) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    22
    int err;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    23
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    24
    switch (conn->evsql->type) {
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        case EVSQL_EVPQ:
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    26
            // got params?
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    27
            if (query->params.count) {
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    28
                err = evpq_query_params(conn->engine.evpq, command,
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    29
                    query->params.count, 
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    30
                    query->params.types, 
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    31
                    query->params.values, 
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    32
                    query->params.lengths, 
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    33
                    query->params.formats, 
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    34
                    query->params.result_format
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
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    37
            } else {
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    38
                // plain 'ole query
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    39
                err = evpq_query(conn->engine.evpq, command);
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    40
            }
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    41
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    42
            if (err) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    43
                if (PQstatus(evpq_pgconn(conn->engine.evpq)) != CONNECTION_OK)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    44
                    WARNING("conn failed");
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    45
                else
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    46
                    WARNING("query failed, dropping conn as well");
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    47
            }
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    48
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    49
            break;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
        
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
        default:
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
            FATAL("evsql->type");
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    }
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    54
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    55
    if (!err)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    56
        // assign the query
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    57
        conn->query = query;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    58
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    59
    return err;
21
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
/*
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    63
 * Free the query and related resources, doesn't trigger any callbacks or remove from any queues.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    64
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    65
 * The command should already be taken care of (NULL).
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    66
 */
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    67
static void _evsql_query_free (struct evsql_query *query) {
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    68
    assert(query->command == NULL);
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    69
    
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    70
    // free params if present
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    71
    free(query->params.types);
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    72
    free(query->params.values);
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    73
    free(query->params.lengths);
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    74
    free(query->params.formats);
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    75
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    76
    // free the query itself
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    77
    free(query);
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    78
}
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    79
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    80
/*
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    81
 * Execute the callback if res is given, and free the query.
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
 */
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    83
static void _evsql_query_done (struct evsql_query *query, const struct evsql_result_info *res) {
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    84
    if (res) 
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        // call the callback
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    86
        query->cb_fn(res, query->cb_arg);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
    
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
    // free
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
    89
    _evsql_query_free(query);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
}
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
/*
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    93
 * XXX:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    94
 * /
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
    95
static void _evsql_destroy (struct evsql *evsql, const struct evsql_result_info *res) {
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
    struct evsql_query *query;
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
    // clear the queue
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
    99
    while ((query = TAILQ_FIRST(&evsql->query_queue)) != NULL) {
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   100
        _evsql_query_done(query, res);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   102
        TAILQ_REMOVE(&evsql->query_queue, query, entry);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    }
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
    
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    // free
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
    free(evsql);
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
}
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   108
*/
21
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
 * Free the transaction, it should already be deassociated from the query and conn.
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
static void _evsql_trans_free (struct evsql_trans *trans) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   114
    // ensure we don't leak anything
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   115
    assert(trans->query == NULL);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   116
    assert(trans->conn == NULL);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   118
    // free
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   119
    free(trans);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   120
}
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   121
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   122
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   123
 * Release a connection. It should already be deassociated from the trans and query.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   124
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   125
 * Releases the engine, removes from the conn_list and frees this.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   126
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   127
static void _evsql_conn_release (struct evsql_conn *conn) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   128
    // ensure we don't leak anything
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   129
    assert(conn->trans == NULL);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   130
    assert(conn->query == NULL);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   131
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   132
    // release the engine
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   133
    switch (conn->evsql->type) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   134
        case EVSQL_EVPQ:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   135
            evpq_release(conn->engine.evpq);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   136
            break;
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
        default:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   139
            FATAL("evsql->type");
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   140
    }
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   141
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   142
    // remove from list
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   143
    LIST_REMOVE(conn, entry);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   144
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   145
    // free
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   146
    free(conn);
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
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   149
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   150
 * Fail a single query, this will trigger the callback and free it.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   151
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   152
static void _evsql_query_fail (struct evsql* evsql, struct evsql_query *query) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   153
    struct evsql_result_info res; ZINIT(res);
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
    // set up the result_info
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   156
    res.evsql = evsql;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   157
    res.error = 1;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   158
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   159
    // finish off the query
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   160
    _evsql_query_done(query, &res);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   161
}
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   162
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   163
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   164
 * Fail a transaction, this will silently drop any query, trigger the error callback, two-way-deassociate/release the
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   165
 * conn, and then free the trans.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   166
 */ 
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   167
static void _evsql_trans_fail (struct evsql_trans *trans) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   168
    if (trans->query) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   169
        // free the query silently
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   170
        _evsql_query_free(trans->query); trans->query = NULL;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   171
    }
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   172
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   173
    // tell the user
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   174
    // XXX: trans is in a bad state during this call
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   175
    trans->error_fn(trans, trans->cb_arg);
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
    // fail the conn
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   178
    trans->conn->trans = NULL; _evsql_conn_release(trans->conn); trans->conn = NULL;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   179
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   180
    // free the trans
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   181
    _evsql_trans_free(trans);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   182
}
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   183
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   184
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   185
 * Fail a connection. If the connection is transactional, this will just call _evsql_trans_fail, but otherwise it will
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   186
 * fail any ongoing query, and then release the connection.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   187
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   188
static void _evsql_conn_fail (struct evsql_conn *conn) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   189
    if (conn->trans) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   190
        // let transactions handle their connection failures
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   191
        _evsql_trans_fail(conn->trans);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   192
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   193
    } else {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   194
        if (conn->query) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   195
            // fail the in-progress query
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   196
            _evsql_query_fail(conn->evsql, conn->query); conn->query = NULL;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
        }
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   199
        // finish off the whole connection
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   200
        _evsql_conn_release(conn);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
    }
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
}
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   204
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   205
 * Processes enqueued non-transactional queries until the queue is empty, or we managed to exec a query.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   206
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   207
 * If execing a query on a connection fails, both the query and the connection are failed (in that order).
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   208
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   209
 * Any further queries will then also be failed, because there's no reconnection/retry logic yet.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   210
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   211
static void _evsql_pump (struct evsql *evsql, struct evsql_conn *conn) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   212
    struct evsql_query *query;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   213
    int err;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   214
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   215
    // look for waiting queries
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   216
    while ((query = TAILQ_FIRST(&evsql->query_queue)) != NULL) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   217
        // dequeue
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   218
        TAILQ_REMOVE(&evsql->query_queue, query, entry);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   219
        
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   220
        if (conn) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   221
            // try and execute it
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   222
            err = _evsql_query_exec(conn, query, query->command);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   223
        }
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   225
        // free the command buf
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   226
        free(query->command); query->command = NULL;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   228
        if (err || !conn) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   229
            if (!conn) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   230
                // warn when dropping queries
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   231
                WARNING("failing query becuse there are no conns");
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   232
            }
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   233
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   234
            // fail the query
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   235
            _evsql_query_fail(evsql, query);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   236
            
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   237
            if (conn) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   238
                // fail the connection
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   239
                WARNING("failing the connection because a query-exec failed");
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   240
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   241
                _evsql_conn_fail(conn); conn = NULL;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   242
            }
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   243
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   244
        } else {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   245
            // we have succesfully enqueued a query, and we can wait for this connection to complete
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   246
            break;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   247
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   248
        }
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   249
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   250
        // handle the rest of the queue
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   251
    }
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   252
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   253
    // ok
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   254
    return;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
}
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   257
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   258
 * Callback for a trans's 'BEGIN' query, which means the transaction is now ready for use.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   259
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   260
static void _evsql_trans_ready (const struct evsql_result_info *res, void *arg) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   261
    (void) arg;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   263
    assert(res->trans);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   264
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   265
    // check for errors
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   266
    if (res->error)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   267
        ERROR("transaction 'BEGIN' failed: %s", evsql_result_error(res));
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   268
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   269
    // transaction is now ready for use
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   270
    res->trans->ready_fn(res->trans, res->trans->cb_arg);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   271
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   272
error:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   273
    _evsql_trans_fail(res->trans);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   274
}
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   275
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   276
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   277
 * The transaction's connection is ready, send the 'BEGIN' query.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   278
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   279
static void _evsql_trans_conn_ready (struct evsql *evsql, struct evsql_trans *trans) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   280
    char trans_sql[EVSQL_QUERY_BEGIN_BUF];
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   281
    const char *isolation_level;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   282
    int ret;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   283
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   284
    // determine the isolation_level to use
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   285
    switch (trans->type) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   286
        case EVSQL_TRANS_DEFAULT:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   287
            isolation_level = NULL; break;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   288
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   289
        case EVSQL_TRANS_SERIALIZABLE:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   290
            isolation_level = "SERIALIZABLE"; break;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   291
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   292
        case EVSQL_TRANS_REPEATABLE_READ:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   293
            isolation_level = "REPEATABLE READ"; break;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   294
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   295
        case EVSQL_TRANS_READ_COMMITTED:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   296
            isolation_level = "READ COMMITTED"; break;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   297
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   298
        case EVSQL_TRANS_READ_UNCOMMITTED:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   299
            isolation_level = "READ UNCOMMITTED"; break;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   300
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   301
        default:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   302
            FATAL("trans->type: %d", trans->type);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   303
    }
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   304
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   305
    // build the trans_sql
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   306
    if (isolation_level)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   307
        ret = snprintf(trans_sql, EVSQL_QUERY_BEGIN_BUF, "BEGIN TRANSACTION ISOLATION LEVEL %s", isolation_level);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   308
    else
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   309
        ret = snprintf(trans_sql, EVSQL_QUERY_BEGIN_BUF, "BEGIN TRANSACTION");
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   310
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   311
    // make sure it wasn't truncated
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   312
    if (ret >= EVSQL_QUERY_BEGIN_BUF)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   313
        ERROR("trans_sql overflow: %d >= %d", ret, EVSQL_QUERY_BEGIN_BUF);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   314
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   315
    // execute the query
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   316
    if (evsql_query(evsql, trans, trans_sql, _evsql_trans_ready, NULL))
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   317
        ERROR("evsql_query");
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   318
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   319
    // success
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   320
    return;
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
error:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   323
    // fail the transaction
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   324
    _evsql_trans_fail(trans);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   325
}
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
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   328
 * The evpq connection was succesfully established.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   329
 */ 
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   330
static void _evsql_evpq_connected (struct evpq_conn *_conn, void *arg) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   331
    struct evsql_conn *conn = arg;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   332
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   333
    if (conn->trans)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   334
        // notify the transaction
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   335
        _evsql_trans_conn_ready(conn->evsql, conn->trans);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   336
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   337
    else
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   338
        // pump any waiting transactionless queries
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   339
        _evsql_pump(conn->evsql, conn);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   340
}
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   341
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   342
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   343
 * Got one result on this evpq connection.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   344
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   345
static void _evsql_evpq_result (struct evpq_conn *_conn, PGresult *result, void *arg) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   346
    struct evsql_conn *conn = arg;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   347
    struct evsql_query *query = conn->query;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   348
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   349
    assert(query != NULL);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   351
    // if we get multiple results, only return the first one
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   352
    if (query->result.evpq) {
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   353
        WARNING("[evsql] evpq query returned multiple results, discarding previous one");
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   354
        
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   355
        PQclear(query->result.evpq); query->result.evpq = NULL;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   356
    }
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   357
    
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   358
    // remember the result
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   359
    query->result.evpq = result;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   360
}
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   361
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   362
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   363
 * No more results for this query.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   364
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   365
static void _evsql_evpq_done (struct evpq_conn *_conn, void *arg) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   366
    struct evsql_conn *conn = arg;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   367
    struct evsql_query *query = conn->query;
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   368
    struct evsql_result_info res; ZINIT(res);
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   369
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   370
    assert(query != NULL);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   371
    
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   372
    // set up the result_info
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   373
    res.evsql = conn->evsql;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   374
    
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   375
    if (query->result.evpq == NULL) {
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   376
        // if a query didn't return any results (bug?), warn and fail the query
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   377
        WARNING("[evsql] evpq query didn't return any results");
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   378
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   379
        res.error = 1;
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   380
    
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   381
    } else if (strcmp(PQresultErrorMessage(query->result.evpq), "") != 0) {
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   382
        // the query failed with some error
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   383
        res.error = 1;
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   384
        res.result.pq = query->result.evpq;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   385
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   386
    } else {
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   387
        res.error = 0;
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   388
        res.result.pq = query->result.evpq;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   389
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   390
    }
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   392
    // de-associate the query from the connection
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   393
    conn->query = NULL;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   394
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   395
    // how we handle query completion depends on if we're a transaction or not
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   396
    if (conn->trans) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   397
        // we can deassign the trans's query
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   398
        conn->trans->query = NULL;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   399
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   400
        // then hand the query to the user
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   401
        _evsql_query_done(query, &res);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   402
        
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   403
    } else {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   404
        // a transactionless query, so just finish it off and pump any other waiting ones
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   405
        _evsql_query_done(query, &res);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   406
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   407
        // pump the next one
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   408
        _evsql_pump(conn->evsql, conn);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   409
    }
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   410
}
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   411
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   412
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   413
 * The connection failed.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   414
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   415
static void _evsql_evpq_failure (struct evpq_conn *_conn, void *arg) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   416
    struct evsql_conn *conn = arg;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   417
    
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   418
    // just fail the conn
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   419
    _evsql_conn_fail(conn);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   420
}
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   421
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   422
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   423
 * Our evpq behaviour
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   424
 */
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   425
static struct evpq_callback_info _evsql_evpq_cb_info = {
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   426
    .fn_connected       = _evsql_evpq_connected,
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
    .fn_result          = _evsql_evpq_result,
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
    .fn_done            = _evsql_evpq_done,
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   429
    .fn_failure         = _evsql_evpq_failure,
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   430
};
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   431
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   432
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   433
 * Allocate the generic evsql context.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   434
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   435
static struct evsql *_evsql_new_base (struct event_base *ev_base, evsql_error_cb error_fn, void *cb_arg) {
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   436
    struct evsql *evsql = NULL;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   437
    
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   438
    // allocate it
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   439
    if ((evsql = calloc(1, sizeof(*evsql))) == NULL)
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   440
        ERROR("calloc");
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   441
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   442
    // store
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   443
    evsql->ev_base = ev_base;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   444
    evsql->error_fn = error_fn;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   445
    evsql->cb_arg = cb_arg;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   446
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   447
    // init
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   448
    LIST_INIT(&evsql->conn_list);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   449
    TAILQ_INIT(&evsql->query_queue);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   450
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   451
    // done
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   452
    return evsql;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   453
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   454
error:
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   455
    return NULL;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   456
}
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   457
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   458
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   459
 * Start a new connection and add it to the list, it won't be ready until _evsql_evpq_connected is called
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   460
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   461
static struct evsql_conn *_evsql_conn_new (struct evsql *evsql) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   462
    struct evsql_conn *conn = NULL;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   463
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   464
    // allocate
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   465
    if ((conn = calloc(1, sizeof(*conn))) == NULL)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   466
        ERROR("calloc");
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   467
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   468
    // init
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   469
    conn->evsql = evsql;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   470
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   471
    // connect the engine
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   472
    switch (evsql->type) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   473
        case EVSQL_EVPQ:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   474
            if ((conn->engine.evpq = evpq_connect(evsql->ev_base, evsql->engine_conf.evpq, _evsql_evpq_cb_info, conn)) == NULL)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   475
                goto error;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   476
            
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   477
            break;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   478
            
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   479
        default:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   480
            FATAL("evsql->type");
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   481
    }
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   482
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   483
    // add it to the list
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   484
    LIST_INSERT_HEAD(&evsql->conn_list, conn, entry);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   485
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   486
    // success
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   487
    return conn;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   488
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   489
error:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   490
    free(conn);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   491
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   492
    return NULL;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   493
}
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   494
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   495
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
   496
    struct evsql *evsql = NULL;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   497
    
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   498
    // base init
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   499
    if ((evsql = _evsql_new_base (ev_base, error_fn, cb_arg)) == NULL)
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   500
        goto error;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   501
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   502
    // store conf
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   503
    evsql->engine_conf.evpq = pq_conninfo;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   504
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   505
    // pre-create one connection
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   506
    if (_evsql_conn_new(evsql) == NULL)
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   507
        goto error;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   508
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   509
    // done
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   510
    return evsql;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   511
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   512
error:
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   513
    // XXX: more complicated than this?
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   514
    free(evsql); 
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   515
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   516
    return NULL;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   517
}
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   518
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   519
/*
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   520
 * Checks if the connection is already allocated for some other trans/query.
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   521
 *
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   522
 * Returns:
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   523
 *      0       connection idle, can be allocated
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   524
 *      >1      connection busy
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   525
 */
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   526
static int _evsql_conn_busy (struct evsql_conn *conn) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   527
    // transactions get the connection to themselves
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   528
    if (conn->trans)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   529
        return 1;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   530
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   531
    // if it has a query assigned, it's busy
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   532
    if (conn->query)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   533
        return 1;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   534
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   535
    // otherwise, it's all idle
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   536
    return 0;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   537
}
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   538
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   539
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   540
 * Checks if the connection is ready for use (i.e. _evsql_evpq_connected was called).
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   541
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   542
 * The connection should not already have a query running.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   543
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   544
 * Returns 
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   545
 *  <0  the connection is not valid (failed, query in progress)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   546
 *  0   the connection is still pending, and will become ready at some point
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   547
 *  >0  it's ready
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   548
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   549
static int _evsql_conn_ready (struct evsql_conn *conn) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   550
    switch (conn->evsql->type) {
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   551
        case EVSQL_EVPQ: {
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   552
            enum evpq_state state = evpq_state(conn->engine.evpq);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   553
            
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   554
            switch (state) {
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   555
                case EVPQ_CONNECT:
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   556
                    return 0;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   557
                
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   558
                case EVPQ_CONNECTED:
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   559
                    return 1;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   560
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   561
                case EVPQ_QUERY:
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   562
                case EVPQ_INIT:
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   563
                case EVPQ_FAILURE:
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   564
                    return -1;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   565
                
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   566
                default:
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   567
                    FATAL("evpq_state: %d", state);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   568
            }
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   569
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   570
        }
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   571
        
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   572
        default:
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   573
            FATAL("evsql->type: %d", conn->evsql->type);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   574
    }
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   575
}
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   576
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   577
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   578
 * Allocate a connection for use and return it via *conn_ptr, or if may_queue is nonzero and the connection pool is
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   579
 * getting full, return NULL (query should be queued).
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   580
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   581
 * Note that the returned connection might not be ready for use yet (if we created a new one, see _evsql_conn_ready).
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   582
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   583
 * Returns zero if a connection was found or the request should be queued, or nonzero if something failed and the
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   584
 * request should be dropped.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   585
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   586
static int _evsql_conn_get (struct evsql *evsql, struct evsql_conn **conn_ptr, int may_queue) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   587
    *conn_ptr = NULL;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   588
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   589
    // find a connection that isn't busy and is ready (unless the query queue is empty).
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   590
    LIST_FOREACH(*conn_ptr, &evsql->conn_list, entry) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   591
        // skip busy conns always
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   592
        if (_evsql_conn_busy(*conn_ptr))
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   593
            continue;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   594
        
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   595
        // accept pending conns as long as there are NO enqueued queries (might cause deadlock otherwise)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   596
        if (_evsql_conn_ready(*conn_ptr) == 0 && TAILQ_EMPTY(&evsql->query_queue))
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   597
            break;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   598
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   599
        // accept conns that are in a fully ready state
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   600
        if (_evsql_conn_ready(*conn_ptr) > 0)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   601
            break;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   602
    }
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   603
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   604
    // if we found an idle connection, we can just return that right away
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   605
    if (*conn_ptr)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   606
        return 0;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   607
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   608
    // return NULL if may_queue and the conn list is not empty
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   609
    if (may_queue && !LIST_EMPTY(&evsql->conn_list))
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   610
        return 0;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   611
    
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   612
    // we need to open a new connection
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   613
    if ((*conn_ptr = _evsql_conn_new(evsql)) == NULL)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   614
        goto error;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   615
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   616
    // good
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   617
    return 0;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   618
error:
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   619
    return -1;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   620
}
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   621
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   622
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   623
 * Validate and allocate the basic stuff for a new query.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   624
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   625
static struct evsql_query *_evsql_query_new (struct evsql *evsql, struct evsql_trans *trans, evsql_query_cb query_fn, void *cb_arg) {
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   626
    struct evsql_query *query;
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   627
    
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   628
    // if it's part of a trans, then make sure the trans is idle
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   629
    if (trans && trans->query)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   630
        ERROR("transaction is busy");
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   631
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   632
    // allocate it
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   633
    if ((query = calloc(1, sizeof(*query))) == NULL)
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   634
        ERROR("calloc");
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   635
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   636
    // store
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   637
    query->cb_fn = query_fn;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   638
    query->cb_arg = cb_arg;
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   639
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   640
    // success
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   641
    return query;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   642
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   643
error:
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   644
    return NULL;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   645
}
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   646
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   647
/*
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   648
 * Handle a new query.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   649
 *
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   650
 * For transactions this will associate the query and then execute it, otherwise this will either find an idle
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   651
 * connection and send the query, or enqueue it.
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   652
 */
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   653
static int _evsql_query_enqueue (struct evsql *evsql, struct evsql_trans *trans, struct evsql_query *query, const char *command) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   654
    // transaction queries are handled differently
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   655
    if (trans) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   656
        // it's an in-transaction query
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   657
        assert(trans->query == NULL);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   658
        
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   659
        // assign the query
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   660
        trans->query = query;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   661
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   662
        // execute directly
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   663
        if (_evsql_query_exec(trans->conn, query, command))
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   664
            goto error;
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   665
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   666
    } else {
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   667
        struct evsql_conn *conn;
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   668
        
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   669
        // find an idle connection
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   670
        if ((_evsql_conn_get(evsql, &conn, 1)))
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   671
            ERROR("couldn't allocate a connection for the query");
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   672
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   673
        // we must enqueue if no idle conn or the conn is not yet ready
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   674
        if (conn && _evsql_conn_ready(conn) > 0) {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   675
            // execute directly
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   676
            if (_evsql_query_exec(conn, query, command))
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   677
                goto error;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   678
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   679
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   680
        } else {
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   681
            // copy the command for later execution
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   682
            if ((query->command = strdup(command)) == NULL)
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   683
                ERROR("strdup");
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   684
            
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   685
            // enqueue until some connection pumps the queue
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   686
            TAILQ_INSERT_TAIL(&evsql->query_queue, query, entry);
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   687
        }
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   688
    }
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   689
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   690
    // ok, good
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   691
    return 0;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   692
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   693
error:
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   694
    return -1;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   695
}
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   696
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   697
struct evsql_query *evsql_query (struct evsql *evsql, struct evsql_trans *trans, const char *command, evsql_query_cb query_fn, void *cb_arg) {
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   698
    struct evsql_query *query = NULL;
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   699
    
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   700
    // alloc new query
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   701
    if ((query = _evsql_query_new(evsql, trans, query_fn, cb_arg)) == NULL)
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   702
        goto error;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   703
    
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   704
    // just execute the command string directly
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   705
    if (_evsql_query_enqueue(evsql, trans, query, command))
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   706
        goto error;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   707
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   708
    // ok
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   709
    return query;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   710
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   711
error:
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   712
    _evsql_query_free(query);
21
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   713
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   714
    return NULL;
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   715
}
e5da1d428e3e new evsql for queueing SQL queries
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   716
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   717
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) {
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   718
    struct evsql_query *query = NULL;
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   719
    const struct evsql_query_param *param;
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   720
    int idx;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   721
    
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   722
    // alloc new query
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   723
    if ((query = _evsql_query_new(evsql, trans, query_fn, cb_arg)) == NULL)
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   724
        goto error;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   725
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   726
    // count the params
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   727
    for (param = params->list; param->type; param++) 
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   728
        query->params.count++;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   729
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   730
    // allocate the vertical storage for the parameters
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   731
    if (0
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   732
        
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   733
//            !(query->params.types    = calloc(query->params.count, sizeof(Oid)))
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   734
        ||  !(query->params.values   = calloc(query->params.count, sizeof(char *)))
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   735
        ||  !(query->params.lengths  = calloc(query->params.count, sizeof(int)))
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   736
        ||  !(query->params.formats  = calloc(query->params.count, sizeof(int)))
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   737
    )
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   738
        ERROR("calloc");
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   739
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   740
    // transform
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   741
    for (param = params->list, idx = 0; param->type; param++, idx++) {
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   742
        // `types` stays NULL
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   743
        // query->params.types[idx] = 0;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   744
        
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   745
        // values
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   746
        query->params.values[idx] = param->data_raw;
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   747
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   748
        // lengths
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   749
        query->params.lengths[idx] = param->length;
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   750
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   751
        // formats, binary if length is nonzero
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   752
        query->params.formats[idx] = param->length ? 1 : 0;
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   753
    }
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   754
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   755
    // result format
24
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   756
    switch (params->result_fmt) {
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   757
        case EVSQL_FMT_TEXT:
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   758
            query->params.result_format = 0; break;
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   759
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   760
        case EVSQL_FMT_BINARY:
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   761
            query->params.result_format = 1; break;
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   762
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   763
        default:
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   764
            FATAL("params.result_fmt: %d", params->result_fmt);
82cfdb6680d1 working dbfs.lookup
Tero Marttila <terom@fixme.fi>
parents: 23
diff changeset
   765
    }
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   766
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   767
    // execute it
25
99a41f48e29b evsql transactions, it compiles...
Tero Marttila <terom@fixme.fi>
parents: 24
diff changeset
   768
    if (_evsql_query_enqueue(evsql, trans, query, command))
23
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   769
        goto error;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   770
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   771
    // ok
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   772
    return query;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   773
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   774
error:
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   775
    _evsql_query_free(query);
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   776
    
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   777
    return NULL;
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   778
}
1dee73ae4ad0 evsql_query_params compiles...
Tero Marttila <terom@fixme.fi>
parents: 21
diff changeset
   779