From b0391e168b489811708ca7ba5f71a0eb67b46ffe Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 3 Apr 2013 11:22:42 +0200 Subject: Generate add/drop table migration statements --- odb/semantics/relational/changelog.hxx | 6 ++++ odb/semantics/relational/changeset.cxx | 6 ++-- odb/semantics/relational/changeset.hxx | 53 +++++++++++++++++++++++++++++++++- 3 files changed, 62 insertions(+), 3 deletions(-) (limited to 'odb/semantics/relational') diff --git a/odb/semantics/relational/changelog.hxx b/odb/semantics/relational/changelog.hxx index 93b327d..d9e220c 100644 --- a/odb/semantics/relational/changelog.hxx +++ b/odb/semantics/relational/changelog.hxx @@ -88,6 +88,12 @@ namespace semantics return *contains_changeset_.back (); } + contains_changeset const& + contains_changeset_at (contains_changeset_list::size_type i) const + { + return *contains_changeset_[i]; + } + contains_changeset_iterator contains_changeset_begin () const { diff --git a/odb/semantics/relational/changeset.cxx b/odb/semantics/relational/changeset.cxx index fd5a17f..669394f 100644 --- a/odb/semantics/relational/changeset.cxx +++ b/odb/semantics/relational/changeset.cxx @@ -13,14 +13,16 @@ namespace semantics changeset:: changeset (changeset const& c, qscope& b, graph& g) : qscope (c, &b, g), - version_ (c.version_) + version_ (c.version_), + alters_model_ (0) { } changeset:: changeset (xml::parser& p, qscope& b, graph& g) : qscope (p, &b, g), - version_ (p.attribute ("version")) + version_ (p.attribute ("version")), + alters_model_ (0) { } diff --git a/odb/semantics/relational/changeset.hxx b/odb/semantics/relational/changeset.hxx index 76fd683..27c80fe 100644 --- a/odb/semantics/relational/changeset.hxx +++ b/odb/semantics/relational/changeset.hxx @@ -11,6 +11,43 @@ namespace semantics { namespace relational { + class model; + class changeset; + + class alters_model: public edge + { + public: + typedef relational::model model_type; + typedef relational::changeset changeset_type; + + model_type& + model () const {return *model_;} + + changeset_type& + changeset () const {return *changeset_;} + + public: + alters_model () : model_ (0), changeset_ (0) {} + + void + set_left_node (changeset_type& c) + { + assert (changeset_ == 0); + changeset_ = &c; + } + + void + set_right_node (model_type& m) + { + assert (model_ == 0); + model_ = &m; + } + + protected: + model_type* model_; + changeset_type* changeset_; + }; + class changeset: public qscope { public: @@ -19,8 +56,14 @@ namespace semantics version_type version () const {return version_;} + // Returns model to which this changeset applies (as opposed to the + // ultimate base model). Note that it may not be set. + // + model& + base_model () const {return alters_model_->model ();} + public: - changeset (version_type v): version_ (v) {} + changeset (version_type v): version_ (v), alters_model_ (0) {} changeset (changeset const&, qscope& base, graph&); changeset (xml::parser&, qscope& base, graph&); @@ -31,11 +74,19 @@ namespace semantics serialize (xml::serializer&) const; public: + virtual void + add_edge_left (alters_model& am) + { + assert (alters_model_ == 0); + alters_model_ = &am; + } + using qscope::add_edge_left; using qscope::add_edge_right; private: version_type version_; + alters_model* alters_model_; }; } } -- cgit v1.1