doc/evsql.dox
author Tero Marttila <terom@fixme.fi>
Sat, 13 Dec 2008 20:32:17 +0200
branchnew-evsql
changeset 54 7dc8ff496da1
parent 53 0d6e07f4c9a1
child 55 0b92d553400a
permissions -rw-r--r--
evsql documentation further improved
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
54
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    27
@see \ref evsql_new_
53
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
54
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    38
@see \ref evsql_trans_
53
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
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
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    57
@section Parametrized Queries
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
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    61
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
    62
parameter types and values as arguments.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    63
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    64
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
    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
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    70
@section Query Results
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    71
Once a evsql_query completes (sucess or failure, unless the query/transaction is aborted), the query's callback is
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
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    77
@see \ref evsql_result_
7dc8ff496da1 evsql documentation further improved
Tero Marttila <terom@fixme.fi>
parents: 53
diff changeset
    78
53
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    79
@section API Reference
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    80
The entire API is defined in the top-level evsql.h header.
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    81
0d6e07f4c9a1 separate evsql documentation
Tero Marttila <terom@fixme.fi>
parents:
diff changeset
    82
*/