diff options
-rw-r--r-- | odb/relational/common.cxx | 7 | ||||
-rw-r--r-- | odb/relational/common.hxx | 5 | ||||
-rw-r--r-- | odb/relational/mssql/common.cxx | 78 | ||||
-rw-r--r-- | odb/relational/mssql/header.cxx | 7 | ||||
-rw-r--r-- | odb/relational/mssql/source.cxx | 12 |
5 files changed, 90 insertions, 19 deletions
diff --git a/odb/relational/common.cxx b/odb/relational/common.cxx index 92e2c8f..2d8f8d6 100644 --- a/odb/relational/common.cxx +++ b/odb/relational/common.cxx @@ -291,8 +291,11 @@ namespace relational { os << "template <const char* table>" << endl << "const typename " << scope_ << "::" << name << "_type_" << endl - << scope_ << "::" << name << " (" << - "table, " << strlit (column) << ");" + << scope_ << "::" << name << " (" << "table, " << strlit (column); + + column_ctor_extra (m); + + os << ");" << endl; } diff --git a/odb/relational/common.hxx b/odb/relational/common.hxx index 1627a74..e7400c7 100644 --- a/odb/relational/common.hxx +++ b/odb/relational/common.hxx @@ -91,6 +91,11 @@ namespace relational } virtual void + column_ctor_extra (semantics::data_member&) + { + } + + virtual void traverse_object (semantics::class_&); virtual void diff --git a/odb/relational/mssql/common.cxx b/odb/relational/mssql/common.cxx index f9c89e0..3112c2d 100644 --- a/odb/relational/mssql/common.cxx +++ b/odb/relational/mssql/common.cxx @@ -550,6 +550,84 @@ namespace relational return member_database_type_id_.database_type_id (m); } + virtual void + column_ctor_extra (semantics::data_member& m) + { + // For some types we need to pass precision and scale. + // + sql_type const& st (column_sql_type (m)); + + switch (st.type) + { + case sql_type::DECIMAL: + { + os << ", " << st.prec << ", " << st.scale; + break; + } + case sql_type::FLOAT: + { + os << ", " << st.prec; + break; + } + case sql_type::CHAR: + case sql_type::VARCHAR: + { + os << ", " << st.prec; + break; + } + case sql_type::TEXT: + { + os << ", 0"; // Unlimited. + break; + } + case sql_type::NCHAR: + case sql_type::NVARCHAR: + { + os << ", " << st.prec; // In 2-byte characters. + break; + } + case sql_type::NTEXT: + { + os << ", 0"; // Unlimited. + break; + } + case sql_type::BINARY: + case sql_type::VARBINARY: + { + os << ", " << st.prec; + break; + } + case sql_type::IMAGE: + { + os << ", 0"; // Unlimited. + break; + } + // Date-time types. + // + case sql_type::TIME: + case sql_type::DATETIME2: + case sql_type::DATETIMEOFFSET: + { + os << ", 0, " << st.scale; // Fractional seconds (scale). + break; + } + case sql_type::DATETIME: + { + os << ", 0, 3"; + break; + } + case sql_type::SMALLDATETIME: + { + os << ", 0, 8"; + break; + } + default: + { + break; + } + } + } + private: member_database_type_id member_database_type_id_; }; diff --git a/odb/relational/mssql/header.cxx b/odb/relational/mssql/header.cxx index 07f9521..01de123 100644 --- a/odb/relational/mssql/header.cxx +++ b/odb/relational/mssql/header.cxx @@ -25,9 +25,6 @@ namespace relational { if (!(composite (c) || abstract (c))) { - /* - @@ TODO - bool gc (options.generate_query ()); if (gc) @@ -43,9 +40,7 @@ namespace relational else os << "return 0;"; - os << "}" - << endl; - */ + os << "}"; } } }; diff --git a/odb/relational/mssql/source.cxx b/odb/relational/mssql/source.cxx index 5bb69c5..0e449dd 100644 --- a/odb/relational/mssql/source.cxx +++ b/odb/relational/mssql/source.cxx @@ -1260,22 +1260,12 @@ namespace relational class_ (base const& x): base (x) {} virtual void - init_auto_id (semantics::data_member&, string const&) + init_image_pre (type& c) { - // We are not sending anything for IDENTITY columns. - } - - virtual void - init_image_pre (type& /*c*/) - { - /* - @@ TODO - if (options.generate_query () && !(composite (c) || abstract (c))) os << "if (i.change_callback_.callback != 0)" << endl << "(i.change_callback_.callback) (i.change_callback_.context);" << endl; - */ } virtual void |