diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-11-26 13:24:00 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-11-26 13:24:00 +0200 |
commit | ba8430c002627705d559b5dd9d78ae7611476520 (patch) | |
tree | d629a51b81ed279a40172869a9130ce3ddbbe09c /odb/mysql/object-statements.txx | |
parent | fba7f7853b4a9485fa2ee29189e4445252ccac97 (diff) |
Add support for recursive object loading
If an object of a type needs to be loaded recursively, then it is addded to
the delayed loading list which is processed once the statements are unlocked.
Diffstat (limited to 'odb/mysql/object-statements.txx')
-rw-r--r-- | odb/mysql/object-statements.txx | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/odb/mysql/object-statements.txx b/odb/mysql/object-statements.txx index 32d67f1..750fec2 100644 --- a/odb/mysql/object-statements.txx +++ b/odb/mysql/object-statements.txx @@ -6,13 +6,15 @@ #include <cstddef> // std::size_t #include <cstring> // std::memset +#include <odb/session.hxx> +#include <odb/exceptions.hxx> + +#include <odb/mysql/connection.hxx> + namespace odb { namespace mysql { - // object_statements - // - template <typename T> object_statements<T>:: object_statements (connection_type& conn) @@ -36,5 +38,46 @@ namespace odb for (std::size_t i (0); i < object_traits::out_column_count; ++i) out_image_bind_[i].error = out_image_error_ + i; } + + template <typename T> + 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_load l (delayed_.back ()); + typename object_cache_traits::insert_guard g (l.pos); + delayed_.pop_back (); + + if (!object_traits::find_ (*this, l.id)) + throw object_not_persistent (); + + object_traits::init (*l.obj, image (), db); + g.release (); + } + } + + template <typename T> + void object_statements<T>:: + clear_delayed_ () + { + // Remove the objects from the session cache. + // + if (session::has_current ()) + { + for (typename delayed_loads::iterator i (delayed_.begin ()), + e (delayed_.end ()); i != e; ++i) + { + object_cache_traits::erase (i->pos); + } + } + + delayed_.clear (); + } } } |