From 3dfdbbfd5f65163e0825e62b5b9d0f9b3aea06bb Mon Sep 17 00:00:00 2001 From: Constantin Michael Date: Tue, 14 Jun 2011 10:01:15 +0200 Subject: Add PostgreSQL header generation implementation --- odb/relational/pgsql/header.cxx | 158 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 odb/relational/pgsql/header.cxx diff --git a/odb/relational/pgsql/header.cxx b/odb/relational/pgsql/header.cxx new file mode 100644 index 0000000..85cc6e5 --- /dev/null +++ b/odb/relational/pgsql/header.cxx @@ -0,0 +1,158 @@ +// file : odb/relational/pgsql/header.cxx +// author : Constantin Michael +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v3; see accompanying LICENSE file + +#include + +#include +#include + +namespace relational +{ + namespace pgsql + { + namespace header + { + namespace relational = relational::header; + + struct image_member: relational::image_member, member_base + { + image_member (base const& x) + : member_base::base (x), // virtual base + base (x), + member_base (x), + member_image_type_ (base::type_override_, + base::fq_type_override_, + base::key_prefix_) + { + } + + virtual bool + pre (member_info& mi) + { + if (container (mi.t)) + return false; + + image_type = member_image_type_.image_type (mi.m); + + if (var_override_.empty ()) + os << "// " << mi.m.name () << endl + << "//" << endl; + + return true; + } + + virtual void + traverse_composite (member_info& mi) + { + os << image_type << " " << mi.var << "value;" + << endl; + } + + virtual void + traverse_integer (member_info& mi) + { + os << image_type << " " << mi.var << "value;" + << "bool " << mi.var << "null;" + << endl; + } + + virtual void + traverse_float (member_info& mi) + { + os << image_type << " " << mi.var << "value;" + << "bool " << mi.var << "null;" + << endl; + } + + virtual void + traverse_numeric (member_info& mi) + { + // Exchanged as strings. Can have up to 1000 digits not counting + // '-' and '.'. + // + + /* + @@ Disabled. + os << "char " << mi.var << "value[" << + (t.range ? t.range_value : 10) + 3 << "];" + */ + + // @@ Why use unsigned long when length can only be 1002 bytes? + // + + os << image_type << " " << mi.var << "value;" + << "unsigned long " << mi.var << "size;" + << "bool " << mi.var << "null;" + << endl; + } + + virtual void + traverse_date_time (member_info& mi) + { + os << image_type << " " << mi.var << "value;" + << "bool " << mi.var << "null;" + << endl; + } + + virtual void + traverse_string (member_info& mi) + { + // @@ Why not use std::size_t instead of unsigned long? + // + + os << image_type << " " << mi.var << "value;" + << "unsigned long " << mi.var << "size;" + << "bool " << mi.var << "null;" + << endl; + } + + virtual void + traverse_bit (member_info& mi) + { + // @@ Range is unlimited. Problematic for stack allocated + // array? + // + // Why not use std::size_t instead of unsigned long? + // + + unsigned int n (mi.st->range / 8 + (mi.st->range % 8 ? 1 : 0)); + + os << "unsigned char " << mi.var << "value[" << n << "];" + << "unsigned long " << mi.var << "size;" + << "bool " << mi.var << "null;" + << endl; + } + + virtual void + traverse_varbit (member_info& mi) + { + // @@ Why not use std::size_t instead of unsigned long? + // + + os << image_type << " " << mi.var << "value;" + << "unsigned long " << mi.var << "size;" + << "bool " << mi.var << "null;" + << endl; + } + + virtual void + traverse_uuid (member_info& mi) + { + // UUID is a 16-byte sequence. + // + os << "unsigned char " << mi.var << "value[16];" + << "bool " << mi.var << "null;" + << endl; + } + + private: + string image_type; + + member_image_type member_image_type_; + }; + entry image_member_; + } + } +} -- cgit v1.1