From 64cc9e9f0ed1ac6742ce9d5b370bf7de7b1cb461 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 20 Jan 2012 10:30:22 +0200 Subject: Work around SQL Server 2005 bug with long data and OUTPUT clause --- odb/relational/mssql/common.hxx | 63 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) (limited to 'odb/relational/mssql/common.hxx') diff --git a/odb/relational/mssql/common.hxx b/odb/relational/mssql/common.hxx index 5bd37f5..eacc435 100644 --- a/odb/relational/mssql/common.hxx +++ b/odb/relational/mssql/common.hxx @@ -357,6 +357,69 @@ namespace relational private: string type_id_; }; + + struct has_long_data: object_columns_base, context + { + has_long_data (bool& r): r_ (r) {} + + virtual bool + traverse_column (semantics::data_member& m, string const&, bool) + { + if (inverse (m)) + return false; + + sql_type const& st (column_sql_type (m)); + + switch (st.type) + { + case sql_type::CHAR: + case sql_type::VARCHAR: + { + // Zero precision means max in VARCHAR(max). + // + if (st.prec == 0 || st.prec > options.mssql_short_limit ()) + r_ = true; + + break; + } + case sql_type::NCHAR: + case sql_type::NVARCHAR: + { + // Zero precision means max in NVARCHAR(max). Note that + // the precision is in 2-byte UCS-2 characters, not bytes. + // + if (st.prec == 0 || st.prec * 2 > options.mssql_short_limit ()) + r_ = true; + + break; + } + case sql_type::BINARY: + case sql_type::VARBINARY: + { + // Zero precision means max in VARCHAR(max). + // + if (st.prec == 0 || st.prec > options.mssql_short_limit ()) + r_ = true; + + break; + } + case sql_type::TEXT: + case sql_type::NTEXT: + case sql_type::IMAGE: + { + r_ = true; + break; + } + default: + break; + } + + return true; + } + + private: + bool& r_; + }; } } #endif // ODB_RELATIONAL_MSSQL_COMMON_HXX -- cgit v1.1