// file : odb/source.cxx // copyright : Copyright (c) 2009-2013 Code Synthesis Tools CC // license : GNU GPL v3; see accompanying LICENSE file #include #include #include #include using namespace std; namespace source { struct class_: traversal::class_, virtual context { class_ () : query_columns_type_ (false, false, false), view_query_columns_type_ (false) { } virtual void traverse (type& c) { if (!options.at_once () && class_file (c) != unit.file ()) return; if (object (c)) traverse_object (c); else if (view (c)) traverse_view (c); } void traverse_object (type&); void traverse_view (type&); private: instance query_columns_type_; instance view_query_columns_type_; }; } void source::class_:: traverse_object (type& c) { bool poly (polymorphic (c)); bool abst (abstract (c)); bool reuse_abst (abst && !poly); // The rest only applies to dynamic milti-database support. // if (!multi_dynamic) return; os << "// " << class_name (c) << endl << "//" << endl << endl; // query_columns // if (options.generate_query ()) query_columns_type_->traverse (c); // The rest does not apply to reuse-abstract objects. // if (reuse_abst) return; string const& type (class_fq_name (c)); string traits ("access::object_traits_impl< " + type + ", id_common >"); os << "const " << traits << "::" << endl << "function_table_type*" << endl << traits << "::" << endl << "function_table[database_count];" << endl; } void source::class_:: traverse_view (type& c) { // The rest only applies to dynamic milti-database support. // if (!multi_dynamic) return; os << "// " << class_name (c) << endl << "//" << endl << endl; if (c.get ("object-count") != 0) view_query_columns_type_->traverse (c); string const& type (class_fq_name (c)); string traits ("access::view_traits_impl< " + type + ", id_common >"); os << "const " << traits << "::" << endl << "function_table_type*" << endl << traits << "::" << endl << "function_table[database_count];" << endl; } namespace source { void generate () { context ctx; ostream& os (ctx.os); traversal::unit unit; traversal::defines unit_defines; typedefs unit_typedefs (false); traversal::namespace_ ns; class_ c; unit >> unit_defines >> ns; unit_defines >> c; unit >> unit_typedefs >> c; traversal::defines ns_defines; typedefs ns_typedefs (false); ns >> ns_defines >> ns; ns_defines >> c; ns >> ns_typedefs >> c; os << "namespace odb" << "{"; unit.dispatch (ctx.unit); os << "}"; } }