aboutsummaryrefslogtreecommitdiff
path: root/odb/relational
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2013-10-15 07:01:17 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2013-10-15 07:01:17 +0200
commita482f1c4dd4efab83d3b19309900f1cbf54383a5 (patch)
tree3c1ab27e420cbf760a54a1c4be61bbd0448a4873 /odb/relational
parent400d258aab3722be3a4b8548870afad1574f3ad8 (diff)
Automatically map C++11 enum classes (strong enums)
Diffstat (limited to 'odb/relational')
-rw-r--r--odb/relational/mssql/context.cxx9
-rw-r--r--odb/relational/mysql/context.cxx59
-rw-r--r--odb/relational/oracle/context.cxx9
-rw-r--r--odb/relational/pgsql/context.cxx9
-rw-r--r--odb/relational/sqlite/context.cxx9
5 files changed, 31 insertions, 64 deletions
diff --git a/odb/relational/mssql/context.cxx b/odb/relational/mssql/context.cxx
index 1df235d..a0037eb 100644
--- a/odb/relational/mssql/context.cxx
+++ b/odb/relational/mssql/context.cxx
@@ -156,18 +156,11 @@ namespace relational
if (!r.empty ())
return r;
- using semantics::enum_;
using semantics::array;
- // Enum mapping.
- //
- if (t.is_a<semantics::enum_> ())
- {
- r = "INT";
- }
// char[N] mapping.
//
- else if (array* a = dynamic_cast<array*> (&t))
+ if (array* a = dynamic_cast<array*> (&t))
{
semantics::type& bt (a->base_type ());
bool c (bt.is_a<semantics::fund_char> ());
diff --git a/odb/relational/mysql/context.cxx b/odb/relational/mysql/context.cxx
index 75b71e9..55dd4f7 100644
--- a/odb/relational/mysql/context.cxx
+++ b/odb/relational/mysql/context.cxx
@@ -286,15 +286,12 @@ namespace relational
bool id,
bool* null)
{
- string r (base_context::database_type_impl (t, hint, id, null));
-
- if (!r.empty ())
- return r;
-
using semantics::enum_;
using semantics::enumerator;
using semantics::array;
+ string r;
+
// Enum mapping.
//
if (enum_* e = dynamic_cast<enum_*> (&t))
@@ -302,43 +299,41 @@ namespace relational
// We can only map to ENUM if the C++ enumeration is contiguous
// and starts with 0.
//
- if (e->unsigned_ ())
+ enum_::enumerates_iterator i (e->enumerates_begin ()),
+ end (e->enumerates_end ());
+
+ if (i != end)
{
- enum_::enumerates_iterator i (e->enumerates_begin ()),
- end (e->enumerates_end ());
+ r += "ENUM(";
- if (i != end)
+ for (unsigned long long j (0); i != end; ++i, ++j)
{
- r += "ENUM(";
-
- for (unsigned long long j (0); i != end; ++i, ++j)
- {
- enumerator const& er (i->enumerator ());
+ enumerator const& er (i->enumerator ());
- if (er.value () != j)
- break;
-
- if (j != 0)
- r += ", ";
+ if (er.value () != j)
+ break;
- r += quote_string (er.name ());
- }
+ if (j != 0)
+ r += ", ";
- if (i == end)
- r += ")";
- else
- r.clear ();
+ r += quote_string (er.name ());
}
- }
-
- if (r.empty ())
- {
- r = "INT";
- if (e->unsigned_ ())
- r += " UNSIGNED";
+ if (i == end)
+ r += ")";
+ else
+ r.clear ();
}
+
+ if (!r.empty ())
+ return r;
}
+
+ r = base_context::database_type_impl (t, hint, id, null);
+
+ if (!r.empty ())
+ return r;
+
// char[N] mapping.
//
else if (array* a = dynamic_cast<array*> (&t))
diff --git a/odb/relational/oracle/context.cxx b/odb/relational/oracle/context.cxx
index f885564..98cda52 100644
--- a/odb/relational/oracle/context.cxx
+++ b/odb/relational/oracle/context.cxx
@@ -152,18 +152,11 @@ namespace relational
if (!r.empty ())
return r;
- using semantics::enum_;
using semantics::array;
- // Enum mapping.
- //
- if (t.is_a<semantics::enum_> ())
- {
- r = "NUMBER(10)";
- }
// char[N] mapping.
//
- else if (array* a = dynamic_cast<array*> (&t))
+ if (array* a = dynamic_cast<array*> (&t))
{
semantics::type& bt (a->base_type ());
if (bt.is_a<semantics::fund_char> ())
diff --git a/odb/relational/pgsql/context.cxx b/odb/relational/pgsql/context.cxx
index 947c6bd..d09fa2c 100644
--- a/odb/relational/pgsql/context.cxx
+++ b/odb/relational/pgsql/context.cxx
@@ -252,18 +252,11 @@ namespace relational
if (!r.empty ())
return r;
- using semantics::enum_;
using semantics::array;
- // Enum mapping.
- //
- if (t.is_a<semantics::enum_> ())
- {
- r = "INTEGER";
- }
// char[N] mapping.
//
- else if (array* a = dynamic_cast<array*> (&t))
+ if (array* a = dynamic_cast<array*> (&t))
{
semantics::type& bt (a->base_type ());
if (bt.is_a<semantics::fund_char> ())
diff --git a/odb/relational/sqlite/context.cxx b/odb/relational/sqlite/context.cxx
index 664af35..f347d30 100644
--- a/odb/relational/sqlite/context.cxx
+++ b/odb/relational/sqlite/context.cxx
@@ -242,18 +242,11 @@ namespace relational
if (!r.empty ())
return r;
- using semantics::enum_;
using semantics::array;
- // Enum mapping.
- //
- if (t.is_a<semantics::enum_> ())
- {
- r = "INTEGER";
- }
// char[N] mapping.
//
- else if (array* a = dynamic_cast<array*> (&t))
+ if (array* a = dynamic_cast<array*> (&t))
{
semantics::type& bt (a->base_type ());
if (bt.is_a<semantics::fund_char> () ||