From 06b889850144910f1f908fc87f78114bde920596 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 12 Jan 2012 09:28:06 +0200 Subject: Query support for SQL Server --- odb/relational/common.cxx | 7 ++-- odb/relational/common.hxx | 5 +++ odb/relational/mssql/common.cxx | 78 +++++++++++++++++++++++++++++++++++++++++ odb/relational/mssql/header.cxx | 7 +--- odb/relational/mssql/source.cxx | 12 +------ 5 files changed, 90 insertions(+), 19 deletions(-) (limited to 'odb') 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 " << 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 -- cgit v1.1