ODB 1.2.0 released
Wednesday, March 16th, 2011ODB 1.2.0 was released today. In case you are not familiar with ODB, it is an object-relational mapping (ORM) system for C++. It allows you to persist C++ objects to a relational database without having to deal with tables, columns, or SQL, or manually writing any of the mapping code.
This version includes a number of major new features, small improvements, and bug fixes. For an exhaustive list of changes see the official ODB 1.2.0 release announcement. In this post I am going to examine the most notable new features in more detail.
But before we move to the technical matters, I would like to make a different kind of announcement: Constantin Michael has joined the ODB development team. For this release he focused on the Boost profile, discussed next.
Boost profile
You might have noticed that the previous release added profiles as a new feature. We didn’t discuss it much then because there were no profile implementations available at that time. It was just the ODB compiler infrastructure that we were preparing for the first profile implementation. Well, the 1.2.0 release adds the first profile implementation to ODB: the Boost profile.
ODB profiles are a generic mechanism for integrating ODB with widely-used C++ frameworks and libraries. A profile provides glue code which allows us to seamlessly persist various components, such as smart pointers, containers, and value types found in these frameworks and libraries.
In this initial release the Boost profile covers the most commonly used types from the smart_ptr
, unordered
, and date_time
Boost libraries. For example, now we can write:
#pragma db object class employee { ... boost::gregorian::date born_; boost::unordered_set<std::string> emails_; boost::shared_ptr<employer> employer_; };
As is evident from the code fragment above, we don’t need to do anything special to use Boost types in our persistent classes. Are there any other actions that we need to perform for the above code to work?
As mentioned above, ODB profiles are a generic mechanism that can be used to integrate ODB with a type-system of any third-party library. For example, we are currently working on another profile, this time for the Qt framework. So the ODB compiler and its runtime library don’t know anything about, say, Boost or Qt. Rather, they provide general integration support. The code that is necessary to implement a profile is packaged into a separate library called a profile library. The Boost profile implementation is provided by the libodb-boost
profile library.
Now, back to our question. What do we need to do to be able to write the above code in an application that uses ODB? There are three simple steps:
- Download and build the profile library.
- Specify the profile you would like to use when invoking the ODB compiler. For example:
odb -d mysql --profile boost employee.hxx
- Link the profile library to your application.
And that’s it. That’s all we need to do. For more detailed information on ODB profiles in general refer to Chapter 11, “Profiles Introduction” in the ODB Manual. For more information on the Boost profile see Chapter 12, “Boost Profile”.
Embedded database schema
ODB now supports embedding the database schema into the generated C++ code in addition to generating the schema as a standalone SQL file. The new ODB compiler option that allows you to select between the two approaches is --schema-format
. For example:
odb -d mysql --generate-schema --schema-format embedded ...
The API usage for creating the database schema from within the application looks like this:
#include <odb/schema-catalog.hxx> database& db = ... transaction t (db.begin ()); schema_catalog::create_schema (db); t.commit ();
For more details refer to Section 3.3, “Database” in the ODB Manual as well as the schema/embedded
example in the odb-examples
package.
There are also other important features in this release, including, transparent database reconnection, recoverable exceptions (connection_lost
, timeout
, and deadlock
), and support for the default ODB compiler options file which can be used for installation-wide customizations. Refer to the official ODB 1.2.0 release announcement for more details on these and other features.