The SOCI user code can be easily integrated with the Boost library thanks to the very flexible type conversion facility.
The integration with Boost types is optional and is not enabled by default, which means that SOCI can also be compiled and used without any dependency on Boost.
In order to enable the support for any of the above types, the user needs to either include one of these headers:
#include <boost-optional.h>
#include <boost-tuple.h>
#include <boost-fusion.h>
#include <boost-gregorian-date.h>
or to define the SOCI_USE_BOOST
macro before including the soci.h
main header file.
boost::optional<T>
provides an alternative way to support the null data condition and as such relieves the user from necessity to handle separate indicator values.
The boost::optional<T>
objects can be used everywhere where the regular user provided values are expected.
Example:
boost::optional<string> name;
sql << "select name from person where id = 7", into(name);
if (name.is_initialized())
{
// OK, the name was retrieved and is not-null
cout << "The name is " << name.get();
}
else
{
// the name is null
}
The boost::optional<T>
objects are fully supported for both into
and use
elements, in both single and vector forms. They can be also used for user-defined data types.
boost::tuple<T1, ...>
allows to work with whole rows of information and in some cases can be more convenient to use than the more dynamically-oriented row
type.
boost::tuple<string, string, int> person;
sql << "select name, phone, salary from persons where ...",
into(person);
Tuples are supported for both into
and use
elements.
They can be used with rowset
as well.
Tuples can be also composed with boost::optional<T>
boost::tuple<string, boost::optional<string>, int> person;
sql << "select name, phone, salary from persons where ...",
into(person);
if (person.get<1>().is_initialized())
{
// the given person has a phone number
}
else
{
// this person does not have a phone number
}
The boost::fusion::vector
types are supported in the same way as tuples.
Note: Support for boost::fusion::vector
is enabled only if the detected Boost version is at least 1.35.
The boost::gregorian::date
is provided as a conversion for base type std::tm
and can be used as a replacement for it.