aboutsummaryrefslogtreecommitdiff
path: root/odb
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2014-11-19 13:54:39 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2014-11-19 13:54:39 +0200
commit164e70a313ffd245d2760c838a5a30475b7b75ff (patch)
treea3f54abbea691e4a7f7d5f73af70576dd7613d28 /odb
parentd59e3c27450747e5a04585ee9e943376b5bcfa41 (diff)
Allow empty runtime and execute views
Use them to handle INSERT/UPDATE SQL Server stored procedures.
Diffstat (limited to 'odb')
-rw-r--r--odb/relational/header.cxx13
-rw-r--r--odb/relational/source.cxx84
-rw-r--r--odb/relational/validator.cxx19
-rw-r--r--odb/validator.cxx15
4 files changed, 74 insertions, 57 deletions
diff --git a/odb/relational/header.cxx b/odb/relational/header.cxx
index 476aad3..392d5f1 100644
--- a/odb/relational/header.cxx
+++ b/odb/relational/header.cxx
@@ -749,6 +749,7 @@ traverse_view (type& c)
bool versioned (context::versioned (c));
string const& type (class_fq_name (c));
+ size_t columns (column_count (c).total);
size_t obj_count (c.get<size_t> ("object-count"));
os << "// " << class_name (c) << endl
@@ -826,8 +827,7 @@ traverse_view (type& c)
os << "," << endl
<< "const schema_version_migration&";
- os << ");"
- << endl;
+ os << ")" << (columns != 0 ? ";\n" : "{}");
}
// bind (image_type)
@@ -840,8 +840,7 @@ traverse_view (type& c)
os << "," << endl
<< "const schema_version_migration&";
- os << ");"
- << endl;
+ os << ")" << (columns != 0 ? ";\n" : "{}");
// init (view, image)
//
@@ -854,13 +853,11 @@ traverse_view (type& c)
os << "," << endl
<< "const schema_version_migration&";
- os << ");"
- << endl;
+ os << ")" << (columns != 0 ? ";\n" : "{}");
// column_count
//
- os << "static const std::size_t column_count = " <<
- column_count (c).total << "UL;"
+ os << "static const std::size_t column_count = " << columns << "UL;"
<< endl;
// Statements.
diff --git a/odb/relational/source.cxx b/odb/relational/source.cxx
index 33bda4b..db288f6 100644
--- a/odb/relational/source.cxx
+++ b/odb/relational/source.cxx
@@ -4158,6 +4158,8 @@ traverse_view (type& c)
string traits ("access::view_traits_impl< " + type + ", id_" +
db.string () + " >");
+ size_t columns (column_count (c).total);
+
// Schema name as a string literal or empty.
//
string schema_name (options.schema_name ()[db]);
@@ -4181,7 +4183,7 @@ traverse_view (type& c)
// grow ()
//
- if (generate_grow)
+ if (generate_grow && columns != 0)
{
os << "bool " << traits << "::" << endl
<< "grow (image_type& i," << endl
@@ -4212,58 +4214,64 @@ traverse_view (type& c)
// bind (image_type)
//
- os << "void " << traits << "::" << endl
- << "bind (" << bind_vector << " b," << endl
- << "image_type& i";
+ if (columns != 0)
+ {
+ os << "void " << traits << "::" << endl
+ << "bind (" << bind_vector << " b," << endl
+ << "image_type& i";
- if (versioned)
- os << "," << endl
- << "const schema_version_migration& svm";
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration& svm";
- os << ")"
- << "{";
+ os << ")"
+ << "{";
- if (versioned)
- os << "ODB_POTENTIALLY_UNUSED (svm);"
- << endl;
+ if (versioned)
+ os << "ODB_POTENTIALLY_UNUSED (svm);"
+ << endl;
- os << "using namespace " << db << ";"
- << endl
- << db << "::statement_kind sk (statement_select);"
- << "ODB_POTENTIALLY_UNUSED (sk);"
- << endl
- << "std::size_t n (0);"
- << endl;
+ os << "using namespace " << db << ";"
+ << endl
+ << db << "::statement_kind sk (statement_select);"
+ << "ODB_POTENTIALLY_UNUSED (sk);"
+ << endl
+ << "std::size_t n (0);"
+ << endl;
- names (c, bind_member_names_);
+ names (c, bind_member_names_);
- os << "}";
+ os << "}";
+ }
// init (view, image)
//
- os << "void " << traits << "::" << endl
- << "init (view_type& o," << endl
- << "const image_type& i," << endl
- << "database* db";
+ if (columns != 0)
+ {
+ os << "void " << traits << "::" << endl
+ << "init (view_type& o," << endl
+ << "const image_type& i," << endl
+ << "database* db";
- if (versioned)
- os << "," << endl
- << "const schema_version_migration& svm";
+ if (versioned)
+ os << "," << endl
+ << "const schema_version_migration& svm";
- os << ")"
- << "{"
- << "ODB_POTENTIALLY_UNUSED (o);"
- << "ODB_POTENTIALLY_UNUSED (i);"
- << "ODB_POTENTIALLY_UNUSED (db);";
+ os << ")"
+ << "{"
+ << "ODB_POTENTIALLY_UNUSED (o);"
+ << "ODB_POTENTIALLY_UNUSED (i);"
+ << "ODB_POTENTIALLY_UNUSED (db);";
- if (versioned)
- os << "ODB_POTENTIALLY_UNUSED (svm);";
+ if (versioned)
+ os << "ODB_POTENTIALLY_UNUSED (svm);";
- os << endl;
+ os << endl;
- names (c, init_value_member_names_);
+ names (c, init_value_member_names_);
- os << "}";
+ os << "}";
+ }
// query_statement()
//
diff --git a/odb/relational/validator.cxx b/odb/relational/validator.cxx
index 9705121..3c8c327 100644
--- a/odb/relational/validator.cxx
+++ b/odb/relational/validator.cxx
@@ -431,11 +431,30 @@ namespace relational
virtual void
traverse_view (type& c)
{
+ const view_query& vq (c.get<view_query> ("query"));
+
// Make sure we don't have any containers or object pointers.
//
view_members_.traverse (c);
names (c, data_member_names_);
+
+ // Allow certain kinds of empty views.
+ //
+ if (vq.kind != view_query::runtime &&
+ vq.kind != view_query::complete_execute)
+ {
+ // Allow all the members to be deleted.
+ //
+ column_count_type const& cc (column_count (c));
+
+ if (cc.total == 0)
+ {
+ os << c.file () << ":" << c.line () << ":" << c.column () << ":"
+ << " error: no persistent data members in the class" << endl;
+ valid_ = false;
+ }
+ }
}
virtual void
diff --git a/odb/validator.cxx b/odb/validator.cxx
index f8f7408..4bd4c95 100644
--- a/odb/validator.cxx
+++ b/odb/validator.cxx
@@ -1423,18 +1423,11 @@ namespace
}
virtual void
- traverse_view (type& c)
+ traverse_view (type&)
{
- // Allow all the members to be deleted.
- //
- column_count_type const& cc (column_count (c));
-
- if (cc.total == 0)
- {
- os << c.file () << ":" << c.line () << ":" << c.column () << ":"
- << " error: no persistent data members in the class" << endl;
- valid_ = false;
- }
+ // We don't check for the column count here since we may want to
+ // allow certain kinds of empty views. Instead, this is handled
+ // in relational::validation.
}
virtual void