diff options
Diffstat (limited to 'odb/relational/schema.cxx')
-rw-r--r-- | odb/relational/schema.cxx | 157 |
1 files changed, 31 insertions, 126 deletions
diff --git a/odb/relational/schema.cxx b/odb/relational/schema.cxx index 031bf64..8a06427 100644 --- a/odb/relational/schema.cxx +++ b/odb/relational/schema.cxx @@ -3,8 +3,6 @@ // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // license : GNU GPL v3; see accompanying LICENSE file -#include <odb/gcc.hxx> - #include <cassert> #include <limits> #include <sstream> @@ -20,101 +18,6 @@ namespace relational { namespace schema { - // object_columns - // - void object_columns:: - default_ (semantics::data_member& m) - { - default_value* dv (0); - - semantics::type& t (utype (m)); - - if (m.count ("default")) - dv = &m.get<default_value> ("default"); - else if (t.count ("default")) - dv = &t.get<default_value> ("default"); - else - return; // No default value for this column. - - switch (dv->kind) - { - case default_value::reset: - { - // No default value. - break; - } - case default_value::null: - { - default_null (m); - break; - } - case default_value::boolean: - { - default_bool (m, dv->value == "true"); - break; - } - case default_value::number: - { - tree n (dv->node); - - switch (TREE_CODE (n)) - { - case INTEGER_CST: - { - HOST_WIDE_INT hwl (TREE_INT_CST_LOW (n)); - HOST_WIDE_INT hwh (TREE_INT_CST_HIGH (n)); - - unsigned long long l (hwl); - unsigned long long h (hwh); - unsigned short width (HOST_BITS_PER_WIDE_INT); - - unsigned long long v ((h << width) + l); - - default_integer (m, v, dv->value == "-"); - break; - } - case REAL_CST: - { - double v; - - REAL_VALUE_TYPE d (TREE_REAL_CST (n)); - - if (REAL_VALUE_ISINF (d)) - v = numeric_limits<double>::infinity (); - else if (REAL_VALUE_ISNAN (d)) - v = numeric_limits<double>::quiet_NaN (); - else - { - char tmp[256]; - real_to_decimal (tmp, &d, sizeof (tmp), 0, true); - istringstream is (tmp); - is >> v; - } - - if (dv->value == "-") - v = -v; - - default_float (m, v); - break; - } - default: - assert (false); - } - break; - } - case default_value::string: - { - default_string (m, dv->value); - break; - } - case default_value::enumerator: - { - default_enum (m, dv->node, dv->value); - break; - } - } - } - static char const file_header[] = "/* This file was generated by ODB, object-relational mapping (ORM)\n" " * compiler for C++.\n" @@ -128,33 +31,36 @@ namespace relational os << file_header; - instance<schema_emitter> emitter; - instance<schema_file> file; - file->pre (); + file->prologue (); + + instance<schema_emitter> em; + emitter_ostream emos (*em); + + schema_format f (schema_format::sql); // Drop. // { - traversal::unit unit; - traversal::defines unit_defines; - traversal::namespace_ ns; - instance<class_drop> c (*emitter); - unit >> unit_defines >> ns; - unit_defines >> c; + instance<drop_model> model (*em, emos, f); + trav_rel::names names; + instance<drop_table> table (*em, emos, f); + instance<drop_index> index (*em, emos, f); - traversal::defines ns_defines; - - ns >> ns_defines >> ns; - ns_defines >> c; + model >> names; + names >> table; + names >> index; // Pass 1 and 2. // for (unsigned short pass (1); pass < 3; ++pass) { - c->pass (pass); - unit.dispatch (ctx.unit); + model->pass (pass); + table->pass (pass); + index->pass (pass); + + model->traverse (*ctx.model); } } @@ -163,29 +69,28 @@ namespace relational // Create. // { - traversal::unit unit; - traversal::defines unit_defines; - traversal::namespace_ ns; - instance<class_create> c (*emitter); + instance<create_model> model (*em, emos, f); + trav_rel::names names; + instance<create_table> table (*em, emos, f); + instance<create_index> index (*em, emos, f); - unit >> unit_defines >> ns; - unit_defines >> c; - - traversal::defines ns_defines; - - ns >> ns_defines >> ns; - ns_defines >> c; + model >> names; + names >> table; + names >> index; // Pass 1 and 2. // for (unsigned short pass (1); pass < 3; ++pass) { - c->pass (pass); - unit.dispatch (ctx.unit); + model->pass (pass); + table->pass (pass); + index->pass (pass); + + model->traverse (*ctx.model); } } - file->post (); + file->epilogue (); } } } |