terom@25: #ifndef EVSQL_INTERNAL_H terom@25: #define EVSQL_INTERNAL_H terom@25: terom@25: #include terom@25: terom@25: #include "evsql.h" terom@25: terom@25: /* terom@25: * The engine type terom@25: */ terom@25: enum evsql_type { terom@25: EVSQL_EVPQ, // evpq terom@25: }; terom@25: terom@25: /* terom@25: * Contains the type, engine configuration, list of connections and waiting query queue. terom@25: */ terom@25: struct evsql { terom@25: // what event_base to use terom@25: struct event_base *ev_base; terom@25: terom@25: // what engine we use terom@25: enum evsql_type type; terom@25: terom@25: // callbacks terom@25: evsql_error_cb error_fn; terom@25: void *cb_arg; terom@25: terom@25: // engine-specific connection configuration terom@25: union { terom@25: const char *evpq; terom@25: } engine_conf; terom@25: terom@25: // list of connections that are open terom@25: LIST_HEAD(evsql_conn_list, evsql_conn) conn_list; terom@25: terom@25: // list of queries running or waiting to run terom@25: TAILQ_HEAD(evsql_query_queue, evsql_query) query_queue; terom@25: }; terom@25: terom@25: /* terom@25: * A single connection to the server. terom@25: * terom@25: * Contains the engine connection, may have a transaction associated, and may have a query associated. terom@25: */ terom@25: struct evsql_conn { terom@25: // evsql we belong to terom@25: struct evsql *evsql; terom@25: terom@25: // engine-specific connection info terom@25: union { terom@25: struct evpq_conn *evpq; terom@25: } engine; terom@25: terom@25: // our position in the conn list terom@25: LIST_ENTRY(evsql_conn) entry; terom@25: terom@25: // are we running a transaction? terom@25: struct evsql_trans *trans; terom@25: terom@25: // are we running a transactionless query? terom@25: struct evsql_query *query; terom@25: }; terom@25: terom@25: /* terom@25: * A single transaction. terom@25: * terom@25: * Has a connection associated and possibly a query (which will also be associated with the connection) terom@25: */ terom@25: struct evsql_trans { terom@25: // our evsql_conn/evsql terom@25: //struct evsql *evsql; terom@25: struct evsql_conn *conn; terom@25: terom@25: // callbacks terom@25: evsql_trans_error_cb error_fn; terom@25: evsql_trans_ready_cb ready_fn; terom@25: void *cb_arg; terom@25: terom@25: // the transaction type terom@25: enum evsql_trans_type type; terom@25: terom@25: // our current query terom@25: struct evsql_query *query; terom@25: terom@25: }; terom@25: terom@25: /* terom@25: * A single query. terom@25: * terom@25: * Has the info needed to exec the query (as these may be queued), and the callback/result info. terom@25: */ terom@25: struct evsql_query { terom@25: // the actual SQL query, this may or may not be ours, see _evsql_query_exec terom@25: char *command; terom@25: terom@25: // possible query params terom@25: struct evsql_query_param_info { terom@25: int count; terom@25: terom@25: Oid *types; terom@25: const char **values; terom@25: int *lengths; terom@25: int *formats; terom@25: terom@25: int result_format; terom@25: } params; terom@25: terom@25: // our callback terom@25: evsql_query_cb cb_fn; terom@25: void *cb_arg; terom@25: terom@25: // our position in the query list terom@25: TAILQ_ENTRY(evsql_query) entry; terom@25: terom@25: // the result terom@25: union { terom@25: PGresult *evpq; terom@25: } result; terom@25: }; terom@25: terom@25: // maximum length for a 'BEGIN TRANSACTION ...' query terom@25: #define EVSQL_QUERY_BEGIN_BUF 512 terom@25: terom@25: #endif /* EVSQL_INTERNAL_H */