SOCI - The C++ Database Access Library

## Integration with Boost

The SOCI user code can be easily integrated with the Boost library thanks to the very flexible type conversion facility. There are three important Boost types that are supported out of the box.

#### boost::optional<T>

`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, ...>

`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.

Example:

    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
    }

#### boost::fusion::vector<T1, ...>

The `boost::fusion::vector` types are supported in the same way as tuples.

#### boost::gregorian::date

The `boost::gregorian::date` is provided as a conversion for base type `std::tm` and can be used as a replacement for it.

Optional integration:

The integration with Boost types is optional and not enabled by default, which means that SOCI can 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. Note that in this case the support for `boost::fusion::vector` is enabled only if the detected Boost version is at least 1.35.

Previous (Multithreading) | Next (Interfaces)

Copyright © 2004-2008 Maciej Sobczak, Stephen Hutton