From be5909a7fc240c007bb0128353d493af947a8749 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Tue, 22 Mar 2011 16:22:06 +0200 Subject: Add object and container statement caches --- odb/sqlite/object-statements.txx | 77 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 odb/sqlite/object-statements.txx (limited to 'odb/sqlite/object-statements.txx') diff --git a/odb/sqlite/object-statements.txx b/odb/sqlite/object-statements.txx new file mode 100644 index 0000000..88b99e8 --- /dev/null +++ b/odb/sqlite/object-statements.txx @@ -0,0 +1,77 @@ +// file : odb/sqlite/object-statements.txx +// author : Boris Kolpackov +// copyright : Copyright (c) 2005-2011 Code Synthesis Tools CC +// license : GNU GPL v2; see accompanying LICENSE file + +#include // std::size_t +#include // std::memset + +#include +#include + +#include + +namespace odb +{ + namespace sqlite + { + template + object_statements:: + object_statements (connection_type& conn) + : object_statements_base (conn), + container_statement_cache_ (conn), + in_image_binding_ (in_image_bind_, object_traits::in_column_count), + out_image_binding_ (out_image_bind_, object_traits::out_column_count), + id_image_binding_ (in_image_bind_ + object_traits::in_column_count, 1) + { + std::memset (in_image_bind_, 0, sizeof (in_image_bind_)); + std::memset (out_image_bind_, 0, sizeof (out_image_bind_)); + std::memset (out_image_truncated_, 0, sizeof (out_image_truncated_)); + + for (std::size_t i (0); i < object_traits::out_column_count; ++i) + out_image_bind_[i].truncated = out_image_truncated_ + i; + } + + template + void object_statements:: + 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); + object_traits::load_ (*this, *l.obj); // Load containers, etc. + g.release (); + } + } + + template + void object_statements:: + 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 (); + } + } +} -- cgit v1.1