aboutsummaryrefslogtreecommitdiff
path: root/odb/query-dynamic.txx
blob: 8bd1d6a7a77010d1bb3c10a90f55b5a71d48e485 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// file      : odb/query-dynamic.txx
// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC
// license   : GNU GPL v2; see accompanying LICENSE file

namespace odb
{
  // query_base
  //
  template <typename T>
  void query_base::
  append_val (const T& val, const native_column_info* c)
  {
    clause_.push_back (clause_part ());
    clause_part& p (clause_.back ());

    p.kind = clause_part::kind_param_val;
    p.data = 0; // In case new below throws.
    p.native_info = c;

    query_param* qp (new (details::shared) val_query_param<T> (val));
    p.data = reinterpret_cast<std::size_t> (qp);
  }

  // query_column
  //
  template <typename T>
  query_base query_column<T>::
  in (const T& v1, const T& v2) const
  {
    query_base q (native_info);
    q.append_val (v1, native_info);
    q.append_val (v2, native_info);
    q.append (query_base::clause_part::op_in, 2);
    return q;
  }

  template <typename T>
  query_base query_column<T>::
  in (const T& v1, const T& v2, const T& v3) const
  {
    query_base q (native_info);
    q.append_val (v1, native_info);
    q.append_val (v2, native_info);
    q.append_val (v3, native_info);
    q.append (query_base::clause_part::op_in, 3);
    return q;
  }

  template <typename T>
  query_base query_column<T>::
  in (const T& v1, const T& v2, const T& v3, const T& v4) const
  {
    query_base q (native_info);
    q.append_val (v1, native_info);
    q.append_val (v2, native_info);
    q.append_val (v3, native_info);
    q.append_val (v4, native_info);
    q.append (query_base::clause_part::op_in, 4);
    return q;
  }

  template <typename T>
  query_base query_column<T>::
  in (const T& v1, const T& v2, const T& v3, const T& v4, const T& v5) const
  {
    query_base q (native_info);
    q.append_val (v1, native_info);
    q.append_val (v2, native_info);
    q.append_val (v3, native_info);
    q.append_val (v4, native_info);
    q.append_val (v5, native_info);
    q.append (query_base::clause_part::op_in, 5);
    return q;
  }

  template <typename T>
  template <typename I>
  query_base query_column<T>::
  in_range (I i, I end) const
  {
    query_base q (native_info);

    std::size_t n (0);
    for (; i != end; ++i, ++n)
      q.append_val<T> (*i, native_info); // Force implicit conversion.

    q.append (query_base::clause_part::op_in, n);
    return q;
  }
}