diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2010-11-22 12:03:11 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2010-11-22 12:03:11 +0200 |
commit | 531c792dd4eecd246cc1ccebac812d6888464a78 (patch) | |
tree | 9bed050c98a2c407c68e808ae1f1d296a65c5fee /odb/result.hxx | |
parent | 1cddfd09a7007f77fc243f178b1ca88ea4d0f4f6 (diff) |
Add session, database operations on pointers and const objects
Currently, session is just an object cache. The persist, update, and
erase database operations are overloaded to also work on object
pointers. All the database operations and the query facility now
support const objects.
New session-related exceptions: not_in_session, already_in_session,
const_object.
Diffstat (limited to 'odb/result.hxx')
-rw-r--r-- | odb/result.hxx | 43 |
1 files changed, 33 insertions, 10 deletions
diff --git a/odb/result.hxx b/odb/result.hxx index 42acb0e..e87374e 100644 --- a/odb/result.hxx +++ b/odb/result.hxx @@ -30,15 +30,30 @@ namespace odb public: virtual ~result_impl (); - result_impl () : end_ (false), current_ () {} protected: friend class result<T>; friend class result_iterator<T>; - typedef object_traits<T> traits; - typedef typename traits::pointer_type pointer_type; - typedef typename traits::pointer_traits pointer_traits; + typedef odb::database database_type; + + typedef typename odb::object_traits<T>::pointer_type pointer_type; + typedef odb::pointer_traits<pointer_type> pointer_traits; + + typedef typename odb::object_traits<T>::object_type object_type; + typedef typename odb::object_traits<T>::id_type id_type; + typedef odb::object_traits<object_type> object_traits; + + result_impl (database_type& db) + : end_ (false), db_ (db), current_ () + { + } + + database_type& + database () const + { + return db_; + } // To make this work with all kinds of pointers (naked, std::auto_ptr, // shared), we need to make sure we don't make any copies of the @@ -62,7 +77,10 @@ namespace odb protected: virtual void - current (T&) = 0; + current (object_type&) = 0; + + virtual id_type + current_id () = 0; virtual void next () = 0; @@ -84,6 +102,7 @@ namespace odb bool end_; private: + database_type& db_; pointer_type current_; typename pointer_traits::guard_type guard_; }; @@ -98,6 +117,11 @@ namespace odb typedef std::ptrdiff_t difference_type; typedef std::input_iterator_tag iterator_category; + // T might be const T, but object_type is always T. + // + typedef typename object_traits<T>::object_type object_type; + typedef typename object_traits<T>::id_type id_type; + public: explicit result_iterator (result_impl<T>* res = 0) @@ -150,10 +174,7 @@ namespace odb } void - load (T& x) - { - res_->current (x); - } + load (object_type&); public: bool @@ -163,7 +184,9 @@ namespace odb } private: - typedef typename object_traits<T>::pointer_traits pointer_traits; + typedef + odb::pointer_traits<typename object_traits<T>::pointer_type> + pointer_traits; result_impl<T>* res_; }; |