summaryrefslogtreecommitdiff
path: root/odb/semantics/relational/foreign-key.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'odb/semantics/relational/foreign-key.cxx')
-rw-r--r--odb/semantics/relational/foreign-key.cxx100
1 files changed, 97 insertions, 3 deletions
diff --git a/odb/semantics/relational/foreign-key.cxx b/odb/semantics/relational/foreign-key.cxx
index 5ef2cf6..2c73a82 100644
--- a/odb/semantics/relational/foreign-key.cxx
+++ b/odb/semantics/relational/foreign-key.cxx
@@ -2,14 +2,107 @@
// copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC
// license : GNU GPL v3; see accompanying LICENSE file
+#include <ostream>
+#include <istream>
+
#include <cutl/compiler/type-info.hxx>
+#include <odb/semantics/relational.hxx>
-#include <odb/semantics/relational/foreign-key.hxx>
+using namespace std;
namespace semantics
{
namespace relational
{
+ static const char* action_str[] = {"NO ACTION", "CASCADE"};
+
+ ostream&
+ operator<< (ostream& os, foreign_key::action_type v)
+ {
+ return os << action_str[v];
+ }
+
+ istream&
+ operator>> (istream& is, foreign_key::action_type& v)
+ {
+ string s;
+ getline (is, s);
+
+ if (!is.eof ())
+ is.setstate (istream::failbit);
+
+ if (!is.fail ())
+ {
+ if (s == "NO ACTION")
+ v = foreign_key::no_action;
+ else if (s == "CASCADE")
+ v = foreign_key::cascade;
+ else
+ is.setstate (istream::failbit);
+ }
+
+ return is;
+ }
+
+ foreign_key::
+ foreign_key (xml::parser& p, uscope& s, graph& g)
+ : key (p, s, g),
+ deferred_ (p.attribute ("deferred", false)),
+ on_delete_ (p.attribute ("on-delete", no_action))
+ {
+ using namespace xml;
+
+ p.next_expect (parser::start_element, xmlns, "references");
+ referenced_table_ = p.attribute<qname> ("table");
+ p.content (parser::complex);
+
+ for (parser::event_type e (p.peek ());
+ e == parser::start_element;
+ e = p.peek ())
+ {
+ if (p.qname () != xml::qname (xmlns, "column"))
+ break; // Not our elements.
+
+ p.next ();
+ referenced_columns_.push_back (p.attribute<uname> ("name"));
+ p.content (parser::empty);
+ p.next_expect (parser::end_element);
+ }
+
+ p.next_expect (parser::end_element);
+ }
+
+ void foreign_key::
+ serialize (xml::serializer& s) const
+ {
+ s.start_element (xmlns, "foreign-key");
+ key::serialize_attributes (s);
+
+ if (deferred ())
+ s.attribute ("deferred", true);
+
+ if (on_delete () != no_action)
+ s.attribute ("on-delete", on_delete ());
+
+ key::serialize_content (s);
+
+ // Referenced columns.
+ //
+ s.start_element (xmlns, "references");
+ s.attribute ("table", referenced_table ());
+
+ for (columns::const_iterator i (referenced_columns_.begin ());
+ i != referenced_columns_.end (); ++i)
+ {
+ s.start_element (xmlns, "column");
+ s.attribute ("name", *i);
+ s.end_element ();
+ }
+
+ s.end_element (); // references
+ s.end_element (); // foreign-key
+ }
+
// type info
//
namespace
@@ -18,10 +111,11 @@ namespace semantics
{
init ()
{
+ unameable::parser_map_["foreign-key"] =
+ &unameable::parser_impl<foreign_key>;
+
using compiler::type_info;
- // foreign_key
- //
{
type_info ti (typeid (foreign_key));
ti.add_base (typeid (unameable));