diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2011-03-10 08:44:28 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2011-03-21 15:39:59 +0200 |
commit | 7ae497743c7b042904fe1f6b4153ab3f4763ff2b (patch) | |
tree | 08ba3f742f20d16d893856ccceb070094bd69225 /odb/relational/mysql/context.hxx | |
parent | 2436f20262a41bd1cafa5107ab6d6799c03e0964 (diff) |
Split MySQL code generator into common and db-specific parts
The common part (in relational/) still has some MySQL-specific parts.
Also, add the notion of the current context which is used to avoid
explicitly passing the context object to every generator's c-tor.
Diffstat (limited to 'odb/relational/mysql/context.hxx')
-rw-r--r-- | odb/relational/mysql/context.hxx | 127 |
1 files changed, 127 insertions, 0 deletions
diff --git a/odb/relational/mysql/context.hxx b/odb/relational/mysql/context.hxx new file mode 100644 index 0000000..b1de84c --- /dev/null +++ b/odb/relational/mysql/context.hxx @@ -0,0 +1,127 @@ +// file : odb/relational/mysql/context.hxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v3; see accompanying LICENSE file + +#ifndef ODB_RELATIONAL_MYSQL_CONTEXT_HXX +#define ODB_RELATIONAL_MYSQL_CONTEXT_HXX + +#include <odb/relational/context.hxx> + +namespace relational +{ + namespace mysql + { + struct sql_type + { + // Keep the order in each block of types. + // + enum core_type + { + // Integral types. + // + TINYINT, + SMALLINT, + MEDIUMINT, + INT, + BIGINT, + + // Float types. + // + FLOAT, + DOUBLE, + DECIMAL, + + // Data-time types. + // + DATE, + TIME, + DATETIME, + TIMESTAMP, + YEAR, + + // String and binary types. + // + CHAR, + BINARY, + VARCHAR, + VARBINARY, + TINYTEXT, + TINYBLOB, + TEXT, + BLOB, + MEDIUMTEXT, + MEDIUMBLOB, + LONGTEXT, + LONGBLOB, + + // Other types. + // + BIT, + ENUM, + SET, + + // Invalid type. + // + invalid + }; + + sql_type () : type (invalid), unsign (false), range (false) {} + + core_type type; + bool unsign; + bool range; + unsigned int range_value; // MySQL max value is 2^32 - 1 (LONGBLOG/TEXT). + }; + + class context: public virtual relational::context + { + public: + sql_type const& + db_type (semantics::data_member&, string const& key_prefix = string ()); + + protected: + virtual bool + grow_impl (semantics::class_&); + + virtual bool + grow_impl (semantics::data_member&); + + virtual bool + grow_impl (semantics::data_member&, semantics::type&, string const&); + + protected: + virtual string + quote_id_impl (string const&) const; + + private: + struct data: base_context::data + { + data (std::ostream& os): base_context::data (os) {} + + virtual string + column_type_impl (semantics::type&, + string const& type, + semantics::context&, + column_type_flags) const; + }; + + private: + data* data_; + + public: + static context& + current () + { + return dynamic_cast<context&> (base_context::current ()); + } + + context (std::ostream&, semantics::unit&, options_type const&); + + protected: + context (); + }; + } +} + +#endif // ODB_RELATIONAL_MYSQL_CONTEXT_HXX |