doc/evsql.dox
author Tero Marttila <terom@fixme.fi>
Sat, 13 Dec 2008 20:58:27 +0200
branchnew-evsql
changeset 55 0b92d553400a
parent 54 7dc8ff496da1
permissions -rw-r--r--
evsql: more improvements
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     1
/**
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     2
@mainpage evsql
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     3
@author Tero Marttila
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     4
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
     5
@section introduction Introduction
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
     6
Evsql is a C-language SQL library designed for use with <a href="http://monkey.org/~provos/libevent/">libevent</a>, 
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
     7
and primarily <a href="http://www.postgresql.org/">PostgreSQL</a>'s <a href="http://www.postgresql.org/docs/8.3/static/libpq.html">libpq</a>.
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     9
Evsql was born as a result of wanting to use a SQL database from within a libevent application, and discovering
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    10
libpq's asynchronous API. Since the libpq API is somewhat cumbersome to use, I wrote a separate interface that
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    11
drives libpq using libevent and makes writing asynchronous SQL clients a lot easier - plus adding some conveniance
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
for parametrized queries and such along the way.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    14
The evsql.h API doesn't expose the underlying database library's API, although since the only currently existing
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    15
implementation is libpq, this should really be thought of as a generically-named PostgreSQL library rather than a
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
database-agnostic API...
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    18
@section usage Usage
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    19
Include the top-level evsql.h header, making sure you also have the evpq and lib modules available.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    21
@section connecting Connecting
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    22
Evsql sessions are represented using an opaque struct, called simply evsql. Use the \ref evsql_ "evsql_new_*" function
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    23
corresponding to your database engine (PostgreSQL -> evsql_new_pq()) to allocate this handle. It is valid for use
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    24
immediately, although the initial connection may not yet be complete.
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    26
There is an evsql_close() function, but it is currently not implemented.
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
54
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    28
@see \ref evsql_new_
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    30
@section transactions Transactions
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    31
Evsql supports both non-transactional queries and transactional queries. A evsql_trans is allocated its own dedicated
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    32
connection which it can use for its queries without being interfered by other queries/transactions. Evsql takes care of
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    33
sending the initial "BEGIN TRANSACTION" query, and provides evsql_trans_commit()/evsql_trans_abort() functions to send the
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
"COMMIT TRANSACTION" and "ROLLBACK TRANSACTION" queries.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    36
@see evsql_trans()
54
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    37
@see \ref evsql_trans_
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    39
@section queries Querying
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    40
There is a single evsql_query() function used for both transactional and non-transactional queries; you can pass NULL
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    41
as the \a trans argument.
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    43
The given evsql_query_cb() callback function is invoked once the query has been processed and the evsql_result is
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    44
available, or the query failed.
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
The important distinction between transactional and non-transactional queries is that transactions only support one
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    47
outstanding query at a time, meaning that you must wait for your callback to be invoked before calling evsql_query()
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
again for the transaction. Non-transactional queries are sent using an idle connection, and will be enqueued for later
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
execution if no idle connections are available.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    50
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    51
evsql_query() returns an evsql_query handle that can be passed to evsql_query_abort() to abort the query, ensuring
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    52
that the evsql_query_cb() given to evsql_query() is not invoked, and any associated resources released.
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    54
@see evsql_query()
54
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    55
@see \ref evsql_query_
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    56
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    57
@section param_queries Parametrized Queries
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
Evsql also provides functions to send parametrized queries, the behaviour of evsql_query explained above applies as
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
well. 
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    61
The first of these is evsql_query_params(), which takes the parametrized SQL command and a evsql_query_params containing the
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
parameter types and values as arguments.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    64
The second of these is evsql_query_exec(), which takes a evsql_query_info struct containing the parametrized SQL command
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
and the parameter types, and the parameter values themselves as a list of variable arguments (of the correct type!).
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
54
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    67
@see \ref evsql_query_
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    68
@see \ref evsql_param_
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    69
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    70
@section query_results Query Results
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    71
Once a evsql_query completes (sucess or failure, unless the query/transaction is aborted), the query's evsql_query_cb() is
54
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    72
called. It receives a evsql_result handle, which can then be used with the \ref evsql_result_ "result interface" to
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    73
get information about the number of rows returned, access induvidual fields, iterate over the rows, etc. It is
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    74
important to note that the query callback is responsible for releasing the evsql_result using evsql_result_free() (or
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    75
equivalent) once it is done with it.
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    76
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    77
@see evsql_query_cb
54
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    78
@see \ref evsql_result_
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    79
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
@section API Reference
55
0b92d553400a evsql: more improvements
Tero Marttila <terom@fixme.fi>
parents: 54
diff changeset
    81
The entire API is defined in the top-level evsql.h header, divided into various groups.
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    83
*/