summaryrefslogtreecommitdiff
path: root/odb/relational/source.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'odb/relational/source.hxx')
-rw-r--r--odb/relational/source.hxx86
1 files changed, 71 insertions, 15 deletions
diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx
index a216653..9b04ae4 100644
--- a/odb/relational/source.hxx
+++ b/odb/relational/source.hxx
@@ -2098,6 +2098,10 @@ namespace relational
query_parameters& qp_;
};
+ //@@ (im)-perfect forwarding.
+ //
+ static schema_format format_embedded (schema_format::embedded);
+
//
//
struct class_: traversal::class_, virtual context
@@ -2110,8 +2114,13 @@ namespace relational
bind_id_member_ ("id_"),
init_id_image_member_ ("id_", "id"),
init_id_value_member_ ("id"),
- schema_drop_ (schema_emitter_),
- schema_create_ (schema_emitter_)
+ stream_ (emitter_),
+ drop_model_ (emitter_, stream_, format_embedded),
+ drop_table_ (emitter_, stream_, format_embedded),
+ drop_index_ (emitter_, stream_, format_embedded),
+ create_model_ (emitter_, stream_, format_embedded),
+ create_table_ (emitter_, stream_, format_embedded),
+ create_index_ (emitter_, stream_, format_embedded)
{
init ();
}
@@ -2124,8 +2133,13 @@ namespace relational
bind_id_member_ ("id_"),
init_id_image_member_ ("id_", "id"),
init_id_value_member_ ("id"),
- schema_drop_ (schema_emitter_),
- schema_create_ (schema_emitter_)
+ stream_ (emitter_),
+ drop_model_ (emitter_, stream_, format_embedded),
+ drop_table_ (emitter_, stream_, format_embedded),
+ drop_index_ (emitter_, stream_, format_embedded),
+ create_model_ (emitter_, stream_, format_embedded),
+ create_table_ (emitter_, stream_, format_embedded),
+ create_index_ (emitter_, stream_, format_embedded)
{
init ();
}
@@ -2147,6 +2161,17 @@ namespace relational
init_value_base_inherits_ >> init_value_base_;
init_value_member_names_ >> init_value_member_;
+
+ if (embedded_schema)
+ {
+ drop_model_ >> drop_names_;
+ drop_names_ >> drop_table_;
+ drop_names_ >> drop_index_;
+
+ create_model_ >> create_names_;
+ create_names_ >> create_table_;
+ create_names_ >> create_index_;
+ }
}
virtual void
@@ -3035,6 +3060,9 @@ namespace relational
virtual void
line (const string& l)
{
+ if (l.empty ())
+ return; // Ignore empty lines.
+
if (first_)
{
first_ = false;
@@ -3088,6 +3116,17 @@ namespace relational
virtual void
schema (type& c)
{
+ typedef sema_rel::model::names_iterator iterator;
+
+ iterator begin (c.get<iterator> ("model-range-first"));
+ iterator end (c.get<iterator> ("model-range-last"));
+
+ if (begin == model->names_end ())
+ return; // This class doesn't have any model entities (e.g.,
+ // a second class mapped to the same table).
+
+ ++end; // Transform the range from [begin, end] to [begin, end).
+
string const& type (c.fq_name ());
string traits ("access::object_traits< " + type + " >");
@@ -3110,10 +3149,14 @@ namespace relational
for (unsigned short pass (1); pass < 3; ++pass)
{
- schema_emitter_.pass (pass);
- schema_drop_->pass (pass);
- schema_drop_->traverse (c);
- close = close || !schema_emitter_.empty ();
+ emitter_.pass (pass);
+ drop_model_->pass (pass);
+ drop_table_->pass (pass);
+ drop_index_->pass (pass);
+
+ drop_model_->traverse (begin, end);
+
+ close = close || !emitter_.empty ();
}
if (close) // Close the last case and the switch block.
@@ -3134,10 +3177,14 @@ namespace relational
for (unsigned short pass (1); pass < 3; ++pass)
{
- schema_emitter_.pass (pass);
- schema_create_->pass (pass);
- schema_create_->traverse (c);
- close = close || !schema_emitter_.empty ();
+ emitter_.pass (pass);
+ create_model_->pass (pass);
+ create_table_->pass (pass);
+ create_index_->pass (pass);
+
+ create_model_->traverse (begin, end);
+
+ close = close || !emitter_.empty ();
}
if (close) // Close the last case and the switch block.
@@ -4050,9 +4097,18 @@ namespace relational
traversal::names init_value_member_names_;
instance<init_value_member> init_id_value_member_;
- schema_emitter schema_emitter_;
- instance<schema::class_drop> schema_drop_;
- instance<schema::class_create> schema_create_;
+ schema_emitter emitter_;
+ emitter_ostream stream_;
+
+ trav_rel::names drop_names_;
+ instance<schema::drop_model> drop_model_;
+ instance<schema::drop_table> drop_table_;
+ instance<schema::drop_index> drop_index_;
+
+ trav_rel::names create_names_;
+ instance<schema::create_model> create_model_;
+ instance<schema::create_table> create_table_;
+ instance<schema::create_index> create_index_;
};
struct include: virtual context