src/query.c
author Tero Marttila <terom@fixme.fi>
Sun, 08 Mar 2009 01:33:45 +0200
changeset 58 02e539965ef4
parent 48 src/evsql/query.c@8b019d191353
permissions -rw-r--r--
merge new-evsql into new structure
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
58
02e539965ef4 merge new-evsql into new structure
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
     2
#include "internal.h"
02e539965ef4 merge new-evsql into new structure
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
     3
#include "lib/error.h"
02e539965ef4 merge new-evsql into new structure
Tero Marttila <terom@fixme.fi>
parents: 48
diff changeset
     4
#include "lib/misc.h"
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     5
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     6
#include <stdlib.h>
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     7
#include <assert.h>
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
/*
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
 * 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
    11
 */
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
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
    13
    // set count
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
    params->count = param_count;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
    // allocate vertical storage for the parameters
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
    if (0
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
        
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    19
        ||  !(params->types     = calloc(param_count, sizeof(Oid)))
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    20
        ||  !(params->values    = calloc(param_count, sizeof(char *)))
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    21
        ||  !(params->lengths   = calloc(param_count, sizeof(int)))
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    22
        ||  !(params->formats   = calloc(param_count, sizeof(int)))
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    23
        ||  !(params->item_vals = calloc(param_count, sizeof(union evsql_item_value)))
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    )
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
        ERROR("calloc");
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    // result format
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    switch (result_format) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        case EVSQL_FMT_TEXT:
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    30
            params->result_format = 0; break;
44
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
        case EVSQL_FMT_BINARY:
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    33
            params->result_format = 1; break;
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
        default:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
            FATAL("params.result_fmt: %d", result_format);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    }
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
    // good
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
    return 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
error:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    return -1;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
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
    47
    struct evsql_query *query = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
    // alloc new query
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
    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
    51
        goto error;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
    // just execute the command string directly
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    if (_evsql_query_enqueue(evsql, trans, query, command))
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        goto error;
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
    // ok
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
    return query;
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
error:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
    _evsql_query_free(query);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    return NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
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
    67
    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
    68
    evsql_query_cb query_fn, void *cb_arg
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    struct evsql_query *query = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
    const struct evsql_item *param;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    size_t count = 0, idx;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
    // alloc new query
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
    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
    76
        goto error;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
    // count the params
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    for (param = params->list; param->info.type; param++) 
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
        count++;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
    // initialize params
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    83
    _evsql_query_params_init_pq(&query->params, count, params->result_format);
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
    // transform
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    for (param = params->list, idx = 0; param->info.type; param++, idx++) {
48
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    87
        // set for NULLs, otherwise not
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    88
        query->params.types[idx] = (param->bytes || param->flags.has_value) ? 0 : EVSQL_PQ_ARBITRARY_TYPE_OID;
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    89
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    90
        // scalar values
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    91
        query->params.item_vals[idx] = param->value;
44
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
        // values
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    94
        // point this at the value stored in the item_vals union if flagged as such
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    95
        query->params.values[idx] = param->flags.has_value ? (const char *) &query->params.item_vals[idx] : param->bytes;
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
        // lengths
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
        query->params.lengths[idx] = param->length;
48
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
    99
        
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   100
        // XXX: this assumes that format is FMT_BINARY...
8b019d191353 update dbfs code to work with new evsql
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   101
        query->params.formats[idx] = param->info.format;
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    }
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
    // execute it
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
    if (_evsql_query_enqueue(evsql, trans, query, command))
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
        goto error;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
#ifdef DEBUG_ENABLED
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
    // debug it?
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
    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
   111
    evsql_query_debug(command, params);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
#endif /* DEBUG_ENABLED */
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
    // ok
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
    return query;
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
error:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    _evsql_query_free(query);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
    return NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
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
   124
    const struct evsql_query_info *query_info,
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
    evsql_query_cb query_fn, void *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
) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
    va_list vargs;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
    struct evsql_query *query = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
    const struct evsql_item_info *param;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
    size_t count = 0, idx;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    err_t err = 1;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
    // varargs
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
    va_start(vargs, cb_arg);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
    // alloc new query
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
    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
   139
        goto error;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
    // count the params
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
    for (param = query_info->params; param->type; param++) 
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
        count++;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
    // initialize params
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   146
    _evsql_query_params_init_pq(&query->params, count, EVSQL_FMT_BINARY);
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
    // transform
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   149
    for (param = query_info->params, idx = 0; param->type; param++, idx++) {
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
        // default type to 0 (implicit)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        query->params.types[idx] = 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
        // default format to binary
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        query->params.formats[idx] = EVSQL_FMT_BINARY;
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
        // consume argument
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   157
        switch (param->type) {
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
            case EVSQL_TYPE_NULL_: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
                // explicit type + text fmt
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
                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
   161
                query->params.values[idx] = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
                query->params.lengths[idx] = 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
                query->params.formats[idx] = EVSQL_FMT_TEXT;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
            case EVSQL_TYPE_BINARY: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
                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
   168
                
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
                // value + explicit len
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   170
                query->params.values[idx] = item.ptr;
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   171
                query->params.lengths[idx] = item.len;
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
            case EVSQL_TYPE_STRING: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
                const char *str = va_arg(vargs, const char *);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
                // value + automatic length, text format
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
                query->params.values[idx] = str;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
                query->params.lengths[idx] = 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
                query->params.formats[idx] = EVSQL_FMT_TEXT;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
            
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
            case EVSQL_TYPE_UINT16: {
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   184
                // XXX: uint16_t is passed as `int'?
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   185
                uint16_t uval = va_arg(vargs, int);
44
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 != (int16_t) uval)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
                    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
   189
                
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
                // network-byte-order value + explicit len
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   191
                query->params.item_vals[idx].uint16 = htons(uval);
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   192
                query->params.values[idx] = (const char *) &query->params.item_vals[idx];
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
                query->params.lengths[idx] = sizeof(uint16_t);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
            
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
            case EVSQL_TYPE_UINT32: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
                uint32_t uval = va_arg(vargs, uint32_t);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
                if (uval != (int32_t) uval)
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   200
                    ERROR("param $%zu: uint32 overflow: %ld", idx + 1, (unsigned long) uval);
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
                
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
                // network-byte-order value + explicit len
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   203
                query->params.item_vals[idx].uint32 = htonl(uval);
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   204
                query->params.values[idx] = (const char *) &query->params.item_vals[idx];
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
                query->params.lengths[idx] = sizeof(uint32_t);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
            case EVSQL_TYPE_UINT64: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
                uint64_t uval = va_arg(vargs, uint64_t);
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
                if (uval != (int64_t) uval)
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   212
                    ERROR("param $%zu: uint16 overflow: %lld", idx + 1, (unsigned long long) uval);
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
                
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
                // network-byte-order value + explicit len
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   215
                query->params.item_vals[idx].uint64 = htonq(uval);
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   216
                query->params.values[idx] = (const char *) &query->params.item_vals[idx];
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
                query->params.lengths[idx] = sizeof(uint64_t);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
            } break;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
            
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
            default: 
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   221
                FATAL("param $%zu: invalid type: %d", idx + 1, param->type);
44
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
    }
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
    // execute it
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   226
    if (_evsql_query_enqueue(evsql, trans, query, query_info->sql))
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
        goto error;
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
    // no error, fallthrough for va_end
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
    err = 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
error:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
    // possible cleanup
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
    if (err)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
        _evsql_query_free(query);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
    // end varargs
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
    va_end(vargs);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
    // return 
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
    return err ? NULL : query;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
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
   246
    assert(query);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
    if (trans) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
        // must be the right query
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
        assert(trans->query == query);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
    }
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
    // 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
   254
    query->cb_fn = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256