Warning, /sdk/codevis/thirdparty/soci/docs/backends/postgresql.md is written in an unsupported language. File is not indexed.

0001 # PostgreSQL Backend Reference
0002 
0003 SOCI backend for accessing PostgreSQL database.
0004 
0005 ## Prerequisites
0006 
0007 ### Supported Versions
0008 
0009 The SOCI PostgreSQL backend is supported for use with PostgreSQL >= 7.3, although versions older than 8.0 will suffer from limited feature support. See below for details.
0010 
0011 ### Tested Platforms
0012 
0013 |PostgreSQL|OS|Compiler|
0014 |--- |--- |--- |
0015 |9.6|Windows Server 2016|MSVC++ 14.1|
0016 |9.4|Windows Server 2012 R2|MSVC++ 14.0|
0017 |9.4|Windows Server 2012 R2|MSVC++ 12.0|
0018 |9.4|Windows Server 2012 R2|MSVC++ 11.0|
0019 |9.4|Windows Server 2012 R2|Mingw-w64/GCC 4.8|
0020 |9.3|Ubuntu 12.04|g++ 4.6.3|
0021 |9.0|Mac OS X 10.6.6|g++ 4.2|
0022 |8.4|FreeBSD 8.2|g++ 4.1|
0023 |8.4|Debian 6|g++ 4.3|
0024 |8.4|RedHat 5|g++ 4.3|
0025 |10.03|macOS High Sierra 10.13.5|AppleClang 9.1.0.9020039|
0026 
0027 ### Required Client Libraries
0028 
0029 The SOCI PostgreSQL backend requires PostgreSQL's `libpq` client library.
0030 
0031 Note that the SOCI library itself depends also on `libdl`, so the minimum set of libraries needed to compile a basic client program is:
0032 
0033 ```console
0034 -lsoci_core -lsoci_postgresql -ldl -lpq
0035 ```
0036 
0037 ### Connecting to the Database
0038 
0039 To establish a connection to the PostgreSQL database, create a `session` object using the `postgresql` backend factory together with a connection string:
0040 
0041 ```cpp
0042 session sql(postgresql, "dbname=mydatabase");
0043 
0044 // or:
0045 session sql("postgresql", "dbname=mydatabase");
0046 
0047 // or:
0048 session sql("postgresql://dbname=mydatabase");
0049 ```
0050 
0051 The set of parameters used in the connection string for PostgreSQL is the same as accepted by the [PQconnectdb](http://www.postgresql.org/docs/8.3/interactive/libpq.html#LIBPQ-CONNECT) function from the `libpq` library.
0052 
0053 In addition to standard PostgreSQL connection parameters, the following can be set:
0054 
0055 * `singlerow` or `singlerows`
0056 
0057 For example:
0058 
0059 ```cpp
0060 session sql(postgresql, "dbname=mydatabase singlerows=true");
0061 ```
0062 
0063 If the `singlerows` parameter is set to `true` or `yes`, then queries will be executed in the single-row mode, which prevents the client library from loading full query result sets into memory and instead fetches rows one by one, as they are requested by the statement's fetch() function. This mode can be of interest to those users who want to make their client applications more responsive (with more fine-grained operation) by avoiding potentially long blocking times when complete query results are loaded to client's memory.
0064 Note that in the single-row operation:
0065 
0066 * bulk queries are not supported, and
0067 * in order to fulfill the expectations of the underlying client library, the complete rowset has to be exhausted before executing further queries on the same session.
0068 
0069 Also please note that single rows mode requires PostgreSQL 9 or later, both at
0070 compile- and run-time. If you need to support earlier versions of PostgreSQL,
0071 you can define `SOCI_POSTGRESQL_NOSINGLEROWMODE` when building the library to
0072 disable it.
0073 
0074 Once you have created a `session` object as shown above, you can use it to access the database, for example:
0075 
0076 ```cpp
0077 int count;
0078 sql << "select count(*) from invoices", into(count);
0079 ```
0080 
0081 (See the [connection](../connections.md) and [data binding](../binding.md) documentation for general information on using the `session` class.)
0082 
0083 ## SOCI Feature Support
0084 
0085 ### Dynamic Binding
0086 
0087 The PostgreSQL backend supports the use of the SOCI `row` class, which facilitates retrieval of data whose type is not known at compile time.
0088 
0089 When calling `row::get<T>()`, the type you should pass as `T` depends upon the underlying database type. For the PostgreSQL backend, this type mapping is:
0090 
0091 |PostgreSQL Data Type|SOCI Data Type|`row::get<T>` specializations|
0092 |--- |--- |--- |
0093 |numeric, real, double|dt_double|double|
0094 |boolean, smallint, integer|dt_integer|int|
0095 |int8|dt_long_long|long long|
0096 |oid|dt_integer|unsigned long|
0097 |char, varchar, text, cstring, bpchar|dt_string|std::string|
0098 |abstime, reltime, date, time, timestamp, timestamptz, timetz|dt_date|std::tm|
0099 
0100 (See the [dynamic resultset binding](../types.md#dynamic-binding) documentation for general information on using the `row` class.)
0101 
0102 ### Binding by Name
0103 
0104 In addition to [binding by position](../binding.md#binding-by-position), the PostgreSQL backend supports [binding by name](../binding.md#binding-by-name), via an overload of the `use()` function:
0105 
0106 ```cpp
0107 int id = 7;
0108 sql << "select name from person where id = :id", use(id, "id")
0109 ```
0110 
0111 ### Bulk Operations
0112 
0113 The PostgreSQL backend has full support for SOCI's [bulk operations](../binding.md#bulk-operations) interface.
0114 
0115 ### Transactions
0116 
0117 [Transactions](../transactions.md) are also fully supported by the PostgreSQL backend.
0118 
0119 ### blob Data Type
0120 
0121 The PostgreSQL backend supports working with data stored in columns of type Blob, via SOCI's [blob](../lobs.md) class with the exception that trimming is not supported.
0122 
0123 ### rowid Data Type
0124 
0125 The concept of row identifier (OID in PostgreSQL) is supported via SOCI's [rowid](../api/client.md#class-rowid) class.
0126 
0127 ### Nested Statements
0128 
0129 Nested statements are not supported by PostgreSQL backend.
0130 
0131 ### Stored Procedures
0132 
0133 PostgreSQL stored procedures can be executed by using SOCI's [procedure](../procedures.md) class.
0134 
0135 ## Native API Access
0136 
0137 SOCI provides access to underlying database APIs via several `get_backend()` functions, as described in the [beyond SOCI](../beyond.md) documentation.
0138 
0139 The PostgreSQL backend provides the following concrete classes for native API access:
0140 
0141 |Accessor Function|Concrete Class|
0142 |--- |--- |
0143 |session_backend * session::get_backend()|postgresql_session_backend|
0144 |statement_backend * statement::get_backend()|postgresql_statement_backend|
0145 |blob_backend * blob::get_backend()|postgresql_blob_backend|
0146 |rowid_backend * rowid::get_backend()|postgresql_rowid_backend|
0147 
0148 ## Backend-specific extensions
0149 
0150 ### uuid Data Type
0151 
0152 The PostgreSQL backend supports working with data stored in columns of type UUID via simple string operations. All string representations of UUID supported by PostgreSQL are accepted on input, the backend will return the standard
0153 format of UUID on output. See the test `test_uuid_column_type_support` for usage examples.
0154 
0155 ## Configuration options
0156 
0157 To support older PostgreSQL versions, the following configuration macros are recognized:
0158 
0159 * `SOCI_POSTGRESQL_NOSINLGEROWMODE` - disable single mode retrieving query results row-by-row. It is necessary for PostgreSQL prior to version 9.