diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2012-01-20 10:30:22 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2012-01-20 15:43:46 +0200 |
commit | 64cc9e9f0ed1ac6742ce9d5b370bf7de7b1cb461 (patch) | |
tree | ade429bd15d070efc66386d455745cb64ce8af22 /odb/relational/mssql/common.hxx | |
parent | 89c06fb9ce3470c7a1b55cc906f2165791917957 (diff) |
Work around SQL Server 2005 bug with long data and OUTPUT clause
Diffstat (limited to 'odb/relational/mssql/common.hxx')
-rw-r--r-- | odb/relational/mssql/common.hxx | 63 |
1 files changed, 63 insertions, 0 deletions
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 |