Oracle ODB Runtime Library
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
query.hxx
Go to the documentation of this file.
1 // file : odb/oracle/query.hxx
2 // copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC
3 // license : ODB NCUEL; see accompanying LICENSE file
4 
5 #ifndef ODB_ORACLE_QUERY_HXX
6 #define ODB_ORACLE_QUERY_HXX
7 
8 #include <odb/pre.hxx>
9 
10 #include <string>
11 #include <vector>
12 #include <cstddef> // std::size_t
13 
14 #include <odb/forward.hxx> // odb::query_column
15 #include <odb/query.hxx>
16 
17 #include <odb/oracle/version.hxx>
18 #include <odb/oracle/forward.hxx>
19 #include <odb/oracle/traits.hxx>
20 #include <odb/oracle/binding.hxx>
21 
22 #include <odb/details/buffer.hxx>
23 #include <odb/details/shared-ptr.hxx>
24 
25 #include <odb/oracle/details/export.hxx>
26 #include <odb/oracle/details/conversion.hxx>
27 
28 namespace odb
29 {
30  namespace oracle
31  {
32  // For both precision and scale 0 is a valid value. Furthermore,
33  // scale can be negative. To indicate that these values are not
34  // specified, we will use 0xFFF which is out of range for both
35  // precision (0 to 4000) and scale (-84 to 127). Note also that
36  // string size (stored in precision) is always in bytes. If a
37  // national string size is specified as a number of characters
38  // and not bytes, then this will be a conservative estimate (4
39  // bytes per character).
40  //
41  template <typename T>
42  struct val_bind
43  {
44  typedef const T& type;
45 
46  explicit
47  val_bind (type v, unsigned short p = 0xFFF, short s = 0xFFF)
48  : val (v), prec (p), scale (s) {}
49 
51 
52  unsigned short prec;
53  short scale;
54  };
55 
56  template <typename T, std::size_t N>
57  struct val_bind<T[N]>
58  {
59  typedef const T* type;
60 
61  explicit
62  val_bind (type v, unsigned short p = 0xFFF, short s = 0xFFF)
63  : val (v), prec (p), scale (s) {}
64 
66 
67  unsigned short prec;
68  short scale;
69  };
70 
71  template <typename T>
72  struct ref_bind
73  {
74  typedef const T& type;
75 
76  explicit
77  ref_bind (type r, unsigned short p = 0xFFF, short s = 0xFFF)
78  : ref (r), prec (p), scale (s) {}
79 
80  const void*
81  ptr () const {return &ref;}
82 
84 
85  unsigned short prec;
86  short scale;
87  };
88 
89  template <typename T, std::size_t N>
90  struct ref_bind<T[N]>
91  {
92  typedef const T* type;
93 
94  explicit
95  ref_bind (type r, unsigned short p = 0xFFF, short s = 0xFFF)
96  : ref (r), prec (p), scale (s) {}
97 
98  // Allow implicit conversion from decayed ref_bind's.
99  //
100  ref_bind (ref_bind<T*> r): ref (r.ref), prec (r.prec), scale (r.scale) {}
102  : ref (r.ref), prec (r.prec), scale (r.scale) {}
103 
104  const void*
105  ptr () const {return ref;}
106 
108 
109  unsigned short prec;
110  short scale;
111  };
112 
113  template <typename T, database_type_id ID>
115  {
116  explicit
118  unsigned short p = 0xFFF,
119  short s = 0xFFF): val_bind<T> (v, p, s) {}
120  };
121 
122  template <typename T, database_type_id ID>
124  {
125  explicit
127  unsigned short p = 0xFFF,
128  short s = 0xFFF): ref_bind<T> (r, p, s) {}
129  };
130 
131  struct LIBODB_ORACLE_EXPORT query_param: details::shared_base
132  {
134 
135  virtual
136  ~query_param ();
137 
138  bool
139  reference () const
140  {
141  return value_ != 0;
142  }
143 
144  virtual bool
145  init () = 0;
146 
147  virtual void
148  bind (bind_type*) = 0;
149 
150  protected:
151  query_param (const void* value)
152  : value_ (value)
153  {
154  }
155 
156  protected:
157  const void* value_;
158  };
159 
160  //
161  //
162  template <typename T, database_type_id ID>
163  struct query_column;
164 
165  class LIBODB_ORACLE_EXPORT query_base
166  {
167  public:
168  struct clause_part
169  {
171  {
175  kind_bool
176  };
177 
178  clause_part (kind_type k): kind (k) {}
179  clause_part (kind_type k, const std::string& p): kind (k), part (p) {}
180  clause_part (bool p): kind (kind_bool), bool_part (p) {}
181 
183  std::string part; // If kind is param, then part is conversion expr.
184  bool bool_part;
185  };
186 
188  : binding_ (0, 0)
189  {
190  }
191 
192  // True or false literal.
193  //
194  explicit
195  query_base (bool v)
196  : binding_ (0, 0)
197  {
198  append (v);
199  }
200 
201  explicit
202  query_base (const char* native)
203  : binding_ (0, 0)
204  {
205  clause_.push_back (clause_part (clause_part::kind_native, native));
206  }
207 
208  explicit
209  query_base (const std::string& native)
210  : binding_ (0, 0)
211  {
212  clause_.push_back (clause_part (clause_part::kind_native, native));
213  }
214 
215  query_base (const char* table, const char* column)
216  : binding_ (0, 0)
217  {
218  append (table, column);
219  }
220 
221  template <typename T>
222  explicit
224  : binding_ (0, 0)
225  {
226  *this += v;
227  }
228 
229  template <typename T, database_type_id ID>
230  explicit
232  : binding_ (0, 0)
233  {
234  *this += v;
235  }
236 
237  template <typename T>
238  explicit
240  : binding_ (0, 0)
241  {
242  *this += r;
243  }
244 
245  template <typename T, database_type_id ID>
246  explicit
248  : binding_ (0, 0)
249  {
250  *this += r;
251  }
252 
253  template <database_type_id ID>
255 
256  // Translate common query representation to Oracle native. Defined
257  // in query-dynamic.cxx
258  //
259  query_base (const odb::query_base&);
260 
261  // Copy c-tor and assignment.
262  //
263  query_base (const query_base&);
264 
265  query_base&
266  operator= (const query_base&);
267 
268  public:
269  std::string
270  clause () const;
271 
272  const char*
273  clause_prefix () const;
274 
275  // Initialize the by-reference parameters from bound variables.
276  //
277  void
278  init_parameters () const;
279 
280  binding&
281  parameters_binding () const;
282 
283  public:
284  bool
285  empty () const
286  {
287  return clause_.empty ();
288  }
289 
290  static const query_base true_expr;
291 
292  bool
293  const_true () const
294  {
295  return clause_.size () == 1 &&
296  clause_.front ().kind == clause_part::kind_bool &&
297  clause_.front ().bool_part;
298  }
299 
300  void
301  optimize ();
302 
303  public:
304  template <typename T>
305  static val_bind<T>
306  _val (const T& x, unsigned short prec = 0xFFF, short scale = 0xFFF)
307  {
308  return val_bind<T> (x, prec, scale);
309  }
310 
311  template <database_type_id ID, typename T>
312  static val_bind_typed<T, ID>
313  _val (const T& x, unsigned short prec = 0xFFF, short scale = 0xFFF)
314  {
315  return val_bind_typed<T, ID> (x, prec, scale);
316  }
317 
318  template <typename T>
319  static ref_bind<T>
320  _ref (const T& x, unsigned short prec = 0xFFF, short scale = 0xFFF)
321  {
322  return ref_bind<T> (x, prec, scale);
323  }
324 
325  template <database_type_id ID, typename T>
326  static ref_bind_typed<T, ID>
327  _ref (const T& x, unsigned short prec = 0xFFF, short scale = 0xFFF)
328  {
329  return ref_bind_typed<T, ID> (x, prec, scale);
330  }
331 
332  // Some compilers (notably VC++), when deducing const T& from const
333  // array do not strip const from the array type. As a result, in the
334  // above signatures we get, for example, T = const char[4] instead
335  // of T = char[4], which is what we want. So to "fix" such compilers,
336  // we will have to provide the following specializations of the above
337  // functions.
338  //
339  template <typename T, std::size_t N>
340  static val_bind<T[N]>
341  _val (const T (&x) [N], unsigned short prec = 0xFFF, short scale = 0xFFF)
342  {
343  return val_bind<T[N]> (x, prec, scale);
344  }
345 
346  template <database_type_id ID, typename T, std::size_t N>
348  _val (const T (&x) [N], unsigned short prec = 0xFFF, short scale = 0xFFF)
349  {
350  return val_bind_typed<T[N], ID> (x, prec, scale);
351  }
352 
353  template <typename T, std::size_t N>
354  static ref_bind<T[N]>
355  _ref (const T (&x) [N], unsigned short prec = 0xFFF, short scale = 0xFFF)
356  {
357  return ref_bind<T[N]> (x, prec, scale);
358  }
359 
360  template <database_type_id ID, typename T, std::size_t N>
362  _ref (const T (&x) [N], unsigned short prec = 0xFFF, short scale = 0xFFF)
363  {
364  return ref_bind_typed<T[N], ID> (x, prec, scale);
365  }
366 
367  public:
368  query_base&
369  operator+= (const query_base&);
370 
371  query_base&
372  operator+= (const std::string& q)
373  {
374  append (q);
375  return *this;
376  }
377 
378  template <typename T>
379  query_base&
380  operator+= (val_bind<T> v)
381  {
382  append<T, type_traits<T>::db_type_id> (
383  v, details::conversion<T>::to ());
384  return *this;
385  }
386 
387  template <typename T, database_type_id ID>
388  query_base&
389  operator+= (val_bind_typed<T, ID> v)
390  {
391  // We are not using default type_traits so no default conversion
392  // either.
393  //
394  append<T, ID> (v, 0);
395  return *this;
396  }
397 
398  template <typename T>
399  query_base&
400  operator+= (ref_bind<T> r)
401  {
402  append<T, type_traits<T>::db_type_id> (
403  r, details::conversion<T>::to ());
404  return *this;
405  }
406 
407  template <typename T, database_type_id ID>
408  query_base&
409  operator+= (ref_bind_typed<T, ID> r)
410  {
411  // We are not using default type_traits so no default conversion
412  // either.
413  //
414  append<T, ID> (r, 0);
415  return *this;
416  }
417 
418  // Implementation details.
419  //
420  public:
421  template <typename T, database_type_id ID>
422  void
423  append (val_bind<T>, const char* conv);
424 
425  template <typename T, database_type_id ID>
426  void
427  append (ref_bind<T>, const char* conv);
428 
429  void
430  append (details::shared_ptr<query_param>, const char* conv);
431 
432  void
433  append (bool v)
434  {
435  clause_.push_back (clause_part (v));
436  }
437 
438  void
439  append (const std::string& native);
440 
441  void
442  append (const char* native) // Clashes with append(bool).
443  {
444  append (std::string (native));
445  }
446 
447  void
448  append (const char* table, const char* column);
449 
450  private:
451  typedef std::vector<clause_part> clause_type;
452  typedef std::vector<details::shared_ptr<query_param> > parameters_type;
453 
454  clause_type clause_;
455  parameters_type parameters_;
456  mutable std::vector<bind> bind_;
457  mutable binding binding_;
458  };
459 
460  inline query_base
461  operator+ (const query_base& x, const query_base& y)
462  {
463  query_base r (x);
464  r += y;
465  return r;
466  }
467 
468  template <typename T>
469  inline query_base
471  {
472  query_base r (q);
473  r += b;
474  return r;
475  }
476 
477  template <typename T>
478  inline query_base
480  {
481  query_base r;
482  r += b;
483  r += q;
484  return r;
485  }
486 
487  template <typename T, database_type_id ID>
488  inline query_base
490  {
491  query_base r (q);
492  r += b;
493  return r;
494  }
495 
496  template <typename T, database_type_id ID>
497  inline query_base
499  {
500  query_base r;
501  r += b;
502  r += q;
503  return r;
504  }
505 
506  template <typename T>
507  inline query_base
509  {
510  query_base r (q);
511  r += b;
512  return r;
513  }
514 
515  template <typename T>
516  inline query_base
518  {
519  query_base r;
520  r += b;
521  r += q;
522  return r;
523  }
524 
525  template <typename T, database_type_id ID>
526  inline query_base
528  {
529  query_base r (q);
530  r += b;
531  return r;
532  }
533 
534  template <typename T, database_type_id ID>
535  inline query_base
537  {
538  query_base r;
539  r += b;
540  r += q;
541  return r;
542  }
543 
544  inline query_base
545  operator+ (const query_base& q, const std::string& s)
546  {
547  query_base r (q);
548  r += s;
549  return r;
550  }
551 
552  inline query_base
553  operator+ (const std::string& s, const query_base& q)
554  {
555  query_base r (s);
556  r += q;
557  return r;
558  }
559 
560  template <typename T>
561  inline query_base
562  operator+ (const std::string& s, val_bind<T> b)
563  {
564  query_base r (s);
565  r += b;
566  return r;
567  }
568 
569  template <typename T>
570  inline query_base
571  operator+ (val_bind<T> b, const std::string& s)
572  {
573  query_base r;
574  r += b;
575  r += s;
576  return r;
577  }
578 
579  template <typename T, database_type_id ID>
580  inline query_base
581  operator+ (const std::string& s, val_bind_typed<T, ID> b)
582  {
583  query_base r (s);
584  r += b;
585  return r;
586  }
587 
588  template <typename T, database_type_id ID>
589  inline query_base
590  operator+ (val_bind_typed<T, ID> b, const std::string& s)
591  {
592  query_base r;
593  r += b;
594  r += s;
595  return r;
596  }
597 
598  template <typename T>
599  inline query_base
600  operator+ (const std::string& s, ref_bind<T> b)
601  {
602  query_base r (s);
603  r += b;
604  return r;
605  }
606 
607  template <typename T>
608  inline query_base
609  operator+ (ref_bind<T> b, const std::string& s)
610  {
611  query_base r;
612  r += b;
613  r += s;
614  return r;
615  }
616 
617  template <typename T, database_type_id ID>
618  inline query_base
619  operator+ (const std::string& s, ref_bind_typed<T, ID> b)
620  {
621  query_base r (s);
622  r += b;
623  return r;
624  }
625 
626  template <typename T, database_type_id ID>
627  inline query_base
628  operator+ (ref_bind_typed<T, ID> b, const std::string& s)
629  {
630  query_base r;
631  r += b;
632  r += s;
633  return r;
634  }
635 
636  LIBODB_ORACLE_EXPORT query_base
637  operator&& (const query_base& x, const query_base& y);
638 
639  LIBODB_ORACLE_EXPORT query_base
640  operator|| (const query_base& x, const query_base& y);
641 
642  LIBODB_ORACLE_EXPORT query_base
643  operator! (const query_base& x);
644 
645  // query_column
646  //
647  struct LIBODB_ORACLE_EXPORT query_column_base
648  {
649  // Note that we keep shallow copies of the table, column, and conversion
650  // expression. The latter can be NULL.
651  //
652  query_column_base (const char* table,
653  const char* column,
654  const char* conv,
655  unsigned short prec,
656  short scale)
657  : table_ (table), column_ (column), conversion_ (conv),
658  prec_ (prec), scale_ (scale)
659  {
660  }
661 
662  const char*
663  table () const
664  {
665  return table_;
666  }
667 
668  const char*
669  column () const
670  {
671  return column_;
672  }
673 
674  // Can be NULL.
675  //
676  const char*
677  conversion () const
678  {
679  return conversion_;
680  }
681 
682  unsigned short
683  prec () const
684  {
685  return prec_;
686  }
687 
688  short
689  scale () const
690  {
691  return scale_;
692  }
693 
694  protected:
695  const char* table_;
696  const char* column_;
697  const char* conversion_;
698 
699  unsigned short prec_;
700  short scale_;
701  };
702 
703  template <typename T, database_type_id ID>
705  {
707 
708  // Note that we keep shalow copies of the table, column, and conversion
709  // expression. The latter can be NULL.
710  //
711  query_column (const char* table,
712  const char* column,
713  const char* conv,
714  unsigned short prec = 0xFFF,
715  short scale = 0xFFF)
716  : query_column_base (table, column, conv, prec, scale) {}
717 
718  // Implementation is in query-dynamic.ixx.
719  //
721  const char* table,
722  const char* column,
723  const char* conv,
724  unsigned short prec = 0xFFF,
725  short scale = 0xFFF);
726 
727  // is_null, is_not_null
728  //
729  public:
730  query_base
731  is_null () const
732  {
734  q += "IS NULL";
735  return q;
736  }
737 
738  query_base
739  is_not_null () const
740  {
742  q += "IS NOT NULL";
743  return q;
744  }
745 
746  // in
747  //
748  public:
749  query_base
750  in (decayed_type, decayed_type) const;
751 
752  query_base
754 
755  query_base
757 
758  query_base
760  decayed_type) const;
761 
762  template <typename I>
763  query_base
764  in_range (I begin, I end) const;
765 
766  // like
767  //
768  public:
769  query_base
770  like (decayed_type pattern) const
771  {
772  return like (val_bind<T> (pattern));
773  }
774 
775  query_base
776  like (val_bind<T> pattern) const;
777 
778  template <typename T2>
779  query_base
780  like (val_bind<T2> pattern) const
781  {
782  return like (val_bind<T> (decayed_type (pattern.val)));
783  }
784 
785  query_base
786  like (ref_bind<T> pattern) const;
787 
788  query_base
789  like (decayed_type pattern, decayed_type escape) const
790  {
791  return like (val_bind<T> (pattern), escape);
792  }
793 
794  query_base
795  like (val_bind<T> pattern, decayed_type escape) const;
796 
797  template <typename T2>
798  query_base
799  like (val_bind<T2> pattern, decayed_type escape) const
800  {
801  return like (val_bind<T> (decayed_type (pattern.val)), escape);
802  }
803 
804  query_base
805  like (ref_bind<T> pattern, decayed_type escape) const;
806 
807  // =
808  //
809  public:
810  query_base
811  equal (decayed_type v) const
812  {
813  return equal (val_bind<T> (v));
814  }
815 
816  query_base
817  equal (val_bind<T> v) const
818  {
819  v.prec = prec_;
820  v.scale = scale_;
821 
823  q += "=";
824  q.append<T, ID> (v, conversion_);
825  return q;
826  }
827 
828  template <typename T2>
829  query_base
830  equal (val_bind<T2> v) const
831  {
832  return equal (val_bind<T> (decayed_type (v.val)));
833  }
834 
835  query_base
836  equal (ref_bind<T> r) const
837  {
838  r.prec = prec_;
839  r.scale = scale_;
840 
842  q += "=";
843  q.append<T, ID> (r, conversion_);
844  return q;
845  }
846 
847  friend query_base
849  {
850  return c.equal (v);
851  }
852 
853  friend query_base
855  {
856  return c.equal (v);
857  }
858 
859  friend query_base
861  {
862  return c.equal (v);
863  }
864 
865  friend query_base
867  {
868  return c.equal (v);
869  }
870 
871  template <typename T2>
872  friend query_base
874  {
875  return c.equal (v);
876  }
877 
878  template <typename T2>
879  friend query_base
881  {
882  return c.equal (v);
883  }
884 
885  friend query_base
887  {
888  return c.equal (r);
889  }
890 
891  friend query_base
893  {
894  return c.equal (r);
895  }
896 
897  // !=
898  //
899  public:
900  query_base
902  {
903  return unequal (val_bind<T> (v));
904  }
905 
906  query_base
908  {
909  v.prec = prec_;
910  v.scale = scale_;
911 
913  q += "!=";
914  q.append<T, ID> (v, conversion_);
915  return q;
916  }
917 
918  template <typename T2>
919  query_base
921  {
922  return unequal (val_bind<T> (decayed_type (v.val)));
923  }
924 
925  query_base
927  {
928  r.prec = prec_;
929  r.scale = scale_;
930 
932  q += "!=";
933  q.append<T, ID> (r, conversion_);
934  return q;
935  }
936 
937  friend query_base
939  {
940  return c.unequal (v);
941  }
942 
943  friend query_base
945  {
946  return c.unequal (v);
947  }
948 
949  friend query_base
951  {
952  return c.unequal (v);
953  }
954 
955  friend query_base
957  {
958  return c.unequal (v);
959  }
960 
961  template <typename T2>
962  friend query_base
964  {
965  return c.unequal (v);
966  }
967 
968  template <typename T2>
969  friend query_base
971  {
972  return c.unequal (v);
973  }
974 
975  friend query_base
977  {
978  return c.unequal (r);
979  }
980 
981  friend query_base
983  {
984  return c.unequal (r);
985  }
986 
987  // <
988  //
989  public:
990  query_base
991  less (decayed_type v) const
992  {
993  return less (val_bind<T> (v));
994  }
995 
996  query_base
997  less (val_bind<T> v) const
998  {
999  v.prec = prec_;
1000  v.scale = scale_;
1001 
1002  query_base q (table_, column_);
1003  q += "<";
1004  q.append<T, ID> (v, conversion_);
1005  return q;
1006  }
1007 
1008  template <typename T2>
1009  query_base
1010  less (val_bind<T2> v) const
1011  {
1012  return less (val_bind<T> (decayed_type (v.val)));
1013  }
1014 
1015  query_base
1016  less (ref_bind<T> r) const
1017  {
1018  r.prec = prec_;
1019  r.scale = scale_;
1020 
1021  query_base q (table_, column_);
1022  q += "<";
1023  q.append<T, ID> (r, conversion_);
1024  return q;
1025  }
1026 
1027  friend query_base
1029  {
1030  return c.less (v);
1031  }
1032 
1033  friend query_base
1035  {
1036  return c.greater (v);
1037  }
1038 
1039  friend query_base
1040  operator< (const query_column& c, val_bind<T> v)
1041  {
1042  return c.less (v);
1043  }
1044 
1045  friend query_base
1046  operator< (val_bind<T> v, const query_column& c)
1047  {
1048  return c.greater (v);
1049  }
1050 
1051  template <typename T2>
1052  friend query_base
1053  operator< (const query_column& c, val_bind<T2> v)
1054  {
1055  return c.less (v);
1056  }
1057 
1058  template <typename T2>
1059  friend query_base
1060  operator< (val_bind<T2> v, const query_column& c)
1061  {
1062  return c.greater (v);
1063  }
1064 
1065  friend query_base
1066  operator< (const query_column& c, ref_bind<T> r)
1067  {
1068  return c.less (r);
1069  }
1070 
1071  friend query_base
1072  operator< (ref_bind<T> r, const query_column& c)
1073  {
1074  return c.greater (r);
1075  }
1076 
1077  // >
1078  //
1079  public:
1080  query_base
1082  {
1083  return greater (val_bind<T> (v));
1084  }
1085 
1086  query_base
1088  {
1089  v.prec = prec_;
1090  v.scale = scale_;
1091 
1092  query_base q (table_, column_);
1093  q += ">";
1094  q.append<T, ID> (v, conversion_);
1095  return q;
1096  }
1097 
1098  template <typename T2>
1099  query_base
1101  {
1102  return greater (val_bind<T> (decayed_type (v.val)));
1103  }
1104 
1105  query_base
1107  {
1108  r.prec = prec_;
1109  r.scale = scale_;
1110 
1111  query_base q (table_, column_);
1112  q += ">";
1113  q.append<T, ID> (r, conversion_);
1114  return q;
1115  }
1116 
1117  friend query_base
1119  {
1120  return c.greater (v);
1121  }
1122 
1123  friend query_base
1125  {
1126  return c.less (v);
1127  }
1128 
1129  friend query_base
1131  {
1132  return c.greater (v);
1133  }
1134 
1135  friend query_base
1137  {
1138  return c.less (v);
1139  }
1140 
1141  template <typename T2>
1142  friend query_base
1144  {
1145  return c.greater (v);
1146  }
1147 
1148  template <typename T2>
1149  friend query_base
1151  {
1152  return c.less (v);
1153  }
1154 
1155  friend query_base
1157  {
1158  return c.greater (r);
1159  }
1160 
1161  friend query_base
1163  {
1164  return c.less (r);
1165  }
1166 
1167  // <=
1168  //
1169  public:
1170  query_base
1172  {
1173  return less_equal (val_bind<T> (v));
1174  }
1175 
1176  query_base
1178  {
1179  v.prec = prec_;
1180  v.scale = scale_;
1181 
1182  query_base q (table_, column_);
1183  q += "<=";
1184  q.append<T, ID> (v, conversion_);
1185  return q;
1186  }
1187 
1188  template <typename T2>
1189  query_base
1191  {
1192  return less_equal (val_bind<T> (decayed_type (v.val)));
1193  }
1194 
1195  query_base
1197  {
1198  r.prec = prec_;
1199  r.scale = scale_;
1200 
1201  query_base q (table_, column_);
1202  q += "<=";
1203  q.append<T, ID> (r, conversion_);
1204  return q;
1205  }
1206 
1207  friend query_base
1209  {
1210  return c.less_equal (v);
1211  }
1212 
1213  friend query_base
1215  {
1216  return c.greater_equal (v);
1217  }
1218 
1219  friend query_base
1220  operator<= (const query_column& c, val_bind<T> v)
1221  {
1222  return c.less_equal (v);
1223  }
1224 
1225  friend query_base
1226  operator<= (val_bind<T> v, const query_column& c)
1227  {
1228  return c.greater_equal (v);
1229  }
1230 
1231  template <typename T2>
1232  friend query_base
1233  operator<= (const query_column& c, val_bind<T2> v)
1234  {
1235  return c.less_equal (v);
1236  }
1237 
1238  template <typename T2>
1239  friend query_base
1240  operator<= (val_bind<T2> v, const query_column& c)
1241  {
1242  return c.greater_equal (v);
1243  }
1244 
1245  friend query_base
1246  operator<= (const query_column& c, ref_bind<T> r)
1247  {
1248  return c.less_equal (r);
1249  }
1250 
1251  friend query_base
1252  operator<= (ref_bind<T> r, const query_column& c)
1253  {
1254  return c.greater_equal (r);
1255  }
1256 
1257  // >=
1258  //
1259  public:
1260  query_base
1262  {
1263  return greater_equal (val_bind<T> (v));
1264  }
1265 
1266  query_base
1268  {
1269  v.prec = prec_;
1270  v.scale = scale_;
1271 
1272  query_base q (table_, column_);
1273  q += ">=";
1274  q.append<T, ID> (v, conversion_);
1275  return q;
1276  }
1277 
1278  template <typename T2>
1279  query_base
1281  {
1282  return greater_equal (val_bind<T> (decayed_type (v.val)));
1283  }
1284 
1285  query_base
1287  {
1288  r.prec = prec_;
1289  r.scale = scale_;
1290 
1291  query_base q (table_, column_);
1292  q += ">=";
1293  q.append<T, ID> (r, conversion_);
1294  return q;
1295  }
1296 
1297  friend query_base
1299  {
1300  return c.greater_equal (v);
1301  }
1302 
1303  friend query_base
1305  {
1306  return c.less_equal (v);
1307  }
1308 
1309  friend query_base
1311  {
1312  return c.greater_equal (v);
1313  }
1314 
1315  friend query_base
1317  {
1318  return c.less_equal (v);
1319  }
1320 
1321  template <typename T2>
1322  friend query_base
1324  {
1325  return c.greater_equal (v);
1326  }
1327 
1328  template <typename T2>
1329  friend query_base
1331  {
1332  return c.less_equal (v);
1333  }
1334 
1335  friend query_base
1337  {
1338  return c.greater_equal (r);
1339  }
1340 
1341  friend query_base
1343  {
1344  return c.less_equal (r);
1345  }
1346 
1347  // Column comparison.
1348  //
1349  public:
1350  template <typename T2, database_type_id ID2>
1351  query_base
1353  {
1354  // We can compare columns only if we can compare their C++ types.
1355  //
1356  (void) (sizeof (decay_traits<T>::instance () ==
1358 
1359  query_base q (table_, column_);
1360  q += "=";
1361  q.append (c.table (), c.column ());
1362  return q;
1363  }
1364 
1365  template <typename T2, database_type_id ID2>
1366  query_base
1368  {
1369  // We can compare columns only if we can compare their C++ types.
1370  //
1371  (void) (sizeof (decay_traits<T>::instance () !=
1373 
1374  query_base q (table_, column_);
1375  q += "!=";
1376  q.append (c.table (), c.column ());
1377  return q;
1378  }
1379 
1380  template <typename T2, database_type_id ID2>
1381  query_base
1382  operator< (const query_column<T2, ID2>& c) const
1383  {
1384  // We can compare columns only if we can compare their C++ types.
1385  //
1386  (void) (sizeof (decay_traits<T>::instance () <
1388 
1389  query_base q (table_, column_);
1390  q += "<";
1391  q.append (c.table (), c.column ());
1392  return q;
1393  }
1394 
1395  template <typename T2, database_type_id ID2>
1396  query_base
1398  {
1399  // We can compare columns only if we can compare their C++ types.
1400  //
1401  (void) (sizeof (decay_traits<T>::instance () >
1403 
1404  query_base q (table_, column_);
1405  q += ">";
1406  q.append (c.table (), c.column ());
1407  return q;
1408  }
1409 
1410  template <typename T2, database_type_id ID2>
1411  query_base
1412  operator<= (const query_column<T2, ID2>& c) const
1413  {
1414  // We can compare columns only if we can compare their C++ types.
1415  //
1416  (void) (sizeof (decay_traits<T>::instance () <=
1418 
1419  query_base q (table_, column_);
1420  q += "<=";
1421  q.append (c.table (), c.column ());
1422  return q;
1423  }
1424 
1425  template <typename T2, database_type_id ID2>
1426  query_base
1428  {
1429  // We can compare columns only if we can compare their C++ types.
1430  //
1431  (void) (sizeof (decay_traits<T>::instance () >=
1433 
1434  query_base q (table_, column_);
1435  q += ">=";
1436  q.append (c.table (), c.column ());
1437  return q;
1438  }
1439  };
1440 
1441  //
1442  // Oracle does not support comparison operations between LOB columns.
1443  // query_column therefore only supports the IS NULL and IS NOT NULL
1444  // predicates for these types.
1445  //
1446 
1447  struct LIBODB_ORACLE_EXPORT lob_query_column: query_column_base
1448  {
1449  // Note that we keep shallow copies of the table and column names.
1450  // There is also no need for conversion expression since the only
1451  // valid tests are is IS NULL/IS NOT NULL.
1452  //
1453  lob_query_column (const char* table, const char* column)
1454  : query_column_base (table, column, 0, 0xFFF, 0xFFF)
1455  {
1456  }
1457 
1458  // is_null, is_not_null
1459  //
1460  public:
1461  query_base
1462  is_null () const
1463  {
1464  query_base q (table_, column_);
1465  q += "IS NULL";
1466  return q;
1467  }
1468 
1469  query_base
1470  is_not_null () const
1471  {
1472  query_base q (table_, column_);
1473  q += "IS NOT NULL";
1474  return q;
1475  }
1476  };
1477 
1478  template <typename T>
1480  {
1481  query_column (const char* table, const char* column, const char*)
1482  : lob_query_column (table, column)
1483  {
1484  }
1485 
1486  // Implementation is in query-dynamic.ixx.
1487  //
1489  const char* table, const char* column, const char*);
1490  };
1491 
1492  template <typename T>
1494  {
1495  query_column (const char* table, const char* column, const char*)
1496  : lob_query_column (table, column)
1497  {
1498  }
1499 
1500  // Implementation is in query-dynamic.ixx.
1501  //
1503  const char* table, const char* column, const char*);
1504  };
1505 
1506  template <typename T>
1508  {
1509  query_column (const char* table, const char* column, const char*)
1510  : lob_query_column (table, column)
1511  {
1512  }
1513 
1514  // Implementation is in query-dynamic.ixx.
1515  //
1517  const char* table, const char* column, const char*);
1518  };
1519 
1520  // Provide operator+() for using columns to construct native
1521  // query fragments (e.g., ORDER BY).
1522  //
1523  template <typename T, database_type_id ID>
1524  inline query_base
1525  operator+ (const query_column<T, ID>& c, const std::string& s)
1526  {
1527  query_base q (c.table (), c.column ());
1528  q += s;
1529  return q;
1530  }
1531 
1532  template <typename T, database_type_id ID>
1533  inline query_base
1534  operator+ (const std::string& s, const query_column<T, ID>& c)
1535  {
1536  query_base q (s);
1537  q.append (c.table (), c.column ());
1538  return q;
1539  }
1540 
1541  template <typename T, database_type_id ID>
1542  inline query_base
1544  {
1545  query_base r (c.table (), c.column ());
1546  r += q;
1547  return r;
1548  }
1549 
1550  template <typename T, database_type_id ID>
1551  inline query_base
1553  {
1554  query_base r (q);
1555  r.append (c.table (), c.column ());
1556  return r;
1557  }
1558 
1559  //
1560  //
1561  template <typename T, database_type_id>
1563 
1564  // id_int32.
1565  //
1566  template <typename T>
1568  {
1571 
1572  virtual bool
1573  init ()
1574  {
1575  init (*static_cast<const T*> (value_));
1576  return false;
1577  }
1578 
1579  virtual void
1581  {
1583  b->buffer = &image_;
1584  b->capacity = sizeof (image_);
1585  b->size = 0;
1586  }
1587 
1588  private:
1589  void
1590  init (typename decay_traits<T>::type v)
1591  {
1592  bool is_null (false); // Can't be NULL.
1593  value_traits<T, id_int32>::set_image (image_, is_null, v);
1594  }
1595 
1596  private:
1597  typename image_traits<T, id_int32>::image_type image_;
1598  };
1599 
1600  // id_int64.
1601  //
1602  template <typename T>
1604  {
1607 
1608  virtual bool
1609  init ()
1610  {
1611  init (*static_cast<const T*> (value_));
1612  return false;
1613  }
1614 
1615  virtual void
1617  {
1619  b->buffer = &image_;
1620  b->capacity = sizeof (image_);
1621  b->size = 0;
1622  }
1623 
1624  private:
1625  void
1626  init (typename decay_traits<T>::type v)
1627  {
1628  bool is_null (false); // Can't be NULL.
1629  value_traits<T, id_int64>::set_image (image_, is_null, v);
1630  }
1631 
1632  private:
1633  typename image_traits<T, id_int64>::image_type image_;
1634  };
1635 
1636  // id_big_int.
1637  //
1638  template <typename T>
1640  {
1643 
1644  virtual bool
1645  init ()
1646  {
1647  init (*static_cast<const T*> (value_));
1648  return false;
1649  }
1650 
1651  virtual void
1653  {
1654  b->type = bind_type::number;
1655  b->buffer = &image_;
1656  b->capacity = sizeof (image_);
1657  b->size = &size_;
1658  }
1659 
1660  private:
1661  void
1662  init (typename decay_traits<T>::type v)
1663  {
1664  bool is_null (false); // Can't be NULL.
1665  std::size_t size (0);
1666  value_traits<T, id_big_int>::set_image (image_, size, is_null, v);
1667  size_ = static_cast<ub2> (size);
1668  }
1669 
1670  private:
1671  char image_[21];
1672  ub2 size_;
1673  };
1674 
1675  // id_float.
1676  //
1677  template <typename T>
1679  {
1682 
1683  virtual bool
1684  init ()
1685  {
1686  init (*static_cast<const T*> (value_));
1687  return false;
1688  }
1689 
1690  virtual void
1692  {
1693  b->type = bind_type::binary_float;
1694  b->buffer = &image_;
1695  b->capacity = sizeof (image_);
1696  b->size = 0;
1697  }
1698 
1699  private:
1700  void
1701  init (typename decay_traits<T>::type v)
1702  {
1703  bool is_null (false); // Can't be NULL.
1704  value_traits<T, id_float>::set_image (image_, is_null, v);
1705  }
1706 
1707  private:
1708  float image_;
1709  };
1710 
1711  // id_double.
1712  //
1713  template <typename T>
1715  {
1718 
1719  virtual bool
1720  init ()
1721  {
1722  init (*static_cast<const T*> (value_));
1723  return false;
1724  }
1725 
1726  virtual void
1728  {
1729  b->type = bind_type::binary_double;
1730  b->buffer = &image_;
1731  b->capacity = sizeof (image_);
1732  b->size = 0;
1733  }
1734 
1735  private:
1736  void
1737  init (typename decay_traits<T>::type v)
1738  {
1739  bool is_null (false); // Can't be NULL.
1740  value_traits<T, id_double>::set_image (image_, is_null, v);
1741  }
1742 
1743  private:
1744  double image_;
1745  };
1746 
1747  // id_big_float.
1748  //
1749  template <typename T>
1751  {
1754 
1755  virtual bool
1756  init ()
1757  {
1758  init (*static_cast<const T*> (value_));
1759  return false;
1760  }
1761 
1762  virtual void
1764  {
1765  b->type = bind_type::number;
1766  b->buffer = &image_;
1767  b->capacity = sizeof (image_);
1768  b->size = &size_;
1769  }
1770 
1771  private:
1772  void
1773  init (typename decay_traits<T>::type v)
1774  {
1775  bool is_null (false); // Can't be NULL.
1776  std::size_t size (0);
1777  value_traits<T, id_big_float>::set_image (image_, size, is_null, v);
1778  size_ = static_cast<ub2> (size);
1779  }
1780 
1781  private:
1782  char image_[21];
1783  ub2 size_;
1784  };
1785 
1786  // id_date.
1787  //
1788  template <typename T>
1790  {
1793 
1794  virtual bool
1795  init ()
1796  {
1797  init (*static_cast<const T*> (value_));
1798  return false;
1799  }
1800 
1801  virtual void
1803  {
1804  b->type = bind_type::date;
1805  b->buffer = &image_;
1806  b->capacity = sizeof (image_);
1807  b->size = 0;
1808  }
1809 
1810  private:
1811  void
1812  init (typename decay_traits<T>::type v)
1813  {
1814  bool is_null (false); // Can't be NULL.
1815  value_traits<T, id_date>::set_image (image_, is_null, v);
1816  }
1817 
1818  private:
1819  char image_[7];
1820  };
1821 
1822  // id_timestamp
1823  //
1824  template <typename T>
1826  {
1828  : query_param (r.ptr ()),
1829  image_ (descriptor_cache) // Cache, don't free.
1830  {
1831  }
1832 
1834  : query_param (0),
1835  image_ (0) // Don't cache, don't free.
1836  {
1837  init (v.val);
1838  }
1839 
1840  virtual bool
1841  init ()
1842  {
1843  init (*static_cast<const T*> (value_));
1844  return false;
1845  }
1846 
1847  virtual void
1849  {
1850  b->type = bind_type::timestamp;
1851  b->buffer = &image_;
1852  b->capacity = sizeof (OCIDateTime*);
1853  b->size = 0;
1854  }
1855 
1856  private:
1857  void
1858  init (typename decay_traits<T>::type v)
1859  {
1860  bool is_null (false); // Can't be NULL.
1861  value_traits<T, id_timestamp>::set_image (image_, is_null, v);
1862  }
1863 
1864  private:
1865  datetime image_;
1866  };
1867 
1868  // id_interval_ym
1869  //
1870  template <typename T>
1872  {
1874  : query_param (r.ptr ()),
1875  image_ (descriptor_cache) // Cache, don't free.
1876  {
1877  }
1878 
1880  : query_param (0),
1881  image_ (0) // Don't cache, don't free.
1882  {
1883  init (v.val);
1884  }
1885 
1886  virtual bool
1887  init ()
1888  {
1889  init (*static_cast<const T*> (value_));
1890  return false;
1891  }
1892 
1893  virtual void
1895  {
1896  b->type = bind_type::interval_ym;
1897  b->buffer = &image_;
1898  b->capacity = sizeof (OCIInterval*);
1899  b->size = 0;
1900  }
1901 
1902  private:
1903  void
1904  init (typename decay_traits<T>::type v)
1905  {
1906  bool is_null (false); // Can't be NULL.
1907  value_traits<T, id_interval_ym>::set_image (image_, is_null, v);
1908  }
1909 
1910  private:
1911  interval_ym image_;
1912  };
1913 
1914  // id_interval_ds
1915  //
1916  template <typename T>
1918  {
1920  : query_param (r.ptr ()),
1921  image_ (descriptor_cache) // Cache, don't free.
1922  {
1923  }
1924 
1926  : query_param (0),
1927  image_ (0) // Don't cache, don't free.
1928 
1929  {
1930  init (v.val);
1931  }
1932 
1933  virtual bool
1934  init ()
1935  {
1936  init (*static_cast<const T*> (value_));
1937  return false;
1938  }
1939 
1940  virtual void
1942  {
1943  b->type = bind_type::interval_ds;
1944  b->buffer = &image_;
1945  b->capacity = sizeof (OCIInterval*);
1946  b->size = 0;
1947  }
1948 
1949  private:
1950  void
1951  init (typename decay_traits<T>::type v)
1952  {
1953  bool is_null (false); // Can't be NULL.
1954  value_traits<T, id_interval_ds>::set_image (image_, is_null, v);
1955  }
1956 
1957  private:
1958  interval_ds image_;
1959  };
1960 
1961  // id_string.
1962  //
1963  template <typename T>
1965  {
1967  : query_param (r.ptr ()),
1968  // Default to max (4000).
1969  buf_ (r.prec != 0xFFF ? r.prec : 4000)
1970  {
1971  }
1972 
1974  : query_param (0),
1975  // Default to max (4000).
1976  buf_ (v.prec != 0xFFF ? v.prec : 4000)
1977 
1978  {
1979  init (v.val);
1980  }
1981 
1982  virtual bool
1983  init ()
1984  {
1985  init (*static_cast<const T*> (value_));
1986  return false;
1987  }
1988 
1989  virtual void
1991  {
1992  b->type = bind_type::string;
1993  b->buffer = buf_.data ();
1994  b->capacity = static_cast<ub4> (buf_.capacity ());
1995  b->size = &size_;
1996  }
1997 
1998  private:
1999  void
2000  init (typename decay_traits<T>::type v)
2001  {
2002  bool is_null (false); // Can't be NULL.
2003  std::size_t size (0);
2005  buf_.data (), buf_.capacity (), size, is_null, v);
2006  size_ = static_cast<ub2> (size);
2007  }
2008 
2009  private:
2010  details::buffer buf_;
2011  ub2 size_;
2012  };
2013 
2014  // id_nstring
2015  //
2016  template <typename T>
2018  {
2020  : query_param (r.ptr ()),
2021  // Default to max (4000).
2022  buf_ (r.prec != 0xFFF ? r.prec : 4000)
2023  {
2024  }
2025 
2027  : query_param (0),
2028  // Default to max (4000).
2029  buf_ (v.prec != 0xFFF ? v.prec : 4000)
2030 
2031  {
2032  init (v.val);
2033  }
2034 
2035  virtual bool
2036  init ()
2037  {
2038  init (*static_cast<const T*> (value_));
2039  return false;
2040  }
2041 
2042  virtual void
2044  {
2045  b->type = bind_type::nstring;
2046  b->buffer = buf_.data ();
2047  b->capacity = static_cast<ub4> (buf_.capacity ());
2048  b->size = &size_;
2049  }
2050 
2051  private:
2052  void
2053  init (typename decay_traits<T>::type v)
2054  {
2055  bool is_null (false); // Can't be NULL.
2056  std::size_t size (0);
2058  buf_.data (), buf_.capacity (), size, is_null, v);
2059  size_ = static_cast<ub2> (size);
2060  }
2061 
2062  private:
2063  details::buffer buf_;
2064  ub2 size_;
2065  };
2066 
2067  // id_raw
2068  //
2069  template <typename T>
2071  {
2073  : query_param (r.ptr ()),
2074  // Default to max (2000).
2075  buf_ (r.prec != 0xFFF ? r.prec : 2000)
2076  {
2077  }
2078 
2080  : query_param (0),
2081  // Default to max (2000).
2082  buf_ (v.prec != 0xFFF ? v.prec : 2000)
2083 
2084  {
2085  init (v.val);
2086  }
2087 
2088  virtual bool
2089  init ()
2090  {
2091  init (*static_cast<const T*> (value_));
2092  return false;
2093  }
2094 
2095  virtual void
2097  {
2098  b->type = bind_type::raw;
2099  b->buffer = buf_.data ();
2100  b->capacity = static_cast<ub4> (buf_.capacity ());
2101  b->size = &size_;
2102  }
2103 
2104  private:
2105  void
2106  init (typename decay_traits<T>::type v)
2107  {
2108  bool is_null (false); // Can't be NULL.
2109  std::size_t size (0);
2111  buf_.data (), buf_.capacity (), size, is_null, v);
2112  size_ = static_cast<ub2> (size);
2113  }
2114 
2115  private:
2116  details::buffer buf_;
2117  ub2 size_;
2118  };
2119  }
2120 }
2121 
2122 // odb::oracle::query and odb::query specialization for Oracle.
2123 //
2124 namespace odb
2125 {
2126  namespace oracle
2127  {
2128  template <typename T>
2129  class query: public query_base,
2130  public query_selector<T, id_oracle>::columns_type
2131  {
2132  public:
2133  // We don't define any typedefs here since they may clash with
2134  // column names defined by our base type.
2135  //
2136 
2138  {
2139  }
2140 
2141  explicit
2142  query (bool v)
2143  : query_base (v)
2144  {
2145  }
2146 
2147  explicit
2148  query (const char* q)
2149  : query_base (q)
2150  {
2151  }
2152 
2153  explicit
2154  query (const std::string& q)
2155  : query_base (q)
2156  {
2157  }
2158 
2159  template <typename T2>
2160  explicit
2162  : query_base (v)
2163  {
2164  }
2165 
2166  template <typename T2>
2167  explicit
2169  : query_base (r)
2170  {
2171  }
2172 
2173  query (const query_base& q)
2174  : query_base (q)
2175  {
2176  }
2177 
2178  template <database_type_id ID>
2180  : query_base (qc)
2181  {
2182  }
2183 
2185  : query_base (q)
2186  {
2187  }
2188  };
2189 
2190  namespace core
2191  {
2192  using oracle::query;
2193  }
2194  }
2195 
2196  // Derive odb::query from odb::oracle::query so that it can be
2197  // implicitly converted in oracle::database::query() calls.
2198  //
2199  template <typename T>
2200  class query<T, oracle::query_base>: public oracle::query<T>
2201  {
2202  public:
2203  // We don't define any typedefs here since they may clash with
2204  // column names defined by our base type.
2205  //
2206 
2208  {
2209  }
2210 
2211  explicit
2212  query (bool v)
2213  : oracle::query<T> (v)
2214  {
2215  }
2216 
2217  explicit
2218  query (const char* q)
2219  : oracle::query<T> (q)
2220  {
2221  }
2222 
2223  explicit
2224  query (const std::string& q)
2225  : oracle::query<T> (q)
2226  {
2227  }
2228 
2229  template <typename T2>
2230  explicit
2232  : oracle::query<T> (v)
2233  {
2234  }
2235 
2236  template <typename T2>
2237  explicit
2239  : oracle::query<T> (r)
2240  {
2241  }
2242 
2244  : oracle::query<T> (q)
2245  {
2246  }
2247 
2248  template <oracle::database_type_id ID>
2250  : oracle::query<T> (qc)
2251  {
2252  }
2253  };
2254 }
2255 
2256 #include <odb/oracle/query.ixx>
2257 #include <odb/oracle/query.txx>
2258 
2259 #include <odb/post.hxx>
2260 
2261 #endif // ODB_ORACLE_QUERY_HXX
const T * type
Definition: query.hxx:59
type ref
Definition: query.hxx:83
virtual void bind(bind_type *b)
Definition: query.hxx:1848
Definition: traits.hxx:60
Definition: traits.hxx:251
query_param_impl(val_bind< T > v)
Definition: query.hxx:2079
ub2 * size
Definition: oracle-types.hxx:114
void append(bool v)
Definition: query.hxx:433
query_base like(decayed_type pattern, decayed_type escape) const
Definition: query.hxx:789
friend query_base operator>=(const query_column &c, decayed_type v)
Definition: query.hxx:1298
query_base(const std::string &native)
Definition: query.hxx:209
query_base less_equal(val_bind< T > v) const
Definition: query.hxx:1177
val_bind(type v, unsigned short p=0xFFF, short s=0xFFF)
Definition: query.hxx:62
query(const query_column< bool, ID > &qc)
Definition: query.hxx:2179
query_base(bool v)
Definition: query.hxx:195
friend query_base operator<(const query_column &c, decayed_type v)
Definition: query.hxx:1028
query_param_impl(ref_bind< T > r)
Definition: query.hxx:1680
Definition: query.hxx:123
virtual bool init()
Definition: query.hxx:1573
struct OCIDateTime OCIDateTime
Definition: oracle-fwd.hxx:31
static ref_bind_typed< T, ID > _ref(const T &x, unsigned short prec=0xFFF, short scale=0xFFF)
Definition: query.hxx:327
Definition: traits.hxx:42
short scale
Definition: query.hxx:68
query_base greater(val_bind< T2 > v) const
Definition: query.hxx:1100
virtual bool init()
Definition: query.hxx:1720
query_base like(decayed_type pattern) const
Definition: query.hxx:770
query_param_impl(ref_bind< T > r)
Definition: query.hxx:1641
query_column_base(const char *table, const char *column, const char *conv, unsigned short prec, short scale)
Definition: query.hxx:652
query_base equal(val_bind< T2 > v) const
Definition: query.hxx:830
Definition: query.hxx:165
Definition: traits.hxx:40
virtual bool init()
Definition: query.hxx:1756
const char * column_
Definition: query.hxx:696
Definition: query.hxx:42
static val_bind< T[N]> _val(const T(&x)[N], unsigned short prec=0xFFF, short scale=0xFFF)
Definition: query.hxx:341
virtual void bind(bind_type *b)
Definition: query.hxx:1580
query_base(ref_bind_typed< T, ID > r)
Definition: query.hxx:247
query_base is_not_null() const
Definition: query.hxx:1470
query_param_impl(ref_bind< T > r)
Definition: query.hxx:2019
query_column(const char *table, const char *column, const char *)
Definition: query.hxx:1481
query_param_impl(val_bind< T > v)
Definition: query.hxx:1925
query_base unequal(decayed_type v) const
Definition: query.hxx:901
val_bind_typed(typename val_bind< T >::type v, unsigned short p=0xFFF, short s=0xFFF)
Definition: query.hxx:117
virtual void bind(bind_type *b)
Definition: query.hxx:1691
query_param_impl(ref_bind< T > r)
Definition: query.hxx:1752
void append(val_bind< T >, const char *conv)
query_param_impl(val_bind< T > v)
Definition: query.hxx:1642
unsigned short prec
Definition: query.hxx:67
friend query_base operator!=(const query_column &c, decayed_type v)
Definition: query.hxx:938
query_param_impl(val_bind< T > v)
Definition: query.hxx:1570
short scale
Definition: query.hxx:53
decay_traits< T >::type decayed_type
Definition: query.hxx:706
unsigned int ub4
Definition: oracle-fwd.hxx:20
query_base less_equal(ref_bind< T > r) const
Definition: query.hxx:1196
void append(const char *native)
Definition: query.hxx:442
buffer_type type
Definition: oracle-types.hxx:111
query_base less_equal(decayed_type v) const
Definition: query.hxx:1171
query(const query_base &q)
Definition: query.hxx:2173
Definition: query.hxx:163
query_base(const char *table, const char *column)
Definition: query.hxx:215
bool bool_part
Definition: query.hxx:184
query_base in_range(I begin, I end) const
query_param_impl(ref_bind< T > r)
Definition: query.hxx:2072
virtual void bind(bind_type *b)
Definition: query.hxx:1990
Definition: query.hxx:131
query(const std::string &q)
Definition: query.hxx:2224
static const query_base true_expr
Definition: query.hxx:290
virtual void bind(bind_type *b)
Definition: query.hxx:1894
query_param_impl(ref_bind< T > r)
Definition: query.hxx:1716
short scale
Definition: query.hxx:110
Definition: traits.hxx:63
query_base greater(val_bind< T > v) const
Definition: query.hxx:1087
kind_type kind
Definition: query.hxx:182
Definition: traits.hxx:54
static ref_bind< T > _ref(const T &x, unsigned short prec=0xFFF, short scale=0xFFF)
Definition: query.hxx:320
virtual void bind(bind_type *b)
Definition: query.hxx:1941
type val
Definition: query.hxx:65
query()
Definition: query.hxx:2207
const unsigned short descriptor_cache
Definition: oracle-types.hxx:171
ref_bind(ref_bind< const T * > r)
Definition: query.hxx:101
Definition: traits.hxx:45
unsigned short prec
Definition: query.hxx:52
query_param_impl(val_bind< T > v)
Definition: query.hxx:1973
query_base less(val_bind< T2 > v) const
Definition: query.hxx:1010
query_param_impl(val_bind< T > v)
Definition: query.hxx:1753
void * buffer
Definition: oracle-types.hxx:112
query_base less(decayed_type v) const
Definition: query.hxx:991
query_base unequal(val_bind< T2 > v) const
Definition: query.hxx:920
query_base less(ref_bind< T > r) const
Definition: query.hxx:1016
query_base()
Definition: query.hxx:187
Definition: query.hxx:57
query_param_impl(ref_bind< T > r)
Definition: query.hxx:1873
val_bind(type v, unsigned short p=0xFFF, short s=0xFFF)
Definition: query.hxx:47
type val
Definition: query.hxx:50
query_param_impl(val_bind< T > v)
Definition: query.hxx:1879
query_base like(val_bind< T2 > pattern, decayed_type escape) const
Definition: query.hxx:799
query_base like(val_bind< T2 > pattern) const
Definition: query.hxx:780
oracle::bind bind_type
Definition: query.hxx:133
friend query_base operator<=(const query_column &c, decayed_type v)
Definition: query.hxx:1208
bool empty() const
Definition: query.hxx:285
query_param_impl(ref_bind< T > r)
Definition: query.hxx:1966
virtual bool init()
Definition: query.hxx:2089
query_param_impl(val_bind< T > v)
Definition: query.hxx:1792
query_column(const char *table, const char *column, const char *)
Definition: query.hxx:1509
Definition: traits.hxx:53
static type instance()
Definition: traits.hxx:57
query_base less(val_bind< T > v) const
Definition: query.hxx:997
Definition: binding.hxx:21
query_base equal(decayed_type v) const
Definition: query.hxx:811
query_param_impl(ref_bind< T > r)
Definition: query.hxx:1791
short scale() const
Definition: query.hxx:689
query_base greater_equal(decayed_type v) const
Definition: query.hxx:1261
Definition: query.hxx:72
query_base is_null() const
Definition: query.hxx:1462
ref_bind(type r, unsigned short p=0xFFF, short s=0xFFF)
Definition: query.hxx:77
query_base is_null() const
Definition: query.hxx:731
unsigned short prec
Definition: query.hxx:85
LIBODB_ORACLE_EXPORT query_base operator||(const query_base &x, const query_base &y)
bool const_true() const
Definition: query.hxx:293
query_base equal(val_bind< T > v) const
Definition: query.hxx:817
Definition: traits.hxx:39
query(const char *q)
Definition: query.hxx:2148
Definition: traits.hxx:62
unsigned short prec() const
Definition: query.hxx:683
query(const oracle::query_column< bool, ID > &qc)
Definition: query.hxx:2249
struct OCIInterval OCIInterval
Definition: oracle-fwd.hxx:32
bool reference() const
Definition: query.hxx:139
query_base operator+(const query_base &x, const query_base &y)
Definition: query.hxx:461
virtual bool init()
Definition: query.hxx:1887
clause_part(kind_type k, const std::string &p)
Definition: query.hxx:179
virtual bool init()
Definition: query.hxx:1645
query_base(const char *native)
Definition: query.hxx:202
Definition: oracle-types.hxx:78
query_param_impl(val_bind< T > v)
Definition: query.hxx:2026
static val_bind_typed< T, ID > _val(const T &x, unsigned short prec=0xFFF, short scale=0xFFF)
Definition: query.hxx:313
static ref_bind_typed< T[N], ID > _ref(const T(&x)[N], unsigned short prec=0xFFF, short scale=0xFFF)
Definition: query.hxx:362
query_base greater_equal(val_bind< T > v) const
Definition: query.hxx:1267
virtual bool init()
Definition: query.hxx:1795
virtual bool init()
Definition: query.hxx:1841
query_param_impl(ref_bind< T > r)
Definition: query.hxx:1605
virtual void bind(bind_type *b)
Definition: query.hxx:1763
virtual void bind(bind_type *b)
Definition: query.hxx:1727
ref_bind(type r, unsigned short p=0xFFF, short s=0xFFF)
Definition: query.hxx:95
Definition: query.hxx:1447
query_base is_not_null() const
Definition: query.hxx:739
query_base greater(decayed_type v) const
Definition: query.hxx:1081
static ref_bind< T[N]> _ref(const T(&x)[N], unsigned short prec=0xFFF, short scale=0xFFF)
Definition: query.hxx:355
Definition: query.hxx:1562
query()
Definition: query.hxx:2137
query_base greater_equal(val_bind< T2 > v) const
Definition: query.hxx:1280
virtual bool init()
Definition: query.hxx:1983
virtual void bind(bind_type *b)
Definition: query.hxx:1652
query_param_impl(val_bind< T > v)
Definition: query.hxx:1833
unsigned short ub2
Definition: oracle-fwd.hxx:18
unsigned short prec
Definition: query.hxx:109
virtual void bind(bind_type *b)
Definition: query.hxx:2096
Definition: traits.hxx:44
const void * ptr() const
Definition: query.hxx:105
LIBODB_ORACLE_EXPORT query_base operator&&(const query_base &x, const query_base &y)
clause_part(kind_type k)
Definition: query.hxx:178
static val_bind_typed< T[N], ID > _val(const T(&x)[N], unsigned short prec=0xFFF, short scale=0xFFF)
Definition: query.hxx:348
std::string part
Definition: query.hxx:183
query_param_impl(val_bind< T > v)
Definition: query.hxx:1606
virtual void bind(bind_type *b)
Definition: query.hxx:1802
query(const odb::query_base &q)
Definition: query.hxx:2184
query_base(val_bind_typed< T, ID > v)
Definition: query.hxx:231
const T & type
Definition: query.hxx:74
ub4 capacity
Definition: oracle-types.hxx:117
Definition: traits.hxx:55
virtual bool init()
Definition: query.hxx:1684
const char * table_
Definition: query.hxx:695
short scale_
Definition: query.hxx:700
query_base less_equal(val_bind< T2 > v) const
Definition: query.hxx:1190
const void * value_
Definition: query.hxx:157
Definition: query.hxx:647
query_base(val_bind< T > v)
Definition: query.hxx:223
const T & type
Definition: query.hxx:44
query_column(const char *table, const char *column, const char *conv, unsigned short prec=0xFFF, short scale=0xFFF)
Definition: query.hxx:711
friend query_base operator>(const query_column &c, decayed_type v)
Definition: query.hxx:1118
query(bool v)
Definition: query.hxx:2142
const char * table() const
Definition: query.hxx:663
LIBODB_ORACLE_EXPORT query_base operator!(const query_base &x)
Definition: traits.hxx:64
query(const std::string &q)
Definition: query.hxx:2154
Definition: traits.hxx:50
const void * ptr() const
Definition: query.hxx:81
short scale
Definition: query.hxx:86
query(oracle::val_bind< T2 > v)
Definition: query.hxx:2231
static val_bind< T > _val(const T &x, unsigned short prec=0xFFF, short scale=0xFFF)
Definition: query.hxx:306
query_param_impl(val_bind< T > v)
Definition: query.hxx:1681
type ref
Definition: query.hxx:107
kind_type
Definition: query.hxx:170
query(const oracle::query_base &q)
Definition: query.hxx:2243
query(oracle::ref_bind< T2 > r)
Definition: query.hxx:2238
Definition: query.hxx:90
query_param_impl(ref_bind< T > r)
Definition: query.hxx:1919
query_param(const void *value)
Definition: query.hxx:151
Definition: traits.hxx:104
virtual bool init()
Definition: query.hxx:2036
query_param_impl(val_bind< T > v)
Definition: query.hxx:1717
ref_bind(ref_bind< T * > r)
Definition: query.hxx:100
lob_query_column(const char *table, const char *column)
Definition: query.hxx:1453
query_base unequal(ref_bind< T > r) const
Definition: query.hxx:926
ref_bind_typed(typename ref_bind< T >::type r, unsigned short p=0xFFF, short s=0xFFF)
Definition: query.hxx:126
friend query_base operator==(const query_column &c, decayed_type v)
Definition: query.hxx:848
Definition: query.hxx:114
Definition: traits.hxx:52
query_column(const char *table, const char *column, const char *)
Definition: query.hxx:1495
unsigned short prec_
Definition: query.hxx:699
const char * conversion_
Definition: query.hxx:697
const char * conversion() const
Definition: query.hxx:677
Definition: traits.hxx:58
const T * type
Definition: query.hxx:92
query_base greater_equal(ref_bind< T > r) const
Definition: query.hxx:1286
query_base in(decayed_type, decayed_type) const
query_base unequal(val_bind< T > v) const
Definition: query.hxx:907
query(bool v)
Definition: query.hxx:2212
Definition: query.hxx:2129
query_base equal(ref_bind< T > r) const
Definition: query.hxx:836
virtual bool init()
Definition: query.hxx:1934
query_param_impl(ref_bind< T > r)
Definition: query.hxx:1569
query(ref_bind< T2 > r)
Definition: query.hxx:2168
virtual bool init()
Definition: query.hxx:1609
query_base(ref_bind< T > r)
Definition: query.hxx:239
clause_part(bool p)
Definition: query.hxx:180
const char * column() const
Definition: query.hxx:669
virtual void bind(bind_type *b)
Definition: query.hxx:1616
query_base greater(ref_bind< T > r) const
Definition: query.hxx:1106
query(const char *q)
Definition: query.hxx:2218
query(val_bind< T2 > v)
Definition: query.hxx:2161
query_param_impl(ref_bind< T > r)
Definition: query.hxx:1827
Definition: query.hxx:168
virtual void bind(bind_type *b)
Definition: query.hxx:2043