src/evsql_internal.h
author Tero Marttila <terom@fixme.fi>
Sun, 12 Oct 2008 20:10:47 +0300
changeset 25 99a41f48e29b
child 26 61668c57f4bb
permissions -rw-r--r--
evsql transactions, it compiles...
#ifndef EVSQL_INTERNAL_H
#define EVSQL_INTERNAL_H

#include <sys/queue.h>

#include "evsql.h"

/*
 * The engine type
 */
enum evsql_type {
    EVSQL_EVPQ,     // evpq
};

/*
 * Contains the type, engine configuration, list of connections and waiting query queue.
 */
struct evsql {
    // what event_base to use
    struct event_base *ev_base;

    // what engine we use
    enum evsql_type type;

    // callbacks
    evsql_error_cb error_fn;
    void *cb_arg;
    
    // engine-specific connection configuration
    union {
        const char *evpq;
    } engine_conf;

    // list of connections that are open
    LIST_HEAD(evsql_conn_list, evsql_conn) conn_list;
   
    // list of queries running or waiting to run
    TAILQ_HEAD(evsql_query_queue, evsql_query) query_queue;
};

/*
 * A single connection to the server.
 *
 * Contains the engine connection, may have a transaction associated, and may have a query associated.
 */
struct evsql_conn {
    // evsql we belong to
    struct evsql *evsql;

    // engine-specific connection info
    union {
        struct evpq_conn *evpq;
    } engine;

    // our position in the conn list
    LIST_ENTRY(evsql_conn) entry;

    // are we running a transaction?
    struct evsql_trans *trans;

    // are we running a transactionless query?
    struct evsql_query *query;
};

/*
 * A single transaction.
 *
 * Has a connection associated and possibly a query (which will also be associated with the connection)
 */
struct evsql_trans {
    // our evsql_conn/evsql
    //struct evsql *evsql;
    struct evsql_conn *conn;
    
    // callbacks
    evsql_trans_error_cb error_fn;
    evsql_trans_ready_cb ready_fn;
    void *cb_arg;

    // the transaction type
    enum evsql_trans_type type;

    // our current query
    struct evsql_query *query;

};

/*
 * A single query.
 *
 * Has the info needed to exec the query (as these may be queued), and the callback/result info.
 */
struct evsql_query {
    // the actual SQL query, this may or may not be ours, see _evsql_query_exec
    char *command;
    
    // possible query params
    struct evsql_query_param_info {
        int count;

        Oid *types;
        const char **values;
        int *lengths;
        int *formats;

        int result_format;
    } params;

    // our callback
    evsql_query_cb cb_fn;
    void *cb_arg;

    // our position in the query list
    TAILQ_ENTRY(evsql_query) entry;

    // the result
    union {
        PGresult *evpq;
    } result;
};

// maximum length for a 'BEGIN TRANSACTION ...' query
#define EVSQL_QUERY_BEGIN_BUF 512

#endif /* EVSQL_INTERNAL_H */