Warning, /sdk/codevis/thirdparty/soci/docs/backends/sqlite3.md is written in an unsupported language. File is not indexed.
0001 # SQLite3 Backend Reference
0002
0003 SOCI backend for accessing SQLite 3 database.
0004
0005 ## Prerequisites
0006
0007 ### Supported Versions
0008
0009 The SOCI SQLite3 backend is supported for use with SQLite3 >= 3.1
0010
0011 ### Tested Platforms
0012
0013 |SQLite3|OS|Compiler|
0014 |--- |--- |--- |
0015 |3.12.1|Windows Server 2016|MSVC++ 14.1|
0016 |3.12.1|Windows Server 2012 R2|MSVC++ 14.0|
0017 |3.12.1|Windows Server 2012 R2|MSVC++ 12.0|
0018 |3.12.1|Windows Server 2012 R2|MSVC++ 11.0|
0019 |3.12.1|Windows Server 2012 R2|Mingw-w64/GCC 4.8|
0020 |3.7.9|Ubuntu 12.04|g++ 4.6.3|
0021 |3.4.0|Windows XP|(cygwin) g++ 3.4.4|
0022 |3.4.0|Windows XP|Visual C++ 2005 Express Edition|
0023 |3.3.8|Windows XP|Visual C++ 2005 Professional|
0024 |3.5.2|Mac OS X 10.5|g++ 4.0.1|
0025 |3.3.4|Ubuntu 5.1|g++ 4.0.2|
0026 |3.3.4|Windows XP|(cygwin) g++ 3.3.4|
0027 |3.3.4|Windows XP|Visual C++ 2005 Express Edition|
0028 |3.2.1|Linux i686 2.6.10-gentoo-r6|g++ 3.4.5|
0029 |3.1.3|Mac OS X 10.4|g++ 4.0.1|
0030 |3.24.0|macOS High Sierra 10.13.5|AppleClang 9.1.0.9020039|
0031
0032 ### Required Client Libraries
0033
0034 The SOCI SQLite3 backend requires SQLite3's `libsqlite3` client library.
0035
0036 ### Connecting to the Database
0037
0038 To establish a connection to the SQLite3 database, create a Session object using the `SQLite3` backend factory together with the database file name:
0039
0040 ```cpp
0041 session sql(sqlite3, "database_filename");
0042
0043 // or:
0044
0045 session sql("sqlite3", "db=db.sqlite timeout=2 shared_cache=true");
0046 ```
0047
0048 The set of parameters used in the connection string for SQLite is:
0049
0050 * `dbname` or `db`
0051 * `timeout` - set sqlite busy timeout (in seconds) ([link](http://www.sqlite.org/c3ref/busy_timeout.html))
0052 * `readonly` - open database in read-only mode instead of the default read-write (note that the database file must already exist in this case, see [the documentation](https://www.sqlite.org/c3ref/open.html))
0053 * `nocreate` - open an existing database without creating a new one if it doesn't already exist (by default, a new database file is created).
0054 * `synchronous` - set the pragma synchronous flag ([link](http://www.sqlite.org/pragma.html#pragma_synchronous))
0055 * `shared_cache` - should be `true` ([link](http://www.sqlite.org/c3ref/enable_shared_cache.html))
0056 * `vfs` - set the SQLite VFS used to as OS interface. The VFS should be registered before opening the connection, see [the documenation](https://www.sqlite.org/vfs.html)
0057 * `foreign_keys` - set the pragma foreign_keys flag ([link](https://www.sqlite.org/pragma.html#pragma_foreign_keys)).
0058
0059 Once you have created a `session` object as shown above, you can use it to access the database, for example:
0060
0061 ```cpp
0062 int count;
0063 sql << "select count(*) from invoices", into(count);
0064 ```
0065
0066 (See the [connection](../connections.md) and [data binding](../binding.md) documentation for general information on using the `session` class.)
0067
0068 ## SOCI Feature Support
0069
0070 ### Dynamic Binding
0071
0072 The SQLite3 backend supports the use of the SOCI `row` class, which facilitates retrieval of data whose type is not known at compile time.
0073
0074 When calling `row::get<T>()`, the type you should pass as T depends upon the underlying database type.
0075
0076 For the SQLite3 backend, this type mapping is complicated by the fact the SQLite3 does not enforce [types][INTEGER_PRIMARY_KEY] and makes no attempt to validate the type names used in table creation or alteration statements. SQLite3 will return the type as a string, SOCI will recognize the following strings and match them the corresponding SOCI types:
0077
0078 |SQLite3 Data Type|SOCI Data Type|`row::get<T>` specializations|
0079 |--- |--- |--- |
0080 |*float*, *double*|dt_double|double|
0081 |*int8*, *bigint*|dt_long_long|long long|
0082 |*unsigned big int*|dt_unsigned_long_long|unsigned long long|
0083 |*int*, *boolean*|dt_integer|int|
0084 |*text, *char*|dt_string|std::string|
0085 |*date*, *time*|dt_date|std::tm|
0086
0087 [INTEGER_PRIMARY_KEY] : There is one case where SQLite3 enforces type. If a column is declared as "integer primary key", then SQLite3 uses that as an alias to the internal ROWID column that exists for every table. Only integers are allowed in this column.
0088
0089 (See the [dynamic resultset binding](../types.md#dynamic-binding) documentation for general information on using the `row` class.)
0090
0091 ### Binding by Name
0092
0093 In addition to [binding by position](../binding.md#binding-by-position), the SQLite3 backend supports [binding by name](../binding.md#binding-by-name), via an overload of the `use()` function:
0094
0095 ```cpp
0096 int id = 7;
0097 sql << "select name from person where id = :id", use(id, "id")
0098 ```
0099
0100 The backend also supports the SQLite3 native numbered syntax, "one or more literals can be replace by a parameter "?" or ":AAA" or "@AAA" or "$VVV" where AAA is an alphanumeric identifier and VVV is a variable name according to the syntax rules of the TCL programming language." [[1]](http://www.sqlite.org/capi3ref.html#sqlite3_bind_int):
0101
0102 ```cpp
0103 int i = 7;
0104 int j = 8;
0105 sql << "insert into t(x, y) values(?, ?)", use(i), use(j);
0106 ```
0107
0108 ### Bulk Operations
0109
0110 The SQLite3 backend has full support for SOCI's [bulk operations](../binding.md#bulk-operations) interface. However, this support is emulated and is not native.
0111
0112 ### Transactions
0113
0114 [Transactions](../transactions.md) are also fully supported by the SQLite3 backend.
0115
0116 ### BLOB Data Type
0117
0118 The SQLite3 backend supports working with data stored in columns of type Blob, via SOCI's [BLOB](../lobs.md) class. Because of SQLite3 general typelessness the column does not have to be declared any particular type.
0119
0120 ### RowID Data Type
0121
0122 In SQLite3 RowID is an integer. "Each entry in an SQLite table has a unique integer key called the "rowid". The rowid is always available as an undeclared column named ROWID, OID, or _ROWID_. If the table has a column of type INTEGER PRIMARY KEY then that column is another an alias for the rowid."[[2]](http://www.sqlite.org/capi3ref.html#sqlite3_last_insert_rowid)
0123
0124 ### Nested Statements
0125
0126 Nested statements are not supported by SQLite3 backend.
0127
0128 ### Stored Procedures
0129
0130 Stored procedures are not supported by SQLite3 backend
0131
0132 ## Native API Access
0133
0134 SOCI provides access to underlying datbabase APIs via several `get_backend()` functions, as described in the [beyond SOCI](../beyond.md) documentation.
0135
0136 The SQLite3 backend provides the following concrete classes for navite API access:
0137
0138 |Accessor Function|Concrete Class|
0139 |--- |--- |
0140 |session_backend* session::get_backend()|sqlie3_session_backend|
0141 |statement_backend* statement::get_backend()|sqlite3_statement_backend|
0142 |rowid_backend* rowid::get_backend()|sqlite3_rowid_backend|
0143
0144 ## Backend-specific extensions
0145
0146 ### SQLite3 result code support
0147
0148 SQLite3 result code is provided via the backend specific `sqlite3_soci_error` class. Catching the backend specific error yields the value of SQLite3 result code via the `result()` method.
0149
0150 ## Configuration options
0151
0152 None