aboutsummaryrefslogtreecommitdiff
path: root/odb/result.hxx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2010-11-22 12:03:11 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2010-11-22 12:03:11 +0200
commit531c792dd4eecd246cc1ccebac812d6888464a78 (patch)
tree9bed050c98a2c407c68e808ae1f1d296a65c5fee /odb/result.hxx
parent1cddfd09a7007f77fc243f178b1ca88ea4d0f4f6 (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.hxx43
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_;
};