Oracle ODB Runtime Library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
polymorphic-object-statements.hxx
Go to the documentation of this file.
1 // file : odb/oracle/polymorphic-object-statements.hxx
2 // copyright : Copyright (c) 2005-2013 Code Synthesis Tools CC
3 // license : ODB NCUEL; see accompanying LICENSE file
4 
5 #ifndef ODB_ORACLE_POLYMORPHIC_OBJECT_STATEMENTS_HXX
6 #define ODB_ORACLE_POLYMORPHIC_OBJECT_STATEMENTS_HXX
7 
8 #include <odb/pre.hxx>
9 
10 #include <cstddef> // std::size_t
11 
12 #include <odb/forward.hxx>
13 #include <odb/traits.hxx>
14 
15 #include <odb/details/shared-ptr.hxx>
16 
17 #include <odb/oracle/version.hxx>
18 #include <odb/oracle/forward.hxx>
20 #include <odb/oracle/binding.hxx>
21 #include <odb/oracle/statement.hxx>
24 
25 namespace odb
26 {
27  namespace oracle
28  {
29  //
30  // Implementation for polymorphic objects.
31  //
32 
33  template <typename T>
34  class polymorphic_root_object_statements: public object_statements<T>
35  {
36  public:
40 
41  typedef
42  typename object_traits::discriminator_image_type
44 
45  typedef
48 
49  public:
50  // Interface compatibility with derived_object_statements.
51  //
53 
56  {
57  return *this;
58  }
59 
60  public:
61  // Discriminator binding.
62  //
64  discriminator_image () {return discriminator_image_;}
65 
66  std::size_t
68  {return discriminator_image_version_;}
69 
70  void
72  {discriminator_image_version_ = v;}
73 
74  binding&
75  discriminator_image_binding () {return discriminator_image_binding_;}
76 
77  // Id binding for discriminator retrieval.
78  //
80  discriminator_id_image () {return discriminator_id_image_;}
81 
82  std::size_t
84  {return discriminator_id_image_version_;}
85 
86  void
88  {discriminator_id_image_version_ = v;}
89 
90  binding&
92  {return discriminator_id_image_binding_;}
93 
94  //
95  //
98  {
99  if (find_discriminator_ == 0)
100  find_discriminator_.reset (
101  new (details::shared) select_statement_type (
102  this->conn_,
103  object_traits::find_discriminator_statement,
104  false, // Doesn't need to be processed.
105  false, // Don't optimize.
106  discriminator_id_image_binding_,
107  discriminator_image_binding_,
108  0)); // No LOB prefetch (discriminator cannot be LOB).
109 
110  return *find_discriminator_;
111  }
112 
113  public:
115 
116  virtual
118 
119  // Static "override" (statements type).
120  //
121  void
123  {
124  assert (this->locked ());
125 
126  if (!this->delayed_.empty ())
127  this->template load_delayed_<polymorphic_root_object_statements> (
128  svm);
129  }
130 
131  public:
132  static const std::size_t id_column_count =
134 
135  static const std::size_t discriminator_column_count =
136  object_traits::discriminator_column_count;
137 
138  static const std::size_t managed_optimistic_column_count =
139  object_traits::managed_optimistic_column_count;
140 
141  private:
142  // Discriminator image.
143  //
144  discriminator_image_type discriminator_image_;
145  std::size_t discriminator_image_version_;
146  binding discriminator_image_binding_;
147  bind discriminator_image_bind_[discriminator_column_count +
149 
150  // Id image for discriminator retrieval (only used as a parameter).
151  //
152  id_image_type discriminator_id_image_;
153  std::size_t discriminator_id_image_version_;
154  binding discriminator_id_image_binding_;
155  bind discriminator_id_image_bind_[id_column_count];
156 
157  details::shared_ptr<select_statement_type> find_discriminator_;
158  };
159 
160  template <typename T>
162  {
163  public:
164  typedef T object_type;
166  typedef typename object_traits::id_type id_type;
168  typedef typename object_traits::id_image_type id_image_type;
169  typedef typename object_traits::image_type image_type;
170 
171  typedef typename object_traits::root_type root_type;
172  typedef
175 
176  typedef typename object_traits::base_type base_type;
177  typedef
178  typename object_traits::base_traits::statements_type
180 
181  typedef
182  typename object_traits::extra_statement_cache_type
184 
189 
191 
192  public:
194 
195  virtual
197 
198  public:
199  // Delayed loading.
200  //
201  static void
203  const id_type&,
204  root_type&,
205  const schema_version_migration*);
206 
207  public:
208  // Root and immediate base statements.
209  //
212  {
213  return root_statements_;
214  }
215 
218  {
219  return base_statements_;
220  }
221 
222  public:
223  // Object image.
224  //
225  image_type&
226  image ()
227  {
228  return image_;
229  }
230 
231  // Insert binding.
232  //
233  std::size_t
234  insert_image_version () const { return insert_image_version_;}
235 
236  void
237  insert_image_version (std::size_t v) {insert_image_version_ = v;}
238 
239  std::size_t
240  insert_id_binding_version () const { return insert_id_binding_version_;}
241 
242  void
243  insert_id_binding_version (std::size_t v) {insert_id_binding_version_ = v;}
244 
245  binding&
246  insert_image_binding () {return insert_image_binding_;}
247 
248  // Update binding.
249  //
250  std::size_t
251  update_image_version () const { return update_image_version_;}
252 
253  void
254  update_image_version (std::size_t v) {update_image_version_ = v;}
255 
256  std::size_t
257  update_id_binding_version () const { return update_id_binding_version_;}
258 
259  void
260  update_id_binding_version (std::size_t v) {update_id_binding_version_ = v;}
261 
262  binding&
263  update_image_binding () {return update_image_binding_;}
264 
265  // Select binding.
266  //
267  std::size_t*
268  select_image_versions () { return select_image_versions_;}
269 
270  binding*
271  select_image_bindings () {return select_image_bindings_;}
272 
273  binding&
274  select_image_binding (std::size_t d)
275  {
276  return select_image_bindings_[object_traits::depth - d];
277  }
278 
279  // Object id binding (comes from the root statements).
280  //
282  id_image () {return root_statements_.id_image ();}
283 
284  std::size_t
285  id_image_version () const {return root_statements_.id_image_version ();}
286 
287  void
288  id_image_version (std::size_t v) {root_statements_.id_image_version (v);}
289 
290  binding&
291  id_image_binding () {return root_statements_.id_image_binding ();}
292 
293  binding&
295  return root_statements_.optimistic_id_image_binding ();}
296 
297  // Statements.
298  //
301  {
302  if (persist_ == 0)
303  persist_.reset (
304  new (details::shared) insert_statement_type (
305  conn_,
306  object_traits::persist_statement,
307  object_traits::versioned, // Process if versioned.
308  insert_image_binding_,
309  false));
310 
311  return *persist_;
312  }
313 
315  find_statement (std::size_t d)
316  {
317  std::size_t i (object_traits::depth - d);
318  details::shared_ptr<select_statement_type>& p (find_[i]);
319 
320  if (p == 0)
321  p.reset (
322  new (details::shared) select_statement_type (
323  conn_,
324  object_traits::find_statements[i],
325  object_traits::versioned, // Process if versioned.
326  false, // Don't optimize.
327  root_statements_.id_image_binding (),
328  select_image_bindings_[i],
329  4096)); // Hardcode a 4kB LOB prefetch size.
330 
331  return *p;
332  }
333 
336  {
337  if (update_ == 0)
338  update_.reset (
339  new (details::shared) update_statement_type (
340  conn_,
341  object_traits::update_statement,
342  object_traits::versioned, // Process if versioned.
343  update_image_binding_));
344 
345  return *update_;
346  }
347 
350  {
351  if (erase_ == 0)
352  erase_.reset (
353  new (details::shared) delete_statement_type (
354  conn_,
355  object_traits::erase_statement,
356  root_statements_.id_image_binding ()));
357 
358  return *erase_;
359  }
360 
361  // Extra (container, section) statement cache.
362  //
365  {
366  return extra_statement_cache_.get (
367  conn_,
368  image_,
369  id_image_binding (),
370  &id_image_binding ()); // Note, not id+version.
371  }
372 
373  public:
374  // select = total - id - separate_load + base::select
375  // insert = total - inverse
376  // update = total - inverse - id - readonly - separate_update
377  //
378  static const std::size_t id_column_count =
379  object_traits::id_column_count;
380 
381  static const std::size_t select_column_count =
382  object_traits::column_count -
384  object_traits::separate_load_column_count +
385  base_statements_type::select_column_count;
386 
387  static const std::size_t insert_column_count =
388  object_traits::column_count -
389  object_traits::inverse_column_count;
390 
391  static const std::size_t update_column_count = insert_column_count -
392  object_traits::id_column_count -
393  object_traits::readonly_column_count -
394  object_traits::separate_update_column_count;
395 
396  private:
399 
401  operator= (const polymorphic_derived_object_statements&);
402 
403  private:
404  root_statements_type& root_statements_;
405  base_statements_type& base_statements_;
406 
408  extra_statement_cache_;
409 
410  image_type image_;
411 
412  // Select binding. Here we are have an array of statements/bindings
413  // one for each depth. In other words, if we have classes root, base,
414  // and derived, then we have the following array of statements:
415  //
416  // [0] d + b + r
417  // [1] d + b
418  // [2] d
419  //
420  // Also, because we have a chain of images bound to these statements,
421  // we have an array of versions, one entry for each base plus one for
422  // our own image.
423  //
424  // A poly-abstract class only needs the first statement and in this
425  // case we have only one entry in the the bindings and statements
426  // arrays (but not versions; we still have a chain of images).
427  //
428  std::size_t select_image_versions_[object_traits::depth];
429  binding select_image_bindings_[
430  object_traits::abstract ? 1 : object_traits::depth];
431  bind select_image_bind_[select_column_count];
432 
433  // Insert binding. The id binding is copied from the hierarchy root.
434  //
435  std::size_t insert_image_version_;
436  std::size_t insert_id_binding_version_;
437  binding insert_image_binding_;
438  bind insert_image_bind_[insert_column_count];
439 
440  // Update binding. The id suffix binding is copied from the hierarchy
441  // root.
442  //
443  std::size_t update_image_version_;
444  std::size_t update_id_binding_version_;
445  binding update_image_binding_;
446  bind update_image_bind_[update_column_count + id_column_count];
447 
448  details::shared_ptr<insert_statement_type> persist_;
449  details::shared_ptr<select_statement_type> find_[
450  object_traits::abstract ? 1 : object_traits::depth];
451  details::shared_ptr<update_statement_type> update_;
452  details::shared_ptr<delete_statement_type> erase_;
453  };
454  }
455 }
456 
457 #include <odb/oracle/polymorphic-object-statements.txx>
458 
459 #include <odb/post.hxx>
460 
461 #endif // ODB_ORACLE_POLYMORPHIC_OBJECT_STATEMENTS_HXX
oracle::insert_statement insert_statement_type
Definition: polymorphic-object-statements.hxx:185
static void delayed_loader(odb::database &, const id_type &, root_type &, const schema_version_migration *)
Definition: connection.hxx:35
object_traits::base_traits::statements_type base_statements_type
Definition: polymorphic-object-statements.hxx:179
void id_image_version(std::size_t v)
Definition: polymorphic-object-statements.hxx:288
void insert_image_version(std::size_t v)
Definition: polymorphic-object-statements.hxx:237
select_statement_type & find_statement(std::size_t d)
Definition: polymorphic-object-statements.hxx:315
static const std::size_t managed_optimistic_column_count
Definition: polymorphic-object-statements.hxx:138
object_statements< T >::connection_type connection_type
Definition: polymorphic-object-statements.hxx:37
object_statements< T >::object_traits object_traits
Definition: polymorphic-object-statements.hxx:38
binding * select_image_bindings()
Definition: polymorphic-object-statements.hxx:271
std::size_t discriminator_image_version() const
Definition: polymorphic-object-statements.hxx:67
T object_type
Definition: polymorphic-object-statements.hxx:164
std::size_t update_image_version() const
Definition: polymorphic-object-statements.hxx:251
std::size_t insert_image_version() const
Definition: polymorphic-object-statements.hxx:234
root_statements_type & root_statements()
Definition: polymorphic-object-statements.hxx:211
object_traits::discriminator_image_type discriminator_image_type
Definition: polymorphic-object-statements.hxx:43
Definition: statement.hxx:340
std::size_t discriminator_id_image_version() const
Definition: polymorphic-object-statements.hxx:83
discriminator_image_type & discriminator_image()
Definition: polymorphic-object-statements.hxx:64
extra_statement_cache_type & extra_statement_cache()
Definition: polymorphic-object-statements.hxx:364
id_image_type & id_image()
Definition: polymorphic-object-statements.hxx:282
bool locked() const
Definition: simple-object-statements.hxx:114
object_traits::base_type base_type
Definition: polymorphic-object-statements.hxx:176
object_traits::id_type id_type
Definition: polymorphic-object-statements.hxx:166
polymorphic_root_object_statements root_statements_type
Definition: polymorphic-object-statements.hxx:52
void discriminator_id_image_version(std::size_t v)
Definition: polymorphic-object-statements.hxx:87
select_statement_type & find_discriminator_statement()
Definition: polymorphic-object-statements.hxx:97
object_traits::pointer_type pointer_type
Definition: polymorphic-object-statements.hxx:167
oracle::select_statement select_statement_type
Definition: polymorphic-object-statements.hxx:186
access::object_traits< T >::pointer_type pointer_type
binding & select_image_binding(std::size_t d)
Definition: polymorphic-object-statements.hxx:274
static const std::size_t id_column_count
Definition: polymorphic-object-statements.hxx:378
image_type & image()
Definition: polymorphic-object-statements.hxx:226
binding & id_image_binding()
Definition: polymorphic-object-statements.hxx:291
base_statements_type & base_statements()
Definition: polymorphic-object-statements.hxx:217
object_traits::extra_statement_cache_type extra_statement_cache_type
Definition: polymorphic-object-statements.hxx:183
insert_statement_type & persist_statement()
Definition: polymorphic-object-statements.hxx:300
delete_statement_type & erase_statement()
Definition: polymorphic-object-statements.hxx:349
Definition: statement.hxx:316
object_traits::id_image_type id_image_type
Definition: polymorphic-object-statements.hxx:168
std::size_t update_id_binding_version() const
Definition: polymorphic-object-statements.hxx:257
id_image_type & discriminator_id_image()
Definition: polymorphic-object-statements.hxx:80
void update_id_binding_version(std::size_t v)
Definition: polymorphic-object-statements.hxx:260
Definition: statement.hxx:169
oracle::delete_statement delete_statement_type
Definition: polymorphic-object-statements.hxx:188
static const std::size_t insert_column_count
Definition: polymorphic-object-statements.hxx:387
connection_type & conn_
Definition: statements-base.hxx:56
Definition: binding.hxx:21
root_statements_type & root_statements()
Definition: polymorphic-object-statements.hxx:55
binding & id_image_binding()
Definition: simple-object-statements.hxx:335
polymorphic_root_object_statements< root_type > root_statements_type
Definition: polymorphic-object-statements.hxx:174
std::size_t insert_id_binding_version() const
Definition: polymorphic-object-statements.hxx:240
Definition: oracle-types.hxx:78
void load_delayed(const schema_version_migration *svm)
Definition: polymorphic-object-statements.hxx:122
binding & update_image_binding()
Definition: polymorphic-object-statements.hxx:263
std::size_t * select_image_versions()
Definition: polymorphic-object-statements.hxx:268
binding & discriminator_image_binding()
Definition: polymorphic-object-statements.hxx:75
static const std::size_t select_column_count
Definition: polymorphic-object-statements.hxx:381
object_statements< T >::select_statement_type select_statement_type
Definition: polymorphic-object-statements.hxx:47
std::size_t id_image_version() const
Definition: polymorphic-object-statements.hxx:285
object_statements< T >::id_image_type id_image_type
Definition: polymorphic-object-statements.hxx:39
update_statement_type & update_statement()
Definition: polymorphic-object-statements.hxx:335
static const std::size_t discriminator_column_count
Definition: polymorphic-object-statements.hxx:135
oracle::update_statement update_statement_type
Definition: polymorphic-object-statements.hxx:187
delayed_loads delayed_
Definition: simple-object-statements.hxx:543
binding & discriminator_id_image_binding()
Definition: polymorphic-object-statements.hxx:91
static const std::size_t id_column_count
Definition: polymorphic-object-statements.hxx:132
binding & insert_image_binding()
Definition: polymorphic-object-statements.hxx:246
Definition: statement.hxx:254
void discriminator_image_version(std::size_t v)
Definition: polymorphic-object-statements.hxx:71
std::size_t id_image_version() const
Definition: simple-object-statements.hxx:329
id_image_type & id_image()
Definition: simple-object-statements.hxx:326
T & get(connection_type &c, image_type &im, binding &id, binding *idv)
Definition: simple-object-statements.hxx:56
Definition: simple-object-statements.hxx:205
object_traits_impl< object_type, id_oracle > object_traits
Definition: polymorphic-object-statements.hxx:165
static const std::size_t update_column_count
Definition: polymorphic-object-statements.hxx:391
object_traits::root_type root_type
Definition: polymorphic-object-statements.hxx:171
object_traits::image_type image_type
Definition: polymorphic-object-statements.hxx:169
root_statements_type::auto_lock auto_lock
Definition: polymorphic-object-statements.hxx:190
object_traits::id_image_type id_image_type
Definition: simple-object-statements.hxx:188
binding & optimistic_id_image_binding()
Definition: polymorphic-object-statements.hxx:294
Definition: statements-base.hxx:23
binding & optimistic_id_image_binding()
Definition: simple-object-statements.hxx:342
Definition: forward.hxx:55
void insert_id_binding_version(std::size_t v)
Definition: polymorphic-object-statements.hxx:243
void update_image_version(std::size_t v)
Definition: polymorphic-object-statements.hxx:254