// file : odb/oracle/view-result.txx // author : Constantin Michael // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // license : ODB NCUEL; see accompanying LICENSE file #include #include #include namespace odb { namespace oracle { template view_result_impl:: ~view_result_impl () { statements_.image ().change_callback_.callback = 0; delete image_copy_; } template view_result_impl:: view_result_impl (const query&, details::shared_ptr statement, view_statements& statements) : base_type (statements.connection ().database ()), statement_ (statement), statements_ (statements), use_copy_ (false), image_copy_ (0) { } template void view_result_impl:: load (view_type& view) { odb::database& db (this->database ()); view_traits::callback (db, view, callback_event::pre_load); if (use_copy_) view_traits::init (view, *image_copy_, db); else view_traits::init (view, statements_.image (), db); statement_->stream_result (); view_traits::callback (db, view, callback_event::post_load); } template void view_result_impl:: next () { this->current (pointer_type ()); typename view_traits::image_type& im (statements_.image ()); im.change_callback_.callback = 0; use_copy_ = false; if (im.version != statements_.image_version ()) { binding& b (statements_.image_binding ()); view_traits::bind (b.bind, im); statements_.image_version (im.version); b.version++; } if (statement_->fetch () == select_statement::no_data) this->end_ = true; else { im.change_callback_.callback = &change_callback; im.change_callback_.context = this; } } template void view_result_impl:: cache () { } template std::size_t view_result_impl:: size () { throw result_not_cached (); } template void view_result_impl:: change_callback (void* c) { view_result_impl* r (static_cast*> (c)); view_statements& stmts (r->statements_); if (r->image_copy_ == 0) r->image_copy_ = new typename view_traits::image_type (stmts.image ()); else *r->image_copy_ = stmts.image (); stmts.image_binding ().version++; stmts.image ().change_callback_.callback = 0; r->use_copy_ = true; } } }