
/*! \page backendref Backends Reference

CppDB provides following SQL backends support

- \subpage mysql
- \subpage postgresql
- \subpage sqlite3
- \subpage odbc

*/

//---------------------------

/*! \page mysql MySQL Backend - "mysql"

MySQL backend allows to connect to MySQL database. It uses native MySQL C client API.


\section conn Connection String

The driver name is "mysql", cppdb::session::engine() returns "mysql"

Connection Properties are:

- \c host - the remote database host to connect. Default is local host.
- \c user - the user name to login
- \c password - the password to login
- \c database - the name of the database to use - default unspecified
- \c port - the port to connect - default unspecified
- \c unix_socket - the socket to connect - default unspecified

Additionaly you can customize the connection with MySQL option parameters.
Current list of options is specified in http://dev.mysql.com/doc/refman/5.5/en/mysql-options.html .
In CppDB, they are specified in lower case letters with \c mysql_ prefix removed.
Boolean values should be given as either 0 or 1. Options which take no arguments (e.g. opt_compress)
should be passed as a boolean with the value of 1. Example option string: 

\verbatim
mysql:user=test;password=test;opt_reconnect=1;opt_read_timeout=10;opt_compress=1
\endverbatim

\section impl Implementation Details

Prepared statements are implemented using mysql_stmt_* family API, while unprepared statements
use mysql_real_query API and explicit escaping using mysql_real_escape_string instead of parameter binding.

Because MySQL caches query results, it sometimes more efficient to use unprepared statements
rather then using prepared one that their results are not cached

Last insert row id is fetched using mysql_insert_id() and mysql_stmt_insert_id() API, the
name of the sequence is ignored.


*/

//---------------------------

/*! \page postgresql PostgreSQL Backend - "postgresql"

PostgreSQL backend allows to connect to PostgreSQL database. It uses libpq C client API.


\section conn Connection String

The driver name is "postgresql", cppdb::session::engine() returns "posgresql"

PostgreSQL connection properties are passed as it to libpq. So for full list you should refer to
the <a href="http://www.postgresql.org/docs/8.3/static/libpq-connect.html">libpq manual</a>

The most used properties are:

- \c host - the remote database host to connect. Default is local host.
- \c user - the user name to login
- \c password - the password to login
- \c dbname - the name of the database to use - default unspecified
- \c port - the port to connect - default unspecified

\subsection connspec Special Properties

PostgreSQL backend has additional internal property that define how to treat
blob objects: "@blob"

The possible values are:

- \c lo use large object API to store Blobs. This is the default.it adds a restriction to accessing large objects only withing transaction and handing their lifetime using <a href="http://www.postgresql.org/docs/8.3/static/lo.html">lo module</a>. This option has an advantage of small memory footprint when dealing with large objects as it does not require storing full object in memory.
- \c bytea - treat Blobs as bytea columns. This is simpler method but it is applicable only for objects that can fit to memory.


\section impl Implementation Details

Prepared statements are implemented using PQexecPrepared API, while unprepared statements
use PQexecParams API.

When using PostgreSQL large objects "@blob=lo" - the default - you should access them only during transaction, otherwise
the operations would fail. It is very good idea to use <a href="http://www.postgresql.org/docs/8.3/static/lo.html">lo module</a>
that helps handing object lifetime as cppdb backend is not aware of statement type you use and it can't decide whether
new object should be created in insert statement or same object should be updated. So "lo" module is your friend.

You may also use bytea if want to have a semantics similar to other RDBMSs Blobs.

Fetching last insert id should be done using non-empty sequence name, i.e. using cppdb::statement::sequence_last() and
it is fetched using "SELECT currval(?)" statement.


*/


//---------------------------

/*! \page sqlite3 SQlite3 Backend - "sqlite3"

SQlite3 backend allows to connect to SQlite3 database. It uses native SQlite3 C client API.


\section conn Connection String

The driver name is "sqlite3", cppdb::session::engine() returns "sqlite3"

Connection Properties are:

- \c db - the path to sqlite3 database file, special name ":memory:" can be used as well.
- \c mode - the mode to open connection with, one of "create", "readonly" and "readwrite", default is "create". The difference between 
  "readwrite" and "create" that if the database does not exist the connection fails.
- \c busy_timeout - the equivalent of \c sqlite3_busy_timeout function. Specifies the minimal number of milliseconds
  to wait before returning a error if the database is locked by another process. 
- \c vfs - the name of vfs to use

\section impl Implementation Details

Both prepared and not prepared statements are implemented using sqlite3_ API,
while unprepared statements just not getting cached unlike prepared ones.

Last insert row id is fetched using sqlite3_last_insert_rowid(), the
name of the sequence is ignored.


*/

//---------------------------

/*! \page odbc CppDB - ODBC bridge - "odbc"

ODBC backend allows to connect to almost any existing SQL database via ODBC driver and
provides much more convenient interface that ODBC C API.

Unlike other backends, this one is not loaded dynamically by default but rather linked directly
to cppdb library.

\section conn Connection String

The driver name is "odbc", but the cppdb::session::engine() returns "unknown" unless "@engine" property is specified.

Connection Properties are passed as is into ODBC connection string, so for example for connecting to some database
you may just simply specify:

\verbatim
odbc:DSN=MySource;UID=myuser;PWD=secret
\endverbatim

However there are several additional internal properties that define how cppdb treats the ODBC connection:

- \c \@engine - the type of underlying database engine, it allows the backend to customise the behavior and 
provide support for features missing in ODBC API itself.
\n
Currently following engine names provide additional values: "mysql", "sqlite3", "postgresql", "mssql". It allows
the driver to support cppdb::statement::sequence_last() or cppdb::statement::last_insert_id() functionality.
- \c \@utf - with options "narrow" - the default and "wide". This option specifies how to deal with Unicode. If the "narrow"
option is used (default) it would pass strings as is to the backend assuming that is supports UTF-8 natively using so 
called "ANSI" API , otherwise, it would use so called "Wide" API and convert the strings to UTF-16 and use wide character
functions.
\n
\note you should almost always use narrow option as most ODBC drivers support UTF-8 happily, however when you
work with MS SQL under windows you would probably want to use wide API for operation on strings.
- \c \@sequence_last - the SQL statement that is used for retrieving the last created id. You need to specify this if you
want to use cppdb::statement::sequence_last() or cppdb::statement::last_insert_id() and the engine is not one of mysql sqlite3, postgresql or mssql.
\n If the statement contains "?" mark the parameter of cppdb::statement::sequence_last() would be binded to it, otherwise the parameter is ignored.


\section impl Implementation Details

Both prepared statements use SQLPrepare API and unprepared statements use SQLExecDirect API. All data
is fetched using SQLGetData in order to support variable text length.

Following statements are used for fetching last insert id:

- \c sqlite3 - "select last_insert_rowid()"
- \c mysql - "select last_insert_id()"
- \c postgresql - "select currval(?)"
- \c mssql - "select @@identity"

If the engine is not one of the above and "@sequence_last" property is not defined the cppdb::not_supported_by_backend exception
would be thrown.

cppdb::session::escape() functionality is not supported as actual escaping rules vary by the specific RDBMS and attempt
to use them would cause cppdb::not_supported_by_backend exception.


*/


