From 81ea37904e4959414b53b225b4b5e56e1b561bdc Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 22 Jul 2011 14:49:29 +0200 Subject: Add pragma for setting type's or member's default value New pragma: default. New test: default. --- odb/relational/schema.cxx | 122 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) (limited to 'odb/relational/schema.cxx') diff --git a/odb/relational/schema.cxx b/odb/relational/schema.cxx index 6acb6dc..a347d49 100644 --- a/odb/relational/schema.cxx +++ b/odb/relational/schema.cxx @@ -3,6 +3,12 @@ // copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC // license : GNU GPL v3; see accompanying LICENSE file +#include + +#include +#include +#include + #include #include @@ -14,6 +20,122 @@ namespace relational { namespace schema { + // object_columns + // + void object_columns:: + default_ (semantics::data_member& m) + { + string s; + tree n (0); + + semantics::type& t (m.type ()); + + if (m.count ("default")) + { + s = m.get ("default"); + + // Empty string is a default value override which means + // there is no default value. + // + if (s.empty ()) + return; + + if (m.count ("default-node")) + n = m.get ("default-node"); + } + else if (t.count ("default")) + { + s = t.get ("default"); + + if (s.empty ()) + return; + + if (t.count ("default-node")) + n = t.get ("default-node"); + } + else + return; // No default value for this column. + + // The first letter in the default value string identifies + // the type of the value. See pragma.cxx for details. + // + switch (s[0]) + { + case 'n': + { + default_null (m); + break; + } + case 't': + case 'f': + { + default_bool (m, s[0] == 't'); + break; + } + case '+': + case '-': + { + switch (TREE_CODE (n)) + { + case INTEGER_CST: + { + HOST_WIDE_INT hwl (TREE_INT_CST_LOW (n)); + HOST_WIDE_INT hwh (TREE_INT_CST_HIGH (n)); + + unsigned long long l (hwl); + unsigned long long h (hwh); + unsigned short width (HOST_BITS_PER_WIDE_INT); + + unsigned long long v ((h << width) + l); + + default_integer (m, v, s[0] == '-'); + break; + } + case REAL_CST: + { + double v; + + REAL_VALUE_TYPE d (TREE_REAL_CST (n)); + + if (REAL_VALUE_ISINF (d)) + v = numeric_limits::infinity (); + else if (REAL_VALUE_ISNAN (d)) + v = numeric_limits::quiet_NaN (); + else + { + char tmp[256]; + real_to_decimal (tmp, &d, sizeof (tmp), 0, true); + istringstream is (tmp); + is >> v; + } + + if (s[0] == '-') + v = -v; + + default_float (m, v); + break; + } + default: + assert (false); + } + break; + } + + case 's': + { + default_string (m, string (s, 1, string::npos)); + break; + } + case 'e': + { + default_enum (m, n, string (s, 1, string::npos)); + break; + } + default: + assert (false); + } + } + struct schema_emitter: emitter, context { virtual void -- cgit v1.1