doc/evsql.dox
author Tero Marttila <terom@fixme.fi>
Sat, 13 Dec 2008 19:55:50 +0200
branchnew-evsql
changeset 53 0d6e07f4c9a1
child 54 7dc8ff496da1
permissions -rw-r--r--
separate evsql documentation
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
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     5
@section Introduction
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     6
Evsql is a C-language SQL library designed for use with libevent, and primarily PostgreSQL's libpq.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     7
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
     8
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
     9
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
    10
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
    11
for parametrized queries and such along the way.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    12
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    13
The evsql API doesn't expose the underlying database library's API, although since the only currently existing
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    14
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
    15
database-agnostic API...
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    16
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    17
@section Usage
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    18
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
    19
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    20
@section Connecting
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    21
Evsql sessions are represented using an opaque struct, called simply evsql. Use the \ref evsql_ evsql_new_ function corresponding to your
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    22
database engine (PostgreSQL -> evsql_new_pq()) to allocate this handle. It is valid for use immediately, although the 
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    23
initial connection may not yet be complete.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    24
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    25
There is an evsql_close function, but it is currently not implemented.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    26
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    27
\ref evsql_
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    28
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    29
@section Transactions
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    30
Evsql supports both non-transactional queries and transactional queries. A transaction is allocated its own dedicated
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    31
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
    32
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
    33
"COMMIT TRANSACTION" and "ROLLBACK TRANSACTION" queries.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    34
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    35
Note, however, that transactions can only handle one outstanding query at a time, whereas transactionless queries can
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    36
be enqueued by evsql itself.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    37
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    38
\ref evsql_trans_
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    39
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    40
@section Querying
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    41
There is a single evsql_query function used for both transactional and non-transactional queries; you can pass NULL
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    42
as the trans argument.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    43
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    44
The given callback function is invoked once the query has been processed and the result is available, or the query
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    45
failed.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    46
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    47
The important distinction between transactional and non-transactional queries is that transactions only support one
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    48
outstanding query at a time, meaning that you must wait for your callback to be invoked before calling evsql_query
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    49
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
    50
execution if no idle connections are available.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    51
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    52
evsql_query returns a handle that can be passed to evsql_query_abort to abort the query, ensuring that the callback
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    53
given to evsql_query is not invoked, and any associated resources released.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    54
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    55
@section Parametrized Queries
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    56
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
    57
well. 
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    58
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    59
The first of these is evsql_query_params, which takes the parametrized SQL command and a struct containing the
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    60
parameter types and values as arguments.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    62
The second of these is evsql_query_exec, which takes a evsql_query_info struct containing the parametrized SQL command
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
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
    64
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    65
@section API Reference
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    66
The entire API is defined in the top-level evsql.h header.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    67
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    68
*/