From c67c06030fb1ac622c96211bffc054a85efe0aa8 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 20 Mar 2013 13:09:45 +0200 Subject: Add support for maintaining log of database model changes --- odb/semantics/relational/changelog.cxx | 1 + odb/semantics/relational/elements.cxx | 18 ++++++++++++ odb/semantics/relational/elements.hxx | 52 ++++++++++++++++++++++++++-------- odb/semantics/relational/elements.txx | 12 ++++++++ odb/semantics/relational/model.hxx | 3 ++ odb/semantics/relational/table.cxx | 35 ++++++++++++++++++++++- odb/semantics/relational/table.hxx | 18 ++++++++++++ 7 files changed, 126 insertions(+), 13 deletions(-) (limited to 'odb/semantics/relational') diff --git a/odb/semantics/relational/changelog.cxx b/odb/semantics/relational/changelog.cxx index 05dd529..cd94494 100644 --- a/odb/semantics/relational/changelog.cxx +++ b/odb/semantics/relational/changelog.cxx @@ -73,6 +73,7 @@ namespace semantics i != contains_changeset_.rend (); ++i) { (*i)->changeset ().serialize (s); + s.characters ("\n"); } model ().serialize (s); diff --git a/odb/semantics/relational/elements.cxx b/odb/semantics/relational/elements.cxx index 43c03c0..e14bc00 100644 --- a/odb/semantics/relational/elements.cxx +++ b/odb/semantics/relational/elements.cxx @@ -70,6 +70,24 @@ namespace semantics throw duplicate_name (*this, (*i->second)->nameable (), n); } + template <> + void scope:: + remove_edge_left (names_type& e) + { + typename names_iterator_map::iterator i (iterator_map_.find (&e)); + assert (i != iterator_map_.end ()); + + // If we are removing the first key, then move to the next key (or + // the end which means there are no keys). + // + if (first_key_ == i->second) + first_key_++; + + names_.erase (i->second); + names_map_.erase (e.name ()); + iterator_map_.erase (i); + } + // type info // namespace diff --git a/odb/semantics/relational/elements.hxx b/odb/semantics/relational/elements.hxx index 2321e1a..381d7a8 100644 --- a/odb/semantics/relational/elements.hxx +++ b/odb/semantics/relational/elements.hxx @@ -149,6 +149,20 @@ namespace semantics nameable_ = &n; } + void + clear_left_node (scope_type& n) + { + assert (scope_ == &n); + scope_ = 0; + } + + void + clear_right_node (nameable_type& n) + { + assert (nameable_ == &n); + nameable_ = 0; + } + protected: name_type name_; scope_type* scope_; @@ -169,22 +183,16 @@ namespace semantics typedef relational::scope scope_type; name_type const& - name () const - { - return named_->name (); - } + name () const {return named_->name ();} scope_type& - scope () const - { - return named ().scope (); - } + scope () const {return named ().scope ();} names_type& - named () const - { - return *named_; - } + named () const {return *named_;} + + string const& + id () const {return id_;} public: // Id identifies the C++ node (e.g., a class or a data member) that @@ -208,6 +216,13 @@ namespace semantics named_ = &e; } + virtual void + remove_edge_right (names_type& e) + { + assert (named_ == &e); + named_ = 0; + } + using node::add_edge_right; protected: @@ -298,6 +313,12 @@ namespace semantics return names_.end (); } + bool + names_empty () const + { + return names_.empty (); + } + // Find. // template @@ -324,6 +345,9 @@ namespace semantics virtual void add_edge_left (names_type&); + virtual void + remove_edge_left (names_type&); + protected: scope (scope const&, graph&); scope (xml::parser&, graph&); @@ -343,6 +367,10 @@ namespace semantics void scope:: add_edge_left (names_type&); + template <> + void scope:: + remove_edge_left (names_type&); + typedef scope uscope; typedef scope qscope; } diff --git a/odb/semantics/relational/elements.txx b/odb/semantics/relational/elements.txx index 53946a0..e1fd6d5 100644 --- a/odb/semantics/relational/elements.txx +++ b/odb/semantics/relational/elements.txx @@ -169,5 +169,17 @@ namespace semantics else throw duplicate_name (*this, (*i->second)->nameable (), e.nameable ()); } + + template + void scope:: + remove_edge_left (names_type& e) + { + typename names_iterator_map::iterator i (iterator_map_.find (&e)); + assert (i != iterator_map_.end ()); + + names_.erase (i->second); + names_map_.erase (e.name ()); + iterator_map_.erase (i); + } } } diff --git a/odb/semantics/relational/model.hxx b/odb/semantics/relational/model.hxx index 626befd..575100f 100644 --- a/odb/semantics/relational/model.hxx +++ b/odb/semantics/relational/model.hxx @@ -19,6 +19,9 @@ namespace semantics version_type version () const {return version_;} + void + version (version_type v) {version_ = v;} + public: model (version_type v): version_ (v) {} model (model const&, graph&); diff --git a/odb/semantics/relational/table.cxx b/odb/semantics/relational/table.cxx index 1c6e784..6d1c3a2 100644 --- a/odb/semantics/relational/table.cxx +++ b/odb/semantics/relational/table.cxx @@ -13,7 +13,7 @@ namespace semantics // table // table:: - table (table const& t, qscope& s, graph& g) + table (table const& t, qscope&, graph& g) : qnameable (t, g), uscope (t, g) { } @@ -56,6 +56,29 @@ namespace semantics s.end_element (); } + // drop_table + // + drop_table:: + drop_table (xml::parser& p, qscope&, graph& g) + : qnameable (p, g) + { + p.content (xml::parser::empty); + } + + drop_table& drop_table:: + clone (qscope& s, graph& g) const + { + return g.new_node (*this, s, g); + } + + void drop_table:: + serialize (xml::serializer& s) const + { + s.start_element (xmlns, "drop-table"); + qnameable::serialize_attributes (s); + s.end_element (); + } + // type info // namespace @@ -67,6 +90,8 @@ namespace semantics qnameable::parser_map_["table"] = &qnameable::parser_impl; qnameable::parser_map_["add-table"] = &qnameable::parser_impl; + qnameable::parser_map_["drop-table"] = + &qnameable::parser_impl; using compiler::type_info; @@ -86,6 +111,14 @@ namespace semantics ti.add_base (typeid (table)); insert (ti); } + + // drop_table + // + { + type_info ti (typeid (drop_table)); + ti.add_base (typeid (qnameable)); + insert (ti); + } } } init_; } diff --git a/odb/semantics/relational/table.hxx b/odb/semantics/relational/table.hxx index 768d3d7..3eb1b73 100644 --- a/odb/semantics/relational/table.hxx +++ b/odb/semantics/relational/table.hxx @@ -48,6 +48,24 @@ namespace semantics virtual void serialize (xml::serializer&) const; }; + + class drop_table: public qnameable + { + public: + drop_table (string const& id): qnameable (id) {} + drop_table (drop_table const& t, qscope&, graph& g): qnameable (t, g) {} + drop_table (xml::parser&, qscope&, graph&); + + virtual drop_table& + clone (qscope&, graph&) const; + + virtual string + kind () const {return "drop table";} + + virtual void + serialize (xml::serializer&) const; + }; + } } -- cgit v1.1