src/evsql/query.c
author Tero Marttila <terom@fixme.fi>
Thu, 20 Nov 2008 01:16:24 +0200
branchnew-evsql
changeset 44 9e76ee9729b6
child 45 424ce5ab82fd
permissions -rw-r--r--
more work on the new evsql interface
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include "evsql.h"
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
/*
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
 * Initialize params->types/values/lengths/formats, params->count, params->result_format based on the given args
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
 */
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
static int _evsql_query_params_init_pq (struct evsql_query_params_pq *params, size_t param_count, enum evsql_item_format result_format) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
    // set count
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
    params->count = param_count;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
    // allocate vertical storage for the parameters
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
    if (0
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
        
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
        ||  !(query->params.types    = calloc(query->params.count, sizeof(Oid)))
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
        ||  !(query->params.values   = calloc(query->params.count, sizeof(char *)))
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
        ||  !(query->params.lengths  = calloc(query->params.count, sizeof(int)))
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
        ||  !(query->params.formats  = calloc(query->params.count, sizeof(int)))
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
    )
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
        ERROR("calloc");
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
    // result format
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    switch (result_format) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
        case EVSQL_FMT_TEXT:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
            params.result_format = 0; break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
        case EVSQL_FMT_BINARY:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
            params.result_format = 1; break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        default:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
            FATAL("params.result_fmt: %d", result_format);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
    }
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    // good
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
    return 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
error:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    return -1;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
struct evsql_query *evsql_query (struct evsql *evsql, struct evsql_trans *trans, const char *command, evsql_query_cb query_fn, void *cb_arg) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
    struct evsql_query *query = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    // alloc new query
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
    if ((query = _evsql_query_new(evsql, trans, query_fn, cb_arg)) == NULL)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
        goto error;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    // just execute the command string directly
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    if (_evsql_query_enqueue(evsql, trans, query, command))
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
        goto error;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
    // ok
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    return query;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
error:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
    _evsql_query_free(query);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    return NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
struct evsql_query *evsql_query_params (struct evsql *evsql, struct evsql_trans *trans, 
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    const char *command, const struct evsql_query_params *params, 
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
    evsql_query_cb query_fn, void *cb_arg
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
    struct evsql_query *query = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
    const struct evsql_item *param;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
    size_t count = 0, idx;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
    // alloc new query
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    if ((query = _evsql_query_new(evsql, trans, query_fn, cb_arg)) == NULL)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
        goto error;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    // count the params
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    for (param = params->list; param->info.type; param++) 
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
        count++;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    // initialize params
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
    evsql_query_params_init_pq(&query->params, count, params->result_format);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    // transform
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    for (param = params->list, idx = 0; param->info.type; param++, idx++) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        // `set for NULLs, otherwise not
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
        query->params.types[idx] = param->bytes ? 0 : EVSQL_PQ_ARBITRARY_TYPE_OID;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
        
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
        // values
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
        query->params.values[idx] = param->bytes;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
        // lengths
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
        query->params.lengths[idx] = param->length;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    90
        // formats, binary if length is nonzero, but text for NULLs
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
        query->params.formats[idx] = param->length && param->bytes ? 1 : 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
    }
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    93
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
    // execute it
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    if (_evsql_query_enqueue(evsql, trans, query, command))
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
        goto error;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
#ifdef DEBUG_ENABLED
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
    // debug it?
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    DEBUG("evsql.%p: enqueued query=%p on trans=%p", evsql, query, trans);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
    evsql_query_debug(command, params);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
#endif /* DEBUG_ENABLED */
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
    // ok
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    return query;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
error:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
    _evsql_query_free(query);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
    return NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
struct evsql_query *evsql_query_exec (struct evsql *evsql, struct evsql_trans *trans, 
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
    const struct evsql_query_info *query_info,
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    evsql_query_cb query_fn, void *cb_arg,
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
    ...
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    va_list vargs;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    struct evsql_query *query = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
    const struct evsql_item_info *param;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
    size_t count = 0, idx;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
    err_t err = 1;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
    // varargs
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
    va_start(vargs, cb_arg);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
    // alloc new query
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
    if ((query = _evsql_query_new(evsql, trans, query_fn, cb_arg)) == NULL)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
        goto error;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
    // count the params
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    for (param = query_info->params; param->type; param++) 
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
        count++;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
    // initialize params
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
    evsql_query_params_init_pq(&query->params, count, EVSQL_FMT_BINARY);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
    // transform
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
    for (param = params->params, idx = 0; param->info.type; param++, idx++) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
        // default type to 0 (implicit)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
        query->params.types[idx] = 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
        // default format to binary
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        query->params.formats[idx] = EVSQL_FMT_BINARY;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
        // consume argument
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
        switch (param->info.type) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
            case EVSQL_TYPE_NULL_: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
                // explicit type + text fmt
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
                query->params.types[idx] = EVSQL_PQ_ARBITRARY_TYPE_OID;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
                query->params.values[idx] = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
                query->params.lengths[idx] = 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
                query->params.formats[idx] = EVSQL_FMT_TEXT;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
            case EVSQL_TYPE_BINARY: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
                struct evsql_item_binary item = va_arg(vargs, struct evsql_item_binary);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
                
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
                // value + explicit len
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
                query->params.values[idx] = item->ptr;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
                query->params.lengths[idx] = item->len;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
            case EVSQL_TYPE_STRING: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
                const char *str = va_arg(vargs, const char *);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
                // value + automatic length, text format
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
                query->params.values[idx] = str;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
                query->params.lengths[idx] = 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
                query->params.formats[idx] = EVSQL_FMT_TEXT;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
            
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
            case EVSQL_TYPE_UINT16: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
                uint16_t uval = va_arg(vargs, uint16_t);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
                if (uval != (int16_t) uval)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
                    ERROR("param $%zu: uint16 overflow: %d", idx + 1, uval);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
                
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
                // network-byte-order value + explicit len
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
                query->params.values[idx] = htons(uval);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
                query->params.lengths[idx] = sizeof(uint16_t);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
            
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
            case EVSQL_TYPE_UINT32: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
                uint32_t uval = va_arg(vargs, uint32_t);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
                if (uval != (int32_t) uval)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
                    ERROR("param $%zu: uint32 overflow: %ld", idx + 1, uval);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
                
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
                // network-byte-order value + explicit len
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
                query->params.values[idx] = htonl(uval);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
                query->params.lengths[idx] = sizeof(uint32_t);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
            case EVSQL_TYPE_UINT64: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
                uint64_t uval = va_arg(vargs, uint64_t);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
                if (uval != (int64_t) uval)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
                    ERROR("param $%zu: uint16 overflow: %lld", idx + 1, uval);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
                
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
                // network-byte-order value + explicit len
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
                query->params.values[idx] = htonq(uval);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
                query->params.lengths[idx] = sizeof(uint64_t);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
            
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
            default: 
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
                FATAL("param $%zu: invalid type: %d", idx + 1, param->info.type);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
        }
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
    }
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
    // execute it
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
    if (_evsql_query_enqueue(evsql, trans, query, command))
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
        goto error;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
    // no error, fallthrough for va_end
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
    err = 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
error:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
    // possible cleanup
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
    if (err)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
        _evsql_query_free(query);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
    // end varargs
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
    va_end(vargs);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
    // return 
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
    return err ? NULL : query;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
void evsql_query_abort (struct evsql_trans *trans, struct evsql_query *query) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
    assert(query);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
    if (trans) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
        // must be the right query
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
        assert(trans->query == query);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
    }
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
    // just strip the callback and wait for it to complete as normal
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
    query->cb_fn = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242