From c94fb9e51326cf4528574e191f9375e9cb22c723 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 13 Sep 2012 12:47:07 +0200 Subject: Add --omit-drop and --omit-create options --- NEWS | 3 + odb/generator.cxx | 190 ++++++++++++++++++++++++++++------------------ odb/options.cli | 10 +++ odb/relational/schema.hxx | 13 +++- 4 files changed, 140 insertions(+), 76 deletions(-) diff --git a/NEWS b/NEWS index 475765d..8502a73 100644 --- a/NEWS +++ b/NEWS @@ -85,6 +85,9 @@ Version 2.1.0 of custom SQL between the DROP and CREATE statements in the generated database schema file. + * New options, --omit-drop and --omit-create, trigger the omission of DROP + and CREATE statements, respectively, from the generated database schema. + * New ODB manual section, 6.3 "Circular Relationships", explains how to handle persistent classes with circular dependencies that are defined in separate headers. diff --git a/odb/generator.cxx b/odb/generator.cxx index 8b03006..d4e1505 100644 --- a/odb/generator.cxx +++ b/odb/generator.cxx @@ -284,12 +284,15 @@ generate (options const& ops, // Copy prologue. // - hxx << "// Begin prologue." << endl - << "//" << endl; - append (hxx, ops.hxx_prologue (), ops.hxx_prologue_file ()); - hxx << "//" << endl - << "// End prologue." << endl - << endl; + if (!ops.hxx_prologue ().empty () || !ops.hxx_prologue_file ().empty ()) + { + hxx << "// Begin prologue." << endl + << "//" << endl; + append (hxx, ops.hxx_prologue (), ops.hxx_prologue_file ()); + hxx << "//" << endl + << "// End prologue." << endl + << endl; + } // Include main file(s). // @@ -331,12 +334,15 @@ generate (options const& ops, // Copy epilogue. // - hxx << "// Begin epilogue." << endl - << "//" << endl; - append (hxx, ops.hxx_epilogue (), ops.hxx_epilogue_file ()); - hxx << "//" << endl - << "// End epilogue." << endl - << endl; + if (!ops.hxx_epilogue ().empty () || !ops.hxx_epilogue_file ().empty ()) + { + hxx << "// Begin epilogue." << endl + << "//" << endl; + append (hxx, ops.hxx_epilogue (), ops.hxx_epilogue_file ()); + hxx << "//" << endl + << "// End epilogue." << endl + << endl; + } hxx << "#include " << endl << endl; @@ -360,12 +366,15 @@ generate (options const& ops, // Copy prologue. // - ixx << "// Begin prologue." << endl - << "//" << endl; - append (ixx, ops.ixx_prologue (), ops.ixx_prologue_file ()); - ixx << "//" << endl - << "// End prologue." << endl - << endl; + if (!ops.ixx_prologue ().empty () || !ops.ixx_prologue_file ().empty ()) + { + ixx << "// Begin prologue." << endl + << "//" << endl; + append (ixx, ops.ixx_prologue (), ops.ixx_prologue_file ()); + ixx << "//" << endl + << "// End prologue." << endl + << endl; + } { // We don't want to indent prologues/epilogues. @@ -390,11 +399,14 @@ generate (options const& ops, // Copy epilogue. // - ixx << "// Begin epilogue." << endl - << "//" << endl; - append (ixx, ops.ixx_epilogue (), ops.ixx_epilogue_file ()); - ixx << "//" << endl - << "// End epilogue." << endl; + if (!ops.ixx_epilogue ().empty () || !ops.ixx_epilogue_file ().empty ()) + { + ixx << "// Begin epilogue." << endl + << "//" << endl; + append (ixx, ops.ixx_epilogue (), ops.ixx_epilogue_file ()); + ixx << "//" << endl + << "// End epilogue." << endl; + } if (ops.show_sloc ()) cerr << ixx_name << ": " << sloc.stream ().count () << endl; @@ -416,12 +428,15 @@ generate (options const& ops, // Copy prologue. // - cxx << "// Begin prologue." << endl - << "//" << endl; - append (cxx, ops.cxx_prologue (), ops.cxx_prologue_file ()); - cxx << "//" << endl - << "// End prologue." << endl - << endl; + if (!ops.cxx_prologue ().empty () || !ops.cxx_prologue_file ().empty ()) + { + cxx << "// Begin prologue." << endl + << "//" << endl; + append (cxx, ops.cxx_prologue (), ops.cxx_prologue_file ()); + cxx << "//" << endl + << "// End prologue." << endl + << endl; + } cxx << "#include " << ctx->process_include_path (hxx_name) << endl << endl; @@ -453,12 +468,15 @@ generate (options const& ops, // Copy epilogue. // - cxx << "// Begin epilogue." << endl - << "//" << endl; - append (cxx, ops.cxx_epilogue (), ops.cxx_epilogue_file ()); - cxx << "//" << endl - << "// End epilogue." << endl - << endl; + if (!ops.cxx_epilogue ().empty () || !ops.cxx_epilogue_file ().empty ()) + { + cxx << "// Begin epilogue." << endl + << "//" << endl; + append (cxx, ops.cxx_epilogue (), ops.cxx_epilogue_file ()); + cxx << "//" << endl + << "// End epilogue." << endl + << endl; + } cxx << "#include " << endl; @@ -477,19 +495,21 @@ generate (options const& ops, sloc_filter sloc (ctx->os); - // Copy prologue. - // sch << "#include " << endl << endl; // Copy prologue. // - sch << "// Begin prologue." << endl - << "//" << endl; - append (sch, ops.schema_prologue (), ops.schema_prologue_file ()); - sch << "//" << endl - << "// End prologue." << endl - << endl; + if (!ops.schema_prologue ().empty () || + !ops.schema_prologue_file ().empty ()) + { + sch << "// Begin prologue." << endl + << "//" << endl; + append (sch, ops.schema_prologue (), ops.schema_prologue_file ()); + sch << "//" << endl + << "// End prologue." << endl + << endl; + } sch << "#include " << ctx->process_include_path (hxx_name) << endl << endl; @@ -515,12 +535,16 @@ generate (options const& ops, // Copy epilogue. // - sch << "// Begin epilogue." << endl - << "//" << endl; - append (sch, ops.schema_epilogue (), ops.schema_epilogue_file ()); - sch << "//" << endl - << "// End epilogue." << endl - << endl; + if (!ops.schema_epilogue ().empty () || + !ops.schema_epilogue_file ().empty ()) + { + sch << "// Begin epilogue." << endl + << "//" << endl; + append (sch, ops.schema_epilogue (), ops.schema_epilogue_file ()); + sch << "//" << endl + << "// End epilogue." << endl + << endl; + } sch << "#include " << endl; @@ -547,30 +571,50 @@ generate (options const& ops, { relational::schema::generate_prologue (); - sql << "/* Begin prologue." << endl - << " */" << endl; - append (sql, ops.sql_prologue (), ops.sql_prologue_file ()); - sql << "/*" << endl - << " * End prologue. */" << endl - << endl; - - relational::schema::generate_drop (); - - sql << "/* Begin interlude." << endl - << " */" << endl; - append (sql, ops.sql_interlude (), ops.sql_interlude_file ()); - sql << "/*" << endl - << " * End interlude. */" << endl - << endl; - - relational::schema::generate_create (); - - sql << "/* Begin epilogue." << endl - << " */" << endl; - append (sql, ops.sql_epilogue (), ops.sql_epilogue_file ()); - sql << "/*" << endl - << " * End epilogue. */" << endl - << endl; + // Copy prologue. + // + if (!ops.sql_prologue ().empty () || + !ops.sql_prologue_file ().empty ()) + { + sql << "/* Begin prologue." << endl + << " */" << endl; + append (sql, ops.sql_prologue (), ops.sql_prologue_file ()); + sql << "/*" << endl + << " * End prologue. */" << endl + << endl; + } + + if (!ops.omit_drop ()) + relational::schema::generate_drop (); + + // Copy interlude. + // + if (!ops.sql_interlude ().empty () || + !ops.sql_interlude_file ().empty ()) + { + sql << "/* Begin interlude." << endl + << " */" << endl; + append (sql, ops.sql_interlude (), ops.sql_interlude_file ()); + sql << "/*" << endl + << " * End interlude. */" << endl + << endl; + } + + if (!ops.omit_create ()) + relational::schema::generate_create (); + + // Copy epilogue. + // + if (!ops.sql_epilogue ().empty () || + !ops.sql_epilogue_file ().empty ()) + { + sql << "/* Begin epilogue." << endl + << " */" << endl; + append (sql, ops.sql_epilogue (), ops.sql_epilogue_file ()); + sql << "/*" << endl + << " * End epilogue. */" << endl + << endl; + } relational::schema::generate_epilogue (); break; diff --git a/odb/options.cli b/odb/options.cli index 6740572..f61aa0e 100644 --- a/odb/options.cli +++ b/odb/options.cli @@ -102,6 +102,16 @@ class options formats." }; + bool --omit-drop + { + "Omit \cb{DROP} statements from the generated database schema." + }; + + bool --omit-create + { + "Omit \cb{CREATE} statements from the generated database schema." + }; + std::string --schema-name = "" { "", diff --git a/odb/relational/schema.hxx b/odb/relational/schema.hxx index e6d4824..56857f3 100644 --- a/odb/relational/schema.hxx +++ b/odb/relational/schema.hxx @@ -797,7 +797,7 @@ namespace relational post () { if (!first_) // Ignore empty statements. - os << strlit (line_) << ");" << endl; + os << strlit (line_) << ");"; } private: @@ -873,10 +873,12 @@ namespace relational << "{" << "ODB_POTENTIALLY_UNUSED (db);" << "ODB_POTENTIALLY_UNUSED (pass);" + << "ODB_POTENTIALLY_UNUSED (drop);" << endl; // Drop. // + if (!options.omit_drop ()) { bool close (false); @@ -904,11 +906,16 @@ namespace relational // Create. // + if (!options.omit_create ()) { bool close (false); - os << "else" - << "{"; + if (options.omit_drop ()) + os << "if (!drop)"; + else + os << "else"; + + os << "{"; for (unsigned short pass (1); pass < 3; ++pass) { -- cgit v1.1