From 164e70a313ffd245d2760c838a5a30475b7b75ff Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 19 Nov 2014 13:54:39 +0200 Subject: Allow empty runtime and execute views Use them to handle INSERT/UPDATE SQL Server stored procedures. --- odb/relational/header.cxx | 13 +++---- odb/relational/source.cxx | 84 ++++++++++++++++++++++++-------------------- odb/relational/validator.cxx | 19 ++++++++++ odb/validator.cxx | 15 +++----- 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 ("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 ("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 -- cgit v1.1 From 19ba3497c0788f02fc417f441d87c96ce23f9446 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 19 Nov 2014 14:48:06 +0200 Subject: Bump version to 2.4.0.a4 --- odb/version.hxx | 8 ++++---- version | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/odb/version.hxx b/odb/version.hxx index 90003e9..ac831c1 100644 --- a/odb/version.hxx +++ b/odb/version.hxx @@ -24,12 +24,12 @@ // ODB interface version: minor, major, and alpha/beta versions. // -#define ODB_VERSION 20303 -#define ODB_VERSION_STR "2.4.a3" +#define ODB_VERSION 20304 +#define ODB_VERSION_STR "2.4.a4" // ODB compiler version: interface version plus the bugfix version. // -#define ODB_COMPILER_VERSION 2039903 -#define ODB_COMPILER_VERSION_STR "2.4.0.a3" +#define ODB_COMPILER_VERSION 2039904 +#define ODB_COMPILER_VERSION_STR "2.4.0.a4" #endif // ODB_VERSION_HXX diff --git a/version b/version index 26d9ac3..42645da 100644 --- a/version +++ b/version @@ -1 +1 @@ -2.4.0.a3 +2.4.0.a4 -- cgit v1.1