summaryrefslogtreecommitdiff
path: root/odb/semantics
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2013-03-20 13:09:45 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2013-04-10 18:46:44 +0200
commitc67c06030fb1ac622c96211bffc054a85efe0aa8 (patch)
tree07a85e0c3b0f3a22b58405ff5582870f2b09f424 /odb/semantics
parent3b457daf6b252ef31ec0611e7375aa4badd8e63d (diff)
Add support for maintaining log of database model changes
Diffstat (limited to 'odb/semantics')
-rw-r--r--odb/semantics/relational/changelog.cxx1
-rw-r--r--odb/semantics/relational/elements.cxx18
-rw-r--r--odb/semantics/relational/elements.hxx52
-rw-r--r--odb/semantics/relational/elements.txx12
-rw-r--r--odb/semantics/relational/model.hxx3
-rw-r--r--odb/semantics/relational/table.cxx35
-rw-r--r--odb/semantics/relational/table.hxx18
7 files changed, 126 insertions, 13 deletions
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<uname>::
+ 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<N> 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 <typename T>
@@ -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<uname>::
add_edge_left (names_type&);
+ template <>
+ void scope<uname>::
+ remove_edge_left (names_type&);
+
typedef scope<uname> uscope;
typedef scope<qname> 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 <typename N>
+ void scope<N>::
+ 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<drop_table> (*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<table>;
qnameable::parser_map_["add-table"] =
&qnameable::parser_impl<add_table>;
+ qnameable::parser_map_["drop-table"] =
+ &qnameable::parser_impl<drop_table>;
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;
+ };
+
}
}