src/evsql/result.c
author Tero Marttila <terom@fixme.fi>
Sat, 29 Nov 2008 00:39:47 +0200
branchnew-evsql
changeset 46 75cecfc4603b
parent 45 424ce5ab82fd
child 51 c65d0f4c3bff
permissions -rw-r--r--
moar testing
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"
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     3
#include "../lib/error.h"
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
     4
#include "../lib/misc.h"
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
const char *evsql_result_error (const struct evsql_result *res) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
    if (!res->error)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
        return "No error";
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
    switch (res->evsql->type) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
        case EVSQL_EVPQ:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
            if (!res->result.pq)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
                return "unknown error (no result)";
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
            
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
            return PQresultErrorMessage(res->result.pq);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
        default:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
            FATAL("res->evsql->type");
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
    }
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
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
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
size_t evsql_result_rows (const struct evsql_result *res) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
    switch (res->evsql->type) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
        case EVSQL_EVPQ:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
            return PQntuples(res->result.pq);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
        default:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
            FATAL("res->evsql->type");
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
    }
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
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
size_t evsql_result_cols (const struct evsql_result *res) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
    switch (res->evsql->type) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
        case EVSQL_EVPQ:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
            return PQnfields(res->result.pq);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
        default:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
            FATAL("res->evsql->type");
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
    }
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
size_t evsql_result_affected (const struct evsql_result *res) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
    switch (res->evsql->type) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
        case EVSQL_EVPQ:
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    49
            // XXX: errors?
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
            return strtol(PQcmdTuples(res->result.pq), NULL, 10);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
        default:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
            FATAL("res->evsql->type");
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
    }
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
}
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
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
int evsql_result_null (const struct evsql_result *res, size_t row, size_t col) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    switch (res->evsql->type) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        case EVSQL_EVPQ:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
            return PQgetisnull(res->result.pq, row, col);
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
        default:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
            FATAL("res->evsql->type");
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
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    68
int evsql_result_field (const struct evsql_result *res, size_t row, size_t col, char ** const ptr, size_t *size) {
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
    *ptr = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
    switch (res->evsql->type) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
        case EVSQL_EVPQ:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
            if (PQfformat(res->result.pq, col) != 1)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
                ERROR("[%zu:%zu] PQfformat is not binary: %d", row, col, PQfformat(res->result.pq, col));
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
            *size = PQgetlength(res->result.pq, row, col);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    77
            *ptr  = PQgetvalue(res->result.pq, row, col);
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
            return 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
        default:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
            FATAL("res->evsql->type");
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
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
error:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
    return -1;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    88
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    89
err_t evsql_result_check (struct evsql_result *res) {
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    90
    // so simple...
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    91
    return res->error ? EIO : 0;
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    92
}
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    93
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    94
err_t evsql_result_begin (struct evsql_result_info *info, struct evsql_result *res) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
    struct evsql_item_info *col;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    96
    size_t cols = 0, nrows;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    97
    err_t err;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    98
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    99
    // count info columns
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    for (col = info->columns; col->type; col++)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
        cols++;
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
    // number of rows returned/affected
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
    nrows = evsql_result_rows(res) || evsql_result_affected(res);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
    // did the query fail outright?
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
    if (res->error)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
        // dump error message
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   109
        NXERROR(err = EIO, evsql_result_error(res));
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
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
    // SELECT/DELETE/UPDATE WHERE didn't match any rows -> ENOENT
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
    if (nrows == 0)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
        XERROR(err = ENOENT, "no rows returned/affected");
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
*/
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
    // correct number of columns
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    if (evsql_result_cols(res) != cols)
46
75cecfc4603b moar testing
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   119
        XERROR(err = EINVAL, "wrong number of columns: %zu, should be %zu", evsql_result_cols(res), cols);
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
    // assign
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
    res->info = info;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
    res->row_offset = 0;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
    // good
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
    return 0;
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
error:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
    return err;
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
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
int evsql_result_next (struct evsql_result *res, ...) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
    va_list vargs;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
    struct evsql_item_info *col;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
    size_t col_idx, row_idx = res->row_offset;
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   137
    err_t err;
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   138
    
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   139
    // ensure that evsql_result_begin has been called
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   140
    assert(res->info);
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
    
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
    // check if we're past the end
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    if (row_idx >= evsql_result_rows(res))
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
        return 0;
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
    // varargs
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   147
    va_start(vargs, res);
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   149
    for (col = res->info->columns, col_idx = 0; col->type; col++, col_idx++) {
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
        char *value = NULL;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        size_t length = 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
        // check for NULLs, then try and get the field value
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
        if (evsql_result_null(res, row_idx, col_idx)) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
            if (!col->flags.null_ok)
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
                XERROR(err = EINVAL, "r%zu:c%zu: NULL", row_idx, col_idx);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   158
        } else if (evsql_result_field(res, row_idx, col_idx, &value, &length)) {
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   159
            SERROR(err = EINVAL);
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   160
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
        }
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
        
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
        // read the arg
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
        switch (col->type) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
            case EVSQL_TYPE_BINARY: {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
                struct evsql_item_binary *item_ptr = va_arg(vargs, struct evsql_item_binary *);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
                if (value) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
                    item_ptr->ptr = value;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
                    item_ptr->len = length;
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
                }
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
                char **str_ptr = va_arg(vargs, char **);
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   177
                if (value) {
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
                    *str_ptr = value;
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   179
                }
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
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
                uint16_t *uval_ptr = va_arg(vargs, uint16_t *);
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   186
                if (!value) break;
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   188
                if (length != sizeof(uint16_t)) XERROR(err = EINVAL, "r%zu:c%zu: wrong size for uint16_t: %zu", row_idx, col_idx, length);
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   189
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   190
                int16_t sval = ntohs(*((int16_t *) value));
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   191
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   192
                if (sval < 0) XERROR(err = ERANGE, "r%zu:c%zu: out of range for uint16_t: %hd", row_idx, col_idx, (signed short) sval);
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   193
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   194
                *uval_ptr = sval;
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
            } break;
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   196
            
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   197
            case EVSQL_TYPE_UINT32: {
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   198
                uint32_t *uval_ptr = va_arg(vargs, uint32_t *);
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   199
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   200
                if (!value) break;
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   201
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   202
                if (length != sizeof(uint32_t)) XERROR(err = EINVAL, "r%zu:c%zu: wrong size for uint32_t: %zu", row_idx, col_idx, length);
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   203
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   204
                int32_t sval = ntohl(*((int32_t *) value));
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   205
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   206
                if (sval < 0) XERROR(err = ERANGE, "r%zu:c%zu: out of range for uint32_t: %ld", row_idx, col_idx, (signed long) sval);
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   207
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   208
                *uval_ptr = sval;
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   209
            } break;
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   210
            
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   211
            case EVSQL_TYPE_UINT64: {
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   212
                uint64_t *uval_ptr = va_arg(vargs, uint64_t *);
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   213
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   214
                if (!value) break;
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   215
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   216
                if (length != sizeof(uint64_t)) XERROR(err = EINVAL, "r%zu:c%zu: wrong size for uint64_t: %zu", row_idx, col_idx, length);
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   217
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   218
                int64_t sval = ntohq(*((int64_t *) value));
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   219
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   220
                if (sval < 0) XERROR(err = ERANGE, "r%zu:c%zu: out of range for uint64_t: %lld", row_idx, col_idx, (signed long long) sval);
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   221
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   222
                *uval_ptr = sval;
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   223
            } break;
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   224
            
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   225
            default:
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   226
                XERROR(err = EINVAL, "r%zu:c%zu: invalid type: %d", row_idx, col_idx, col->type);
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
        }
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
46
75cecfc4603b moar testing
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   230
    // advance row index
75cecfc4603b moar testing
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   231
    res->row_offset++;
75cecfc4603b moar testing
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   232
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   233
    // row handled succesfully
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   234
    return 1;
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   236
error:
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   237
    return -err;
44
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
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
void evsql_result_end (struct evsql_result *res) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
    // not much more to it...
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
    evsql_result_free(res);
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_result_free (struct evsql_result *res) {
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   246
    // note that the result itself might be NULL...
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   247
    // in the case of internal-error results, these may be free'd multiple times!
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
    switch (res->evsql->type) {
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
        case EVSQL_EVPQ:
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   250
            if (res->result.pq)
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   251
                return PQclear(res->result.pq);
44
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
        default:
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
            FATAL("res->evsql->type");
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
}
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258