summaryrefslogtreecommitdiff
path: root/odb/semantics/relational/elements.txx
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2013-03-16 07:44:43 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2013-04-10 18:46:43 +0200
commit08b159e18527c2d6844e569b1309b5033b4d47c9 (patch)
tree224a1d6e7c989740e9be806c0f3cc7fc20266eb2 /odb/semantics/relational/elements.txx
parent9fe60de16cf9411a548c020cae5ac7b9e7938e82 (diff)
Add initial support for database model serialization to XML
Diffstat (limited to 'odb/semantics/relational/elements.txx')
-rw-r--r--odb/semantics/relational/elements.txx80
1 files changed, 80 insertions, 0 deletions
diff --git a/odb/semantics/relational/elements.txx b/odb/semantics/relational/elements.txx
index 9415cab..05ae06d 100644
--- a/odb/semantics/relational/elements.txx
+++ b/odb/semantics/relational/elements.txx
@@ -6,10 +6,58 @@ namespace semantics
{
namespace relational
{
+ // nameable
+ //
+ template <typename N>
+ typename nameable<N>::parser_map nameable<N>::parser_map_;
+
+ template <typename N>
+ template <typename T>
+ void nameable<N>::
+ parser_impl (xml::parser& p, scope_type& s, graph& g)
+ {
+ name_type n (p.attribute ("name", name_type ()));
+ T& x (g.new_node<T> (p, s, g));
+ g.new_edge<names_type> (s, x, n);
+ }
+
+ template <typename N>
+ nameable<N>::
+ nameable (xml::parser&, graph&)
+ // : id_ (p.attribute<string> ("id"))
+ : named_ (0)
+ {
+ // The name attribute is handled in parser_impl().
+ }
+
+ template <typename N>
+ void nameable<N>::
+ serialize_attributes (xml::serializer& s) const
+ {
+ // Omit empty names (e.g., a primary key).
+ //
+ name_type const& n (name ());
+ if (!n.empty ())
+ s.attribute ("name", n);
+
+ //s.attribute ("id", id_);
+ }
+
// scope
//
template <typename N>
+ template <typename T>
+ T* scope<N>::
+ find (name_type const& name)
+ {
+ typename names_map::iterator i (names_map_.find (name));
+ return i != names_map_.end ()
+ ? dynamic_cast<T*> (&(*i->second)->nameable ())
+ : 0;
+ }
+
+ template <typename N>
typename scope<N>::names_iterator scope<N>::
find (name_type const& name)
{
@@ -49,6 +97,38 @@ namespace semantics
return i != iterator_map_.end () ? i->second : names_.end ();
}
+ template <typename N>
+ scope<N>::
+ scope (xml::parser& p, graph& g)
+ : first_key_ (names_.end ())
+ {
+ using namespace xml;
+ p.content (parser::complex);
+
+ for (parser::event_type e (p.peek ());
+ e == parser::start_element;
+ e = p.peek ())
+ {
+ typename nameable_type::parser_map::iterator i (
+ nameable_type::parser_map_.find (p.name ()));
+
+ if (p.namespace_ () != xmlns || i == nameable_type::parser_map_.end ())
+ break; // Not one of our elements.
+
+ p.next ();
+ i->second (p, *this, g);
+ p.next_expect (parser::end_element);
+ }
+ }
+
+ template <typename N>
+ void scope<N>::
+ serialize_content (xml::serializer& s) const
+ {
+ for (names_const_iterator i (names_begin ()); i != names_end (); ++i)
+ i->nameable ().serialize (s);
+ }
+
class column;
class primary_key;