aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2011-07-24 14:56:11 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2011-07-24 14:56:11 +0200
commit319def6da0c6d17c29f66c0ea5837a58988a67d7 (patch)
tree43724ae423ec85682ba77d5e4af347f8e7ed7729
parentac83439900ab5ed4febe68375d3936ae2a59d707 (diff)
Add support for resetting options accumulated with options pragma
-rw-r--r--odb/context.cxx99
-rw-r--r--odb/pragma.cxx26
2 files changed, 102 insertions, 23 deletions
diff --git a/odb/context.cxx b/odb/context.cxx
index 39a01f7..3b684ea 100644
--- a/odb/context.cxx
+++ b/odb/context.cxx
@@ -325,10 +325,45 @@ column_options (semantics::data_member& m)
//
semantics::type& t (m.type ());
- string mo (m.get<string> ("options", string ()));
- string to (t.get<string> ("options", string ()));
+ string r;
+
+ if (t.count ("options"))
+ {
+ strings const& o (t.get<strings> ("options"));
+
+ for (strings::const_iterator i (o.begin ()); i != o.end (); ++i)
+ {
+ if (i->empty ())
+ r.clear ();
+ else
+ {
+ if (!r.empty ())
+ r += ' ';
+
+ r += *i;
+ }
+ }
+ }
- return to + (mo.empty () || to.empty () ? "" : " ") + mo;
+ if (m.count ("options"))
+ {
+ strings const& o (m.get<strings> ("options"));
+
+ for (strings::const_iterator i (o.begin ()); i != o.end (); ++i)
+ {
+ if (i->empty ())
+ r.clear ();
+ else
+ {
+ if (!r.empty ())
+ r += ' ';
+
+ r += *i;
+ }
+ }
+ }
+
+ return r;
}
string context::
@@ -344,24 +379,60 @@ column_options (semantics::data_member& m, string const& kp)
semantics::type& c (m.type ());
semantics::type& t (member_type (m, kp));
- string r (t.get<string> ("options", string ()));
+ string r;
- string o (c.get<string> (k, string ()));
- if (!o.empty ())
+ if (t.count ("options"))
{
- if (!r.empty ())
- r += ' ';
+ strings const& o (t.get<strings> ("options"));
- r += o;
+ for (strings::const_iterator i (o.begin ()); i != o.end (); ++i)
+ {
+ if (i->empty ())
+ r.clear ();
+ else
+ {
+ if (!r.empty ())
+ r += ' ';
+
+ r += *i;
+ }
+ }
+ }
+
+ if (c.count (k))
+ {
+ strings const& o (c.get<strings> (k));
+
+ for (strings::const_iterator i (o.begin ()); i != o.end (); ++i)
+ {
+ if (i->empty ())
+ r.clear ();
+ else
+ {
+ if (!r.empty ())
+ r += ' ';
+
+ r += *i;
+ }
+ }
}
- o = m.get<string> (k, string ());
- if (!o.empty ())
+ if (m.count (k))
{
- if (!r.empty ())
- r += ' ';
+ strings const& o (m.get<strings> (k));
- r += o;
+ for (strings::const_iterator i (o.begin ()); i != o.end (); ++i)
+ {
+ if (i->empty ())
+ r.clear ();
+ else
+ {
+ if (!r.empty ())
+ r += ' ';
+
+ r += *i;
+ }
+ }
}
return r;
diff --git a/odb/pragma.cxx b/odb/pragma.cxx
index 6e1ecfa..23d3fd3 100644
--- a/odb/pragma.cxx
+++ b/odb/pragma.cxx
@@ -514,11 +514,11 @@ handle_pragma (cpp_reader* reader,
p == "key_options" ||
p == "id_options")
{
- // options ("<name>")
- // value_options ("<name>")
- // index_options ("<name>")
- // key_options ("<name>")
- // id_options ("<name>")
+ // options (["<name>"])
+ // value_options (["<name>"])
+ // index_options (["<name>"])
+ // key_options (["<name>"])
+ // id_options (["<name>"])
//
// Make sure we've got the correct declaration type.
@@ -534,20 +534,28 @@ handle_pragma (cpp_reader* reader,
tt = pragma_lex (&t);
- if (tt != CPP_STRING)
+ // An empty options specifier signals options reset.
+ //
+ if (tt == CPP_STRING)
+ {
+ val = TREE_STRING_POINTER (t);
+ tt = pragma_lex (&t);
+ }
+ // Empty options specifier signals options reset.
+ //
+ else if (tt != CPP_CLOSE_PAREN)
{
error () << "options string expected in db pragma '" << p << "'" << endl;
return;
}
- val = TREE_STRING_POINTER (t);
-
- if (pragma_lex (&t) != CPP_CLOSE_PAREN)
+ if (tt != CPP_CLOSE_PAREN)
{
error () << "')' expected at the end of db pragma '" << p << "'" << endl;
return;
}
+ mode = pragma::accumulate;
tt = pragma_lex (&t);
}
else if (p == "type" ||