diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2011-03-01 11:56:33 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2011-03-01 11:56:33 +0200 |
commit | fe69d94f3d2dcb37d69ac2d7a0f88ad5fce2ad5c (patch) | |
tree | d93f7ea21f66e9fe416c48766b99f987ad7b3804 /odb/mysql/sql-schema.cxx | |
parent | 6c97eb68924e7f9ea5b0d859182562ec8f812a1e (diff) |
Add support for embedded database schemas
New options: --schema-format, --default-schema. New example: schema/embedded.
Diffstat (limited to 'odb/mysql/sql-schema.cxx')
-rw-r--r-- | odb/mysql/sql-schema.cxx | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/odb/mysql/sql-schema.cxx b/odb/mysql/sql-schema.cxx new file mode 100644 index 0000000..7c71b24 --- /dev/null +++ b/odb/mysql/sql-schema.cxx @@ -0,0 +1,98 @@ +// file : odb/mysql/sql-schema.cxx +// author : Boris Kolpackov <boris@codesynthesis.com> +// copyright : Copyright (c) 2009-2011 Code Synthesis Tools CC +// license : GNU GPL v3; see accompanying LICENSE file + +#include <odb/mysql/common.hxx> +#include <odb/mysql/schema.hxx> +#include <odb/mysql/sql-schema.hxx> + +using namespace std; + +namespace mysql +{ + namespace + { + struct schema_emitter: emitter, context + { + schema_emitter (context& c): context (c) {} + + virtual void + pre () + { + first_ = true; + } + + virtual void + line (const std::string& l) + { + if (first_) + first_ = false; + else + os << endl; + + os << l; + } + + virtual void + post () + { + os << ';' << endl + << endl; + } + + private: + bool first_; + }; + + static char const file_header[] = + "/* This file was generated by ODB, object-relational mapping (ORM)\n" + " * compiler for C++.\n" + " */\n\n"; + } + + void + generate_schema (context& ctx) + { + ctx.os << file_header; + schema_emitter emitter (ctx); + + // Drop. + // + { + traversal::unit unit; + traversal::defines unit_defines; + traversal::namespace_ ns; + class_drop c (ctx, emitter); + + unit >> unit_defines >> ns; + unit_defines >> c; + + traversal::defines ns_defines; + + ns >> ns_defines >> ns; + ns_defines >> c; + unit.dispatch (ctx.unit); + } + + ctx.os << endl; + + // Create. + // + { + traversal::unit unit; + traversal::defines unit_defines; + traversal::namespace_ ns; + class_create c (ctx, emitter); + + unit >> unit_defines >> ns; + unit_defines >> c; + + traversal::defines ns_defines; + + ns >> ns_defines >> ns; + ns_defines >> c; + unit.dispatch (ctx.unit); + } + } +} |