aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2012-01-12 09:28:06 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2012-01-20 15:43:46 +0200
commit06b889850144910f1f908fc87f78114bde920596 (patch)
tree451bb55a04a83cbacecf21f67e671dc8124f7cf9
parent0ed8f3b5e49c5b9f9247cfc28aadb37d892ed39b (diff)
Query support for SQL Server
-rw-r--r--odb/relational/common.cxx7
-rw-r--r--odb/relational/common.hxx5
-rw-r--r--odb/relational/mssql/common.cxx78
-rw-r--r--odb/relational/mssql/header.cxx7
-rw-r--r--odb/relational/mssql/source.cxx12
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