diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2011-07-04 17:53:47 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2011-07-04 17:53:47 +0200 |
commit | 4eceea6c547240df49697f9d22ccaf4e9101b915 (patch) | |
tree | 6d91662f6d763c51f8e8bf4fe2af2d2aa845ea12 /odb/sqlite/object-statements.txx | |
parent | 83c2af51a362a7b90c7a581aaf3763dc18695a37 (diff) |
Implement support for database operations callbacks
New object pragma: callback. New test: common/callback. New manual
section: 10.1.4, "callback".
Diffstat (limited to 'odb/sqlite/object-statements.txx')
-rw-r--r-- | odb/sqlite/object-statements.txx | 25 |
1 files changed, 19 insertions, 6 deletions
diff --git a/odb/sqlite/object-statements.txx b/odb/sqlite/object-statements.txx index 53a157f..0ae9886 100644 --- a/odb/sqlite/object-statements.txx +++ b/odb/sqlite/object-statements.txx @@ -7,6 +7,7 @@ #include <cstring> // std::memset #include <odb/session.hxx> +#include <odb/callback.hxx> #include <odb/exceptions.hxx> #include <odb/sqlite/connection.hxx> @@ -43,22 +44,34 @@ namespace odb void object_statements<T>:: load_delayed_ () { - // We should be careful here: the delayed vector can change - // from under us as a result of a recursive load. - // database& db (connection ().database ()); - while (!delayed_.empty ()) + delayed_loads dls; + swap_guard sg (*this, dls); + + while (!dls.empty ()) { - delayed_load l (delayed_.back ()); + delayed_load l (dls.back ()); typename object_cache_traits::insert_guard g (l.pos); - delayed_.pop_back (); + dls.pop_back (); if (!object_traits::find_ (*this, l.id)) throw object_not_persistent (); + object_traits::callback (db, *l.obj, callback_event::pre_load); + + // Our calls to init/load below can result in additional delayed + // loads being added to the delayed_ vector. We need to process + // those before we call the post callback. + // object_traits::init (*l.obj, image (), db); object_traits::load_ (*this, *l.obj); // Load containers, etc. + + if (!delayed_.empty ()) + load_delayed_ (); + + object_traits::callback (db, *l.obj, callback_event::post_load); + g.release (); } } |