aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2013-02-21 11:07:25 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2013-02-21 11:10:21 +0200
commit6a0748d8fc5bdc7e584ca557f07ce53a796fd384 (patch)
treeb71b7ef14511b49c53fdb6aa39f7ff8b3209f350
parentc3c82a4c2ed3d82bb23eef9cd1aee181756d7015 (diff)
Add support for pattern matching (SQL LIKE)
-rw-r--r--odb/mssql/query-dynamic.cxx16
-rw-r--r--odb/mssql/query.hxx41
-rw-r--r--odb/mssql/query.txx51
3 files changed, 108 insertions, 0 deletions
diff --git a/odb/mssql/query-dynamic.cxx b/odb/mssql/query-dynamic.cxx
index fdcdd27..954cb16 100644
--- a/odb/mssql/query-dynamic.cxx
+++ b/odb/mssql/query-dynamic.cxx
@@ -110,6 +110,22 @@ namespace odb
q += ")";
break;
}
+ case part::op_like:
+ {
+ translate (q, s, p - 2); // column
+ q += "LIKE";
+ translate (q, s, p - 1); // pattern
+ break;
+ }
+ case part::op_like_escape:
+ {
+ translate (q, s, p - 3); // column
+ q += "LIKE";
+ translate (q, s, p - 2); // pattern
+ q += "ESCAPE";
+ translate (q, s, p - 1); // escape
+ break;
+ }
case part::op_eq:
case part::op_ne:
case part::op_lt:
diff --git a/odb/mssql/query.hxx b/odb/mssql/query.hxx
index a369746..0c87fa1 100644
--- a/odb/mssql/query.hxx
+++ b/odb/mssql/query.hxx
@@ -763,6 +763,47 @@ namespace odb
query_base
in_range (I begin, I end) const;
+ // like
+ //
+ public:
+ query_base
+ like (decayed_type pattern) const
+ {
+ return like (val_bind<T> (pattern));
+ }
+
+ query_base
+ like (val_bind<T> pattern) const;
+
+ template <typename T2>
+ query_base
+ like (val_bind<T2> pattern) const
+ {
+ return like (val_bind<T> (decayed_type (pattern.val)));
+ }
+
+ query_base
+ like (ref_bind<T> pattern) const;
+
+ query_base
+ like (decayed_type pattern, decayed_type escape) const
+ {
+ return like (val_bind<T> (pattern), escape);
+ }
+
+ query_base
+ like (val_bind<T> pattern, decayed_type escape) const;
+
+ template <typename T2>
+ query_base
+ like (val_bind<T2> pattern, decayed_type escape) const
+ {
+ return like (val_bind<T> (decayed_type (pattern.val)), escape);
+ }
+
+ query_base
+ like (ref_bind<T> pattern, decayed_type escape) const;
+
// =
//
public:
diff --git a/odb/mssql/query.txx b/odb/mssql/query.txx
index 6b72167..badc678 100644
--- a/odb/mssql/query.txx
+++ b/odb/mssql/query.txx
@@ -6,6 +6,7 @@ namespace odb
{
namespace mssql
{
+ //
// query_base
//
@@ -23,8 +24,12 @@ namespace odb
c.conversion ());
}
+ //
// query_column
//
+
+ // in
+ //
template <typename T, database_type_id ID>
query_base query_column<T, ID>::
in (decayed_type v1, decayed_type v2) const
@@ -110,5 +115,51 @@ namespace odb
q += ")";
return q;
}
+
+ // like
+ //
+ template <typename T, database_type_id ID>
+ query_base query_column<T, ID>::
+ like (val_bind<T> p) const
+ {
+ query_base q (table_, column_);
+ q += "LIKE";
+ q.append<T, ID> (p, conversion_);
+ return q;
+ }
+
+ template <typename T, database_type_id ID>
+ query_base query_column<T, ID>::
+ like (ref_bind<T> p) const
+ {
+ query_base q (table_, column_);
+ q += "LIKE";
+ q.append<T, ID> (p, conversion_);
+ return q;
+ }
+
+ template <typename T, database_type_id ID>
+ query_base query_column<T, ID>::
+ like (val_bind<T> p, decayed_type e) const
+ {
+ query_base q (table_, column_);
+ q += "LIKE";
+ q.append<T, ID> (p, conversion_);
+ q += "ESCAPE";
+ q.append<T, ID> (val_bind<T> (e), conversion_);
+ return q;
+ }
+
+ template <typename T, database_type_id ID>
+ query_base query_column<T, ID>::
+ like (ref_bind<T> p, decayed_type e) const
+ {
+ query_base q (table_, column_);
+ q += "LIKE";
+ q.append<T, ID> (p, conversion_);
+ q += "ESCAPE";
+ q.append<T, ID> (val_bind<T> (e), conversion_);
+ return q;
+ }
}
}