src/core.c
author Tero Marttila <terom@fixme.fi>
Wed, 01 May 2013 00:11:39 +0300
changeset 66 fdd7f995af6c
parent 65 8b8de7f6e0e9
permissions -rw-r--r--
MIT license
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
#define _GNU_SOURCE
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
#include <stdlib.h>
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
#include <assert.h>
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
#include <string.h>
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
56
9dfc861273e5 strip dbfs code away, and wrangle the code a bit
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
     6
#include "internal.h"
9dfc861273e5 strip dbfs code away, and wrangle the code a bit
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
     7
#include "lib/log.h"
9dfc861273e5 strip dbfs code away, and wrangle the code a bit
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
     8
#include "lib/error.h"
9dfc861273e5 strip dbfs code away, and wrangle the code a bit
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
     9
#include "lib/misc.h"
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
 * A couple function prototypes
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
 */ 
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
static void _evsql_pump (struct evsql *evsql, struct evsql_conn *conn);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
 * Actually execute the given query.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
 * The backend should be able to accept the query at this time.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
 * You should assume that if trying to execute a query fails, then the connection should also be considred as failed.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
static int _evsql_query_exec (struct evsql_conn *conn, struct evsql_query *query, const char *command) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
    int err;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
36
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    26
    DEBUG("evsql.%p: exec query=%p on trans=%p on conn=%p:", conn->evsql, query, conn->trans, conn);
56427f22e969 tweak debug/info output, implement dbfs_unlink with slightly improved error macros handling
Tero Marttila <terom@fixme.fi>
parents: 31
diff changeset
    27
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
    switch (conn->evsql->type) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
        case EVSQL_EVPQ:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
            // got params?
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
            if (query->params.count) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
                err = evpq_query_params(conn->engine.evpq, command,
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
                    query->params.count, 
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
                    query->params.types, 
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
                    query->params.values, 
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
                    query->params.lengths, 
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
                    query->params.formats, 
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
                    query->params.result_format
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
                );
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
            } else {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
                // plain 'ole query
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
                err = evpq_query(conn->engine.evpq, command);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
            }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
            if (err) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
                if (PQstatus(evpq_pgconn(conn->engine.evpq)) != CONNECTION_OK)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
                    WARNING("conn failed");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
                else
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
                    WARNING("query failed, dropping conn as well");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
            }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
            break;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
        
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
        default:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
            FATAL("evsql->type");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
    if (!err)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
        // assign the query
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
        conn->query = query;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
    return err;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    66
void _evsql_query_free (struct evsql_query *query) {
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
    if (!query)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
        return;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    69
        
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    70
    assert(query->command == NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    71
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    72
    // free params if present
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    73
    free(query->params.types);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    74
    free(query->params.values);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    75
    free(query->params.lengths);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    76
    free(query->params.formats);
65
8b8de7f6e0e9 fix a memory leak with evsql_query::params.item_vals
Tero Marttila <terom@fixme.fi>
parents: 64
diff changeset
    77
    free(query->params.item_vals);
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    78
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
    // free the query itself
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
    free(query);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    84
 * Execute the callback if res is given, and free the query.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    85
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    86
 * The query has been aborted, it will simply be freed
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    87
 */
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    88
static void _evsql_query_done (struct evsql_query *query, struct evsql_result *res) {
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    89
    if (res) {
64
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
    90
        if (query->cb_fn) {
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    91
            // call the callback
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    92
            query->cb_fn(res, query->cb_arg);
64
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
    93
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
    94
        } else {
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    95
            WARNING("supressing cb_fn because query was aborted");
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    96
            
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    97
            // free the results
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    98
            evsql_result_free(res);
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
    99
        }
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   100
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   101
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   102
    // free
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   103
    _evsql_query_free(query);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   104
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   105
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   106
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   107
 * XXX:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   108
 * /
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   109
static void _evsql_destroy (struct evsql *evsql, const struct evsql_result *res) {
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   110
    struct evsql_query *query;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   111
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   112
    // clear the queue
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   113
    while ((query = TAILQ_FIRST(&evsql->query_queue)) != NULL) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   114
        _evsql_query_done(query, res);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   115
        
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   116
        TAILQ_REMOVE(&evsql->query_queue, query, entry);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   117
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   118
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   119
    // free
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   120
    free(evsql);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   121
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   122
*/
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   123
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   124
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   125
 * Free the transaction, it should already be deassociated from the query and conn.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   126
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   127
static void _evsql_trans_free (struct evsql_trans *trans) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   128
    // ensure we don't leak anything
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   129
    assert(trans->query == NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   130
    assert(trans->conn == NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   131
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   132
    // free
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   133
    free(trans);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   134
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   135
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   136
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   137
 * Release a connection. It should already be deassociated from the trans and query.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   138
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   139
 * Releases the engine, removes from the conn_list and frees this.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   140
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   141
static void _evsql_conn_release (struct evsql_conn *conn) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   142
    // ensure we don't leak anything
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   143
    assert(conn->trans == NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   144
    assert(conn->query == NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   145
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   146
    // release the engine
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   147
    switch (conn->evsql->type) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   148
        case EVSQL_EVPQ:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   149
            evpq_release(conn->engine.evpq);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   150
            break;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   151
        
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   152
        default:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   153
            FATAL("evsql->type");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   154
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   155
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   156
    // remove from list
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   157
    LIST_REMOVE(conn, entry);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   158
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   159
    // catch deadlocks
64
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   160
    // XXX: still just assert?
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   161
    assert(!LIST_EMPTY(&conn->evsql->conn_list) || TAILQ_EMPTY(&conn->evsql->query_queue));
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   162
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   163
    // free
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   164
    free(conn);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   165
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   166
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   167
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   168
 * Release a transaction, it should already be deassociated from the query.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   169
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   170
 * Perform a two-way-deassociation with the conn, and then free the trans.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   171
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   172
static void _evsql_trans_release (struct evsql_trans *trans) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   173
    assert(trans->query == NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   174
    assert(trans->conn != NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   175
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   176
    // deassociate the conn
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   177
    trans->conn->trans = NULL; trans->conn = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   178
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   179
    // free the trans
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   180
    _evsql_trans_free(trans);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   181
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   182
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   183
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   184
 * Fail a single query, this will trigger the callback and free it.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   185
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   186
 * NOTE: Only for *TRANSACTIONLESS* queries.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   187
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   188
static void _evsql_query_fail (struct evsql* evsql, struct evsql_query *query) {
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   189
    struct evsql_result res; ZINIT(res);
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   190
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   191
    // set up the result_info
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   192
    res.evsql = evsql;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   193
    res.error = 1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   194
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   195
    // finish off the query
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   196
    _evsql_query_done(query, &res);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   197
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   198
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   199
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   200
 * Fail a transaction, this will silently drop any query, trigger the error callback, two-way-deassociate/release the
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   201
 * conn, and then free the trans.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   202
 */ 
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   203
static void _evsql_trans_fail (struct evsql_trans *trans) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   204
    if (trans->query) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   205
        // free the query silently
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   206
        _evsql_query_free(trans->query); trans->query = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   207
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   208
        // also deassociate it from the conn!
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   209
        trans->conn->query = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   210
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   211
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   212
    // tell the user
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   213
    // XXX: trans is in a bad state during this call
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   214
    if (trans->error_fn)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   215
        trans->error_fn(trans, trans->cb_arg);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   216
    else
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   217
        WARNING("supressing error because error_fn was NULL");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   218
 
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   219
    // deassociate and release the conn
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   220
    trans->conn->trans = NULL; _evsql_conn_release(trans->conn); trans->conn = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   221
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   222
    // pump the queue for requests that were waiting for this connection
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   223
    _evsql_pump(trans->evsql, NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   224
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   225
    // free the trans
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   226
    _evsql_trans_free(trans);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   227
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   228
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   229
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   230
 * Fail a connection. If the connection is transactional, this will just call _evsql_trans_fail, but otherwise it will
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   231
 * fail any ongoing query, and then release the connection.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   232
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   233
static void _evsql_conn_fail (struct evsql_conn *conn) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   234
    if (conn->trans) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   235
        // let transactions handle their connection failures
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   236
        _evsql_trans_fail(conn->trans);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   237
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   238
    } else {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   239
        if (conn->query) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   240
            // fail the in-progress query
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   241
            _evsql_query_fail(conn->evsql, conn->query); conn->query = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   242
        }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   243
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   244
        // finish off the whole connection
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   245
        _evsql_conn_release(conn);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   246
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   247
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   248
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   249
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   250
 * Processes enqueued non-transactional queries until the queue is empty, or we managed to exec a query.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   251
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   252
 * If execing a query on a connection fails, both the query and the connection are failed (in that order).
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   253
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   254
 * Any further queries will then also be failed, because there's no reconnection/retry logic yet.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   255
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   256
 * This means that if conn is NULL, all queries are failed.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   257
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   258
static void _evsql_pump (struct evsql *evsql, struct evsql_conn *conn) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   259
    struct evsql_query *query;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   260
    int err;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   261
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   262
    // look for waiting queries
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   263
    while ((query = TAILQ_FIRST(&evsql->query_queue)) != NULL) {
52
f5037572c326 improved evsql docs and added a doxygen config file
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   264
        // zero err
f5037572c326 improved evsql docs and added a doxygen config file
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   265
        err = 0;
f5037572c326 improved evsql docs and added a doxygen config file
Tero Marttila <terom@fixme.fi>
parents: 47
diff changeset
   266
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   267
        // dequeue
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   268
        TAILQ_REMOVE(&evsql->query_queue, query, entry);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   269
        
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   270
        if (conn) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   271
            // try and execute it
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   272
            err = _evsql_query_exec(conn, query, query->command);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   273
        }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   274
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   275
        // free the command buf
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   276
        free(query->command); query->command = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   277
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   278
        if (err || !conn) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   279
            if (!conn) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   280
                // warn when dropping queries
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   281
                WARNING("failing query becuse there are no conns");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   282
            }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   283
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   284
            // fail the query
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   285
            _evsql_query_fail(evsql, query);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   286
            
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   287
            if (conn) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   288
                // fail the connection
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   289
                WARNING("failing the connection because a query-exec failed");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   290
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   291
                _evsql_conn_fail(conn); conn = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   292
            }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   293
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   294
        } else {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   295
            // we have succesfully enqueued a query, and we can wait for this connection to complete
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   296
            break;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   297
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   298
        }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   299
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   300
        // handle the rest of the queue
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   301
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   302
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   303
    // ok
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   304
    return;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   305
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   306
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   307
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   308
 * Callback for a trans's 'BEGIN' query, which means the transaction is now ready for use.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   309
 */
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   310
static void _evsql_trans_ready (struct evsql_result *res, void *arg) {
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   311
    struct evsql_trans *trans = arg;
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   312
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   313
    assert(trans != NULL);
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   314
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   315
    // check for errors
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   316
    if (res->error)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   317
        ERROR("transaction 'BEGIN' failed: %s", evsql_result_error(res));
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   318
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   319
    // transaction is now ready for use
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   320
    trans->ready_fn(trans, trans->cb_arg);
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   321
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   322
    // good
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   323
    return;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   324
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   325
error:
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   326
    _evsql_trans_fail(trans);
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   327
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   328
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   329
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   330
 * The transaction's connection is ready, send the 'BEGIN' query.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   331
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   332
 * If anything fails, calls _evsql_trans_fail and returns nonzero, zero on success
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   333
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   334
static int _evsql_trans_conn_ready (struct evsql *evsql, struct evsql_trans *trans) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   335
    char trans_sql[EVSQL_QUERY_BEGIN_BUF];
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   336
    const char *isolation_level;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   337
    int ret;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   338
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   339
    // determine the isolation_level to use
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   340
    switch (trans->type) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   341
        case EVSQL_TRANS_DEFAULT:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   342
            isolation_level = NULL; break;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   343
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   344
        case EVSQL_TRANS_SERIALIZABLE:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   345
            isolation_level = "SERIALIZABLE"; break;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   346
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   347
        case EVSQL_TRANS_REPEATABLE_READ:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   348
            isolation_level = "REPEATABLE READ"; break;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   349
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   350
        case EVSQL_TRANS_READ_COMMITTED:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   351
            isolation_level = "READ COMMITTED"; break;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   352
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   353
        case EVSQL_TRANS_READ_UNCOMMITTED:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   354
            isolation_level = "READ UNCOMMITTED"; break;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   355
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   356
        default:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   357
            FATAL("trans->type: %d", trans->type);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   358
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   359
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   360
    // build the trans_sql
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   361
    if (isolation_level)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   362
        ret = snprintf(trans_sql, EVSQL_QUERY_BEGIN_BUF, "BEGIN TRANSACTION ISOLATION LEVEL %s", isolation_level);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   363
    else
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   364
        ret = snprintf(trans_sql, EVSQL_QUERY_BEGIN_BUF, "BEGIN TRANSACTION");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   365
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   366
    // make sure it wasn't truncated
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   367
    if (ret >= EVSQL_QUERY_BEGIN_BUF)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   368
        ERROR("trans_sql overflow: %d >= %d", ret, EVSQL_QUERY_BEGIN_BUF);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   369
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   370
    // execute the query
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   371
    if (evsql_query(evsql, trans, trans_sql, _evsql_trans_ready, trans) == NULL)
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   372
        ERROR("evsql_query");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   373
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   374
    // success
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   375
    return 0;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   376
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   377
error:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   378
    // fail the transaction
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   379
    _evsql_trans_fail(trans);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   380
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   381
    return -1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   382
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   383
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   384
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   385
 * The evpq connection was succesfully established.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   386
 */ 
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   387
static void _evsql_evpq_connected (struct evpq_conn *_conn, void *arg) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   388
    struct evsql_conn *conn = arg;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   389
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   390
    if (conn->trans)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   391
        // notify the transaction
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   392
        // don't care about errors
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   393
        (void) _evsql_trans_conn_ready(conn->evsql, conn->trans);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   394
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   395
    else
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   396
        // pump any waiting transactionless queries
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   397
        _evsql_pump(conn->evsql, conn);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   398
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   399
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   400
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   401
 * Got one result on this evpq connection.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   402
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   403
static void _evsql_evpq_result (struct evpq_conn *_conn, PGresult *result, void *arg) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   404
    struct evsql_conn *conn = arg;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   405
    struct evsql_query *query = conn->query;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   406
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   407
    assert(query != NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   408
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   409
    // if we get multiple results, only return the first one
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   410
    if (query->result.pq) {
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   411
        WARNING("[evsql] evpq query returned multiple results, discarding previous one");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   412
        
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   413
        PQclear(query->result.pq); query->result.pq = NULL;
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   414
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   415
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   416
    // remember the result
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   417
    query->result.pq = result;
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   418
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   419
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   420
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   421
 * No more results for this query.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   422
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   423
static void _evsql_evpq_done (struct evpq_conn *_conn, void *arg) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   424
    struct evsql_conn *conn = arg;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   425
    struct evsql_query *query = conn->query;
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   426
    struct evsql_result res; ZINIT(res);
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   427
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   428
    assert(query != NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   429
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   430
    // set up the result_info
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   431
    res.evsql = conn->evsql;
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   432
    res.result = query->result;
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   433
    
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   434
    if (query->result.pq == NULL) {
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   435
        // if a query didn't return any results (bug?), warn and fail the query
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   436
        WARNING("[evsql] evpq query didn't return any results");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   437
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   438
        res.error = 1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   439
    
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   440
    } else if (strcmp(PQresultErrorMessage(query->result.pq), "") != 0) {
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   441
        // the query failed with some error
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   442
        res.error = 1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   443
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   444
    } else {
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   445
        // the query succeeded \o/
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   446
        res.error = 0;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   447
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   448
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   449
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   450
    // de-associate the query from the connection
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   451
    conn->query = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   452
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   453
    // how we handle query completion depends on if we're a transaction or not
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   454
    if (conn->trans) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   455
        // we can deassign the trans's query
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   456
        conn->trans->query = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   457
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   458
        // was an abort?
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   459
        if (!query->cb_fn)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   460
            // notify the user that the transaction query has been aborted
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   461
            conn->trans->ready_fn(conn->trans, conn->trans->cb_arg);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   462
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   463
        // then hand the query to the user
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   464
        _evsql_query_done(query, &res);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   465
        
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   466
    } else {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   467
        // a transactionless query, so just finish it off and pump any other waiting ones
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   468
        _evsql_query_done(query, &res);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   469
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   470
        // pump the next one
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   471
        _evsql_pump(conn->evsql, conn);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   472
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   473
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   474
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   475
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   476
 * The connection failed.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   477
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   478
static void _evsql_evpq_failure (struct evpq_conn *_conn, void *arg) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   479
    struct evsql_conn *conn = arg;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   480
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   481
    // just fail the conn
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   482
    _evsql_conn_fail(conn);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   483
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   484
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   485
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   486
 * Our evpq behaviour
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   487
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   488
static struct evpq_callback_info _evsql_evpq_cb_info = {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   489
    .fn_connected       = _evsql_evpq_connected,
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   490
    .fn_result          = _evsql_evpq_result,
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   491
    .fn_done            = _evsql_evpq_done,
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   492
    .fn_failure         = _evsql_evpq_failure,
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   493
};
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   494
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   495
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   496
 * Allocate the generic evsql context.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   497
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   498
static struct evsql *_evsql_new_base (struct event_base *ev_base, evsql_error_cb error_fn, void *cb_arg) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   499
    struct evsql *evsql = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   500
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   501
    // allocate it
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   502
    if ((evsql = calloc(1, sizeof(*evsql))) == NULL)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   503
        ERROR("calloc");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   504
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   505
    // store
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   506
    evsql->ev_base = ev_base;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   507
    evsql->error_fn = error_fn;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   508
    evsql->cb_arg = cb_arg;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   509
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   510
    // init
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   511
    LIST_INIT(&evsql->conn_list);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   512
    TAILQ_INIT(&evsql->query_queue);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   513
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   514
    // done
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   515
    return evsql;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   516
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   517
error:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   518
    return NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   519
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   520
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   521
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   522
 * Start a new connection and add it to the list, it won't be ready until _evsql_evpq_connected is called
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   523
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   524
static struct evsql_conn *_evsql_conn_new (struct evsql *evsql) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   525
    struct evsql_conn *conn = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   526
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   527
    // allocate
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   528
    if ((conn = calloc(1, sizeof(*conn))) == NULL)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   529
        ERROR("calloc");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   530
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   531
    // init
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   532
    conn->evsql = evsql;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   533
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   534
    // connect the engine
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   535
    switch (evsql->type) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   536
        case EVSQL_EVPQ:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   537
            if ((conn->engine.evpq = evpq_connect(evsql->ev_base, evsql->engine_conf.evpq, _evsql_evpq_cb_info, conn)) == NULL)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   538
                goto error;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   539
            
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   540
            break;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   541
            
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   542
        default:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   543
            FATAL("evsql->type");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   544
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   545
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   546
    // add it to the list
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   547
    LIST_INSERT_HEAD(&evsql->conn_list, conn, entry);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   548
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   549
    // success
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   550
    return conn;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   551
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   552
error:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   553
    free(conn);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   554
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   555
    return NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   556
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   557
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   558
struct evsql *evsql_new_pq (struct event_base *ev_base, const char *pq_conninfo, evsql_error_cb error_fn, void *cb_arg) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   559
    struct evsql *evsql = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   560
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   561
    // base init
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   562
    if ((evsql = _evsql_new_base (ev_base, error_fn, cb_arg)) == NULL)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   563
        goto error;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   564
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   565
    // store conf
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   566
    evsql->engine_conf.evpq = pq_conninfo;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   567
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   568
    // pre-create one connection
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   569
    if (_evsql_conn_new(evsql) == NULL)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   570
        goto error;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   571
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   572
    // done
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   573
    return evsql;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   574
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   575
error:
64
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   576
    // there's no other state yet
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   577
    free(evsql); 
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   578
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   579
    return NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   580
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   581
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   582
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   583
 * Checks if the connection is already allocated for some other trans/query.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   584
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   585
 * Returns:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   586
 *      0       connection idle, can be allocated
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   587
 *      >1      connection busy
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   588
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   589
static int _evsql_conn_busy (struct evsql_conn *conn) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   590
    // transactions get the connection to themselves
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   591
    if (conn->trans)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   592
        return 1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   593
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   594
    // if it has a query assigned, it's busy
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   595
    if (conn->query)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   596
        return 1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   597
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   598
    // otherwise, it's all idle
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   599
    return 0;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   600
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   601
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   602
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   603
 * Checks if the connection is ready for use (i.e. _evsql_evpq_connected was called).
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   604
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   605
 * The connection should not already have a query running.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   606
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   607
 * Returns 
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   608
 *  <0  the connection is not valid (failed, query in progress)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   609
 *  0   the connection is still pending, and will become ready at some point
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   610
 *  >0  it's ready
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   611
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   612
static int _evsql_conn_ready (struct evsql_conn *conn) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   613
    switch (conn->evsql->type) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   614
        case EVSQL_EVPQ: {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   615
            enum evpq_state state = evpq_state(conn->engine.evpq);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   616
            
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   617
            switch (state) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   618
                case EVPQ_CONNECT:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   619
                    return 0;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   620
                
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   621
                case EVPQ_CONNECTED:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   622
                    return 1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   623
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   624
                case EVPQ_QUERY:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   625
                case EVPQ_INIT:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   626
                case EVPQ_FAILURE:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   627
                    return -1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   628
                
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   629
                default:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   630
                    FATAL("evpq_state: %d", state);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   631
            }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   632
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   633
        }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   634
        
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   635
        default:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   636
            FATAL("evsql->type: %d", conn->evsql->type);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   637
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   638
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   639
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   640
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   641
 * Allocate a connection for use and return it via *conn_ptr, or if may_queue is nonzero and the connection pool is
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   642
 * getting full, return NULL (query should be queued).
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   643
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   644
 * Note that the returned connection might not be ready for use yet (if we created a new one, see _evsql_conn_ready).
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   645
 *
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   646
 * Returns zero if a connection was found or the request should be queued, or nonzero if something failed and the
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   647
 * request should be dropped.
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   648
 */
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   649
static int _evsql_conn_get (struct evsql *evsql, struct evsql_conn **conn_ptr, int may_queue) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   650
    int have_nontrans = 0;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   651
    *conn_ptr = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   652
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   653
    // find a connection that isn't busy and is ready (unless the query queue is empty).
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   654
    LIST_FOREACH(*conn_ptr, &evsql->conn_list, entry) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   655
        // we can only have a query enqueue itself if there is a non-trans conn it can later use
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   656
        if (!(*conn_ptr)->trans)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   657
            have_nontrans = 1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   658
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   659
        // skip busy conns always
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   660
        if (_evsql_conn_busy(*conn_ptr))
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   661
            continue;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   662
        
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   663
        // accept pending conns as long as there are NO enqueued queries (might cause deadlock otherwise)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   664
        if (_evsql_conn_ready(*conn_ptr) == 0 && TAILQ_EMPTY(&evsql->query_queue))
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   665
            break;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   666
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   667
        // accept conns that are in a fully ready state
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   668
        if (_evsql_conn_ready(*conn_ptr) > 0)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   669
            break;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   670
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   671
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   672
    // if we found an idle connection, we can just return that right away
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   673
    if (*conn_ptr)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   674
        return 0;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   675
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   676
    // return NULL if may_queue and we have a non-trans conn that we can, at some point, use
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   677
    if (may_queue && have_nontrans)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   678
        return 0;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   679
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   680
    // we need to open a new connection
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   681
    if ((*conn_ptr = _evsql_conn_new(evsql)) == NULL)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   682
        goto error;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   683
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   684
    // good
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   685
    return 0;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   686
error:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   687
    return -1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   688
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   689
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   690
struct evsql_trans *evsql_trans (struct evsql *evsql, enum evsql_trans_type type, evsql_trans_error_cb error_fn, evsql_trans_ready_cb ready_fn, evsql_trans_done_cb done_fn, void *cb_arg) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   691
    struct evsql_trans *trans = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   692
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   693
    // allocate it
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   694
    if ((trans = calloc(1, sizeof(*trans))) == NULL)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   695
        ERROR("calloc");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   696
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   697
    // store
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   698
    trans->evsql = evsql;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   699
    trans->ready_fn = ready_fn;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   700
    trans->done_fn = done_fn;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   701
    trans->cb_arg = cb_arg;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   702
    trans->type = type;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   703
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   704
    // find a connection
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   705
    if (_evsql_conn_get(evsql, &trans->conn, 0))
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   706
        ERROR("_evsql_conn_get");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   707
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   708
    // associate the conn
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   709
    trans->conn->trans = trans;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   710
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   711
    // is it already ready?
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   712
    if (_evsql_conn_ready(trans->conn) > 0) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   713
        // call _evsql_trans_conn_ready directly, it will handle cleanup (silently, !error_fn)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   714
        if (_evsql_trans_conn_ready(evsql, trans)) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   715
            // return NULL directly
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   716
            return NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   717
        }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   718
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   719
    } else {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   720
        // otherwise, wait for the conn to be ready
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   721
         
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   722
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   723
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   724
    // and let it pass errors to the user
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   725
    trans->error_fn = error_fn;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   726
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   727
    // ok
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   728
    return trans;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   729
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   730
error:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   731
    free(trans);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   732
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   733
    return NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   734
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   735
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   736
/*
44
9e76ee9729b6 more work on the new evsql interface
Tero Marttila <terom@fixme.fi>
parents: 40
diff changeset
   737
 * Internal query functions
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   738
 */
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   739
struct evsql_query *_evsql_query_new (struct evsql *evsql, struct evsql_trans *trans, evsql_query_cb query_fn, void *cb_arg) {
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   740
    struct evsql_query *query = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   741
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   742
    // if it's part of a trans, then make sure the trans is idle
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   743
    if (trans && trans->query)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   744
        ERROR("transaction is busy");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   745
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   746
    // allocate it
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   747
    if ((query = calloc(1, sizeof(*query))) == NULL)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   748
        ERROR("calloc");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   749
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   750
    // store
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   751
    query->cb_fn = query_fn;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   752
    query->cb_arg = cb_arg;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   753
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   754
    // success
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   755
    return query;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   756
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   757
error:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   758
    return NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   759
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   760
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   761
int _evsql_query_enqueue (struct evsql *evsql, struct evsql_trans *trans, struct evsql_query *query, const char *command) {
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   762
    // transaction queries are handled differently
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   763
    if (trans) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   764
        // it's an in-transaction query
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   765
        assert(trans->query == NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   766
        
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   767
        // assign the query
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   768
        trans->query = query;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   769
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   770
        // execute directly
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   771
        if (_evsql_query_exec(trans->conn, query, command)) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   772
            // ack, fail the transaction
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   773
            _evsql_trans_fail(trans);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   774
            
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   775
            // caller frees query
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   776
            goto error;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   777
        }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   778
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   779
    } else {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   780
        struct evsql_conn *conn;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   781
        
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   782
        // find an idle connection
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   783
        if ((_evsql_conn_get(evsql, &conn, 1)))
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   784
            ERROR("couldn't allocate a connection for the query");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   785
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   786
        // we must enqueue if no idle conn or the conn is not yet ready
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   787
        if (conn && _evsql_conn_ready(conn) > 0) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   788
            // execute directly
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   789
            if (_evsql_query_exec(conn, query, command)) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   790
                // ack, fail the connection
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   791
                _evsql_conn_fail(conn);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   792
                
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   793
                // make sure we don't deadlock any queries, but if this query got a conn directly, then we shouldn't
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   794
                // have any queries enqueued anyways
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   795
                assert(TAILQ_EMPTY(&evsql->query_queue));
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   796
                
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   797
                // caller frees query
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   798
                goto error;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   799
            }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   800
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   801
        } else {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   802
            // copy the command for later execution
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   803
            if ((query->command = strdup(command)) == NULL)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   804
                ERROR("strdup");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   805
            
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   806
            // enqueue until some connection pumps the queue
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   807
            TAILQ_INSERT_TAIL(&evsql->query_queue, query, entry);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   808
        }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   809
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   810
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   811
    // ok, good
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   812
    return 0;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   813
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   814
error:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   815
    return -1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   816
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   817
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   818
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   819
void _evsql_trans_commit_res (struct evsql_result *res, void *arg) {
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   820
    struct evsql_trans *trans = arg;
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   821
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   822
    // check for errors
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   823
    if (res->error)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   824
        ERROR("transaction 'COMMIT' failed: %s", evsql_result_error(res));
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   825
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   826
    // transaction is now done
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   827
    trans->done_fn(trans, trans->cb_arg);
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   828
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   829
    // release it
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   830
    _evsql_trans_release(trans);
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   831
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   832
    // success
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   833
    return;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   834
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   835
error:
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   836
    _evsql_trans_fail(trans);
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   837
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   838
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   839
int evsql_trans_commit (struct evsql_trans *trans) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   840
    static const char *sql = "COMMIT TRANSACTION";
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   841
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   842
    if (trans->query)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   843
        ERROR("cannot COMMIT because transaction is still busy");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   844
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   845
    // query
47
8c6c459eacb7 fix evsql_trans_commit (null arg)
Tero Marttila <terom@fixme.fi>
parents: 45
diff changeset
   846
    if (evsql_query(trans->evsql, trans, sql, _evsql_trans_commit_res, trans) == NULL)
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   847
        goto error;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   848
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   849
    // mark it as commited in case someone wants to abort it
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   850
    trans->has_commit = 1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   851
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   852
    // success
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   853
    return 0;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   854
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   855
error:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   856
    return -1;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   857
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   858
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   859
void _evsql_trans_rollback_res (struct evsql_result *res, void *arg) {
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   860
    struct evsql_trans *trans = arg;
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   861
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   862
    // fail the connection on errors
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   863
    if (res->error)
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   864
        ERROR("transaction 'ROLLBACK' failed: %s", evsql_result_error(res));
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   865
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   866
    // release it
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   867
    _evsql_trans_release(trans);
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   868
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   869
    // success
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   870
    return;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   871
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   872
error:
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   873
    // fail the connection too, errors are supressed
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   874
    _evsql_trans_fail(trans);
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   875
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   876
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   877
/*
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   878
 * Used as the ready_fn callback in case of abort, otherwise directly
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   879
 */
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   880
void _evsql_trans_rollback (struct evsql_trans *trans, void *arg) {
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   881
    static const char *sql = "ROLLBACK TRANSACTION";
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   882
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   883
    (void) arg;
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   884
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   885
    // query
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   886
    if (evsql_query(trans->evsql, trans, sql, _evsql_trans_rollback_res, trans) == NULL) {
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   887
        // fail the transaction/connection, errors are supressed
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   888
        _evsql_trans_fail(trans);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   889
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   890
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   891
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   892
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   893
void evsql_trans_abort (struct evsql_trans *trans) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   894
    // supress errors
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   895
    trans->error_fn = NULL;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   896
    
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   897
    if (trans->has_commit) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   898
        // abort after commit doesn't make sense
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   899
        FATAL("transaction was already commited");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   900
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   901
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   902
    if (trans->query) {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   903
        // gah, some query is running
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   904
        WARNING("aborting pending query");
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   905
        
45
424ce5ab82fd compiles + some basic evsql_test
Tero Marttila <terom@fixme.fi>
parents: 44
diff changeset
   906
        // prepare to rollback once complete by hijacking ready_fn
29
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   907
        trans->ready_fn = _evsql_trans_rollback;
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   908
        
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   909
        // abort
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   910
        evsql_query_abort(trans, trans->query);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   911
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   912
    } else {
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   913
        // just rollback directly
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   914
        _evsql_trans_rollback(trans, NULL);
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   915
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   916
    }
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   917
}
5de62ca9a5aa reorganize evsql into a separate dir, rename dbfs slightly, and split dbfs_op out from dirop (in prep for fileop)
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
   918
64
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   919
void evsql_destroy (struct evsql *evsql) {
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   920
    struct evsql_query *query;
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   921
    struct evsql_conn *conn;
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   922
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   923
    // kill off all queued queries
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   924
    while ((query = TAILQ_FIRST(&evsql->query_queue)) != NULL) {
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   925
        // just free it, command first
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   926
        free(query->command); query->command = NULL;
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   927
        _evsql_query_free(query);
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   928
    }
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   929
    
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   930
    // kill off all connections
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   931
    while ((conn = LIST_FIRST(&evsql->conn_list)) != NULL) {
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   932
        // kill off the query
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   933
        if (conn->query) {
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   934
            free(query->command); query->command = NULL;
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   935
            _evsql_query_free(query);
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   936
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   937
            conn->query = NULL;
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   938
        }
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   939
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   940
        // kill off the transaction
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   941
        if (conn->trans) {
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   942
            conn->trans->query = NULL;
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   943
            _evsql_trans_release(conn->trans);
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   944
        }
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   945
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   946
        // kill it off
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   947
        _evsql_conn_release(conn);
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   948
    }
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   949
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   950
    // then free the evsql itself
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   951
    free(evsql);
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   952
}
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   953
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   954
void _evsql_destroy_handler (int fd, short what, void *arg)
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   955
{
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   956
    struct evsql *evsql = arg;
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   957
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   958
    evsql_destroy(evsql);
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   959
}
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   960
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   961
evsql_err_t evsql_destroy_next (struct evsql *evsql)
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   962
{
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   963
    struct timeval tv = {0, 0};
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   964
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   965
    // schedule a one-time event
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   966
    return event_base_once(evsql->ev_base, 0, EV_TIMEOUT, &_evsql_destroy_handler, evsql, &tv);
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   967
}
83d53afa2551 implement evsql_destroy, although it's still not callable from any callbacks
Tero Marttila <terom@fixme.fi>
parents: 58
diff changeset
   968