From a5f24411433aeb61ad015129354a664820affab0 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Wed, 12 Dec 2012 11:26:44 +0200 Subject: Add support for SQL name transformations --- odb/relational/common-query.cxx | 11 +++++--- odb/relational/context.cxx | 42 ++++++++++++++++++++++++++++++ odb/relational/context.hxx | 19 +++++++++++--- odb/relational/model.hxx | 54 +++++++++++++++++++++++---------------- odb/relational/mssql/context.cxx | 2 ++ odb/relational/mssql/schema.cxx | 23 ++--------------- odb/relational/mssql/source.cxx | 10 ++++++-- odb/relational/mysql/context.cxx | 2 ++ odb/relational/mysql/schema.cxx | 12 --------- odb/relational/oracle/context.cxx | 19 ++++++++++++++ odb/relational/oracle/context.hxx | 6 +++++ odb/relational/oracle/schema.cxx | 28 +++++--------------- odb/relational/oracle/source.cxx | 11 ++++---- odb/relational/pgsql/context.cxx | 2 ++ odb/relational/pgsql/schema.cxx | 12 --------- odb/relational/pgsql/source.cxx | 5 +++- odb/relational/processor.cxx | 15 ++++++++--- odb/relational/source.cxx | 21 ++++++++------- odb/relational/source.hxx | 53 ++++++++++++++++++-------------------- odb/relational/sqlite/context.cxx | 2 ++ odb/relational/sqlite/schema.cxx | 11 +++----- 21 files changed, 208 insertions(+), 152 deletions(-) (limited to 'odb/relational') diff --git a/odb/relational/common-query.cxx b/odb/relational/common-query.cxx index e49132f..40ed71b 100644 --- a/odb/relational/common-query.cxx +++ b/odb/relational/common-query.cxx @@ -34,17 +34,20 @@ namespace relational if (composite_wrapper (utype (*id_member (c)))) { - n = column_prefix (m, key_prefix_, default_name_); + n = column_prefix (m, key_prefix_, default_name_).prefix; if (n.empty ()) n = public_name_db (m); - else + else if (n[n.size () - 1] == '_') n.resize (n.size () - 1); // Remove trailing underscore. } else - n = column_name (m, key_prefix_, default_name_); + { + bool dummy; + n = column_name (m, key_prefix_, default_name_, dummy); + } - alias = compose_name (column_prefix_, n); + alias = compose_name (column_prefix_.prefix, n); } generate_def (public_name (m), c, alias); diff --git a/odb/relational/context.cxx b/odb/relational/context.cxx index 08e68e5..b484ad9 100644 --- a/odb/relational/context.cxx +++ b/odb/relational/context.cxx @@ -28,6 +28,8 @@ namespace relational insert_send_auto_id (current ().insert_send_auto_id), delay_freeing_statement_result (current ().delay_freeing_statement_result), need_image_clone (current ().need_image_clone), + global_index (current ().global_index), + global_fkey (current ().global_fkey), bind_vector (data_->bind_vector_), truncated_vector (data_->truncated_vector_) { @@ -45,6 +47,46 @@ namespace relational } string context:: + index_name (qname const& table, string const& base) + { + string n; + + if (options.index_suffix ().count (db) != 0) + n = base + options.index_suffix ()[db]; + else + n = compose_name (base, "i"); + + // If this database has global index names, then add the table + // name as a prefix (the schema, if needed, will be added by + // database-specific create_index overrides). + // + if (global_index) + n = compose_name (table.uname (), n); + + return transform_name (n, sql_name_index); + } + + string context:: + fkey_name (qname const& table, string const& base) + { + string n; + + if (options.fkey_suffix ().count (db) != 0) + n = base + options.fkey_suffix ()[db]; + else + n = compose_name (base, "fk"); + + // If this database has global index names, then add the table + // name as a prefix (the schema, if needed, will be added by + // database-specific create_foreign_key overrides). + // + if (global_fkey) + n = compose_name (table.uname (), n); + + return transform_name (n, sql_name_fkey); + } + + string context:: convert (string const& e, string const& c) { size_t p (c.find ("(?)")); diff --git a/odb/relational/context.hxx b/odb/relational/context.hxx index 990e0aa..55c9a23 100644 --- a/odb/relational/context.hxx +++ b/odb/relational/context.hxx @@ -105,9 +105,9 @@ namespace relational // Quoted column and table names. // string - column_qname (semantics::data_member& m) const + column_qname (semantics::data_member& m, column_prefix const& cp) const { - return quote_id (column_name (m)); + return quote_id (column_name (m, cp)); } string @@ -119,9 +119,10 @@ namespace relational string column_qname (semantics::data_member& m, string const& key_prefix, - string const& default_name) const + string const& default_name, + column_prefix const& cp) const { - return quote_id (column_name (m, key_prefix, default_name)); + return quote_id (column_name (m, key_prefix, default_name, cp)); } string @@ -142,6 +143,13 @@ namespace relational return quote_id (table_name (m, p)); } + public: + string + index_name (qname const& table, string const& base); + + string + fkey_name (qname const& table, string const& base); + // Custom database type conversion. // public: @@ -261,6 +269,9 @@ namespace relational bool delay_freeing_statement_result; bool need_image_clone; + bool global_index; + bool global_fkey; + string const& bind_vector; string const& truncated_vector; }; diff --git a/odb/relational/model.hxx b/odb/relational/model.hxx index 4245c91..2835a3a 100644 --- a/odb/relational/model.hxx +++ b/odb/relational/model.hxx @@ -298,16 +298,18 @@ namespace relational name = fk.contains_begin ()->column ().name (); else { - string p (column_prefix (m, key_prefix_, default_name_)); + string p (column_prefix (m, key_prefix_, default_name_).prefix); if (p.empty ()) p = public_name_db (m); + else if (p[p.size () - 1] == '_') + p.resize (p.size () - 1); // Remove trailing underscore. - name = compose_name (column_prefix_, p); + name = compose_name (column_prefix_.prefix, p); } model_.new_edge ( - table_, fk, compose_name (name, "fk")); + table_, fk, fkey_name (table_.name (), name)); } protected: @@ -371,10 +373,11 @@ namespace relational if (type* comp = composite_wrapper (utype (*im.path.back ()))) { - // Composite value. Get the list of the columns. Here - // column_name() returns the column prefix. + // Composite value. Get the list of the columns. Note that + // the column prefix needs to contain all the components. // - instance ocl (column_name (im.path)); + instance ocl ( + column_prefix (im.path, true)); ocl->traverse (*comp); for (object_columns_list::iterator i (ocl->begin ()); @@ -504,7 +507,11 @@ namespace relational // composite), in which case it can be empty. In this case // we just fallback on the default name. // - string id_name (column_name (m, "id", "object_id")); + // Finally, this is a top-level column, so there is no column + // prefix. + // + string id_name ( + column_name (m, "id", "object_id", column_prefix ())); if (id_name.empty ()) id_name = "object_id"; @@ -519,7 +526,7 @@ namespace relational sema_rel::foreign_key::cascade)); fk.set ("cxx-location", m.location ()); model_.new_edge ( - t, fk, compose_name (id_name, "fk")); + t, fk, fkey_name (t.name (), id_name)); // Get referenced columns. // @@ -555,19 +562,20 @@ namespace relational in = &model_.new_node ( id + ".id", sin->type, sin->method, sin->options); in->set ("cxx-location", sin->loc); - model_.new_edge ( - t, - *in, - (sin->name.empty () ? compose_name (id_name, "i") : sin->name)); } else { in = &model_.new_node (id + ".id"); in->set ("cxx-location", m.location ()); - model_.new_edge ( - t, *in, compose_name (id_name, "i")); } + model_.new_edge ( + t, + *in, + sin != 0 && !sin->name.empty () + ? sin->name + : index_name (name, id_name)); + // All the columns we have in this table so far are for the // object id. Add them to the index. // @@ -591,9 +599,10 @@ namespace relational instance oc (model_, t); oc->traverse (m, container_it (ct), "index", "index"); - // This is a simple value so the name cannot be empty. + // This is a simple value so the name cannot be empty. It is + // also a top-level column, so there is no column prefix. // - string col (column_name (m, "index", "index")); + string col (column_name (m, "index", "index", column_prefix ())); // Index. See if we have a custom index. // @@ -607,19 +616,20 @@ namespace relational in = &model_.new_node ( id + ".index", sin->type, sin->method, sin->options); in->set ("cxx-location", sin->loc); - model_.new_edge ( - t, - *in, - (sin->name.empty () ? compose_name (col, "i") : sin->name)); } else { in = &model_.new_node (id + ".index"); in->set ("cxx-location", m.location ()); - model_.new_edge ( - t, *in, compose_name (col, "i")); } + model_.new_edge ( + t, + *in, + sin != 0 && !sin->name.empty () + ? sin->name + : index_name (name, col)); + model_.new_edge ( *in, dynamic_cast (t.find (col)->nameable ()), diff --git a/odb/relational/mssql/context.cxx b/odb/relational/mssql/context.cxx index 7e11564..c64ae57 100644 --- a/odb/relational/mssql/context.cxx +++ b/odb/relational/mssql/context.cxx @@ -88,6 +88,8 @@ namespace relational insert_send_auto_id = false; delay_freeing_statement_result = true; need_image_clone = true; + global_index = false; + global_fkey = true; data_->bind_vector_ = "mssql::bind*"; // Populate the C++ type to DB type map. diff --git a/odb/relational/mssql/schema.cxx b/odb/relational/mssql/schema.cxx index 47cb250..20f9faf 100644 --- a/odb/relational/mssql/schema.cxx +++ b/odb/relational/mssql/schema.cxx @@ -80,18 +80,11 @@ namespace relational if (dt_.tables_.find (rt) != dt_.tables_.end () || m.find (rt) == m.names_end ()) { - - // In SQL Server, foreign key names are schema-global. Make them - // unique by prefixing the key name with table name. Note, however, - // that they cannot have a schema. - // - string n (t.name ().uname () + "_" + fk.name ()); - pre_statement (); - os << "IF OBJECT_ID(" << quote_string (n) << ", " << + os << "IF OBJECT_ID(" << quote_string (fk.name ()) << ", " << quote_string ("F") << ") IS NOT NULL" << endl << " ALTER TABLE " << quote_id (t.name ()) << " DROP" << endl - << " CONSTRAINT " << quote_id (n) << endl; + << " CONSTRAINT " << quote_id (fk.name ()) << endl; post_statement (); } } @@ -208,18 +201,6 @@ namespace relational } } - virtual string - name (sema_rel::foreign_key& fk) - { - // In SQL Server, foreign key names are schema-global. Make them - // unique by prefixing the key name with table name. Note, however, - // that they cannot have a schema. - // - return quote_id ( - static_cast (fk.scope ()).name ().uname () - + "_" + fk.name ()); - } - virtual void deferred () { diff --git a/odb/relational/mssql/source.cxx b/odb/relational/mssql/source.cxx index 7fce155..5d0c594 100644 --- a/odb/relational/mssql/source.cxx +++ b/odb/relational/mssql/source.cxx @@ -909,8 +909,14 @@ namespace relational } if (p == persist_after_columns) - os << strlit (" OUTPUT " + convert_from ( - "INSERTED." + column_qname (*id), *id)) << endl; + { + // Top-level auto id. + // + os << strlit ( + " OUTPUT " + convert_from ( + "INSERTED." + column_qname ( + *id, column_prefix ()), *id)) << endl; + } } virtual void diff --git a/odb/relational/mysql/context.cxx b/odb/relational/mysql/context.cxx index 8bf700e..ba22733 100644 --- a/odb/relational/mysql/context.cxx +++ b/odb/relational/mysql/context.cxx @@ -84,6 +84,8 @@ namespace relational insert_send_auto_id = true; delay_freeing_statement_result = false; need_image_clone = false; + global_index = false; + global_fkey = true; data_->bind_vector_ = "MYSQL_BIND*"; data_->truncated_vector_ = "my_bool*"; diff --git a/odb/relational/mysql/schema.cxx b/odb/relational/mysql/schema.cxx index 8068fc4..5b34cfa 100644 --- a/odb/relational/mysql/schema.cxx +++ b/odb/relational/mysql/schema.cxx @@ -86,18 +86,6 @@ namespace relational base::traverse (fk); } - virtual string - name (sema_rel::foreign_key& fk) - { - // In MySQL, foreign key names are database-global. Make them - // unique by prefixing the key name with table name. Note, - // however, that they cannot be prefixed with the database name. - // - return quote_id ( - static_cast (fk.scope ()).name ().uname () - + "_" + fk.name ()); - } - virtual void deferred () { diff --git a/odb/relational/oracle/context.cxx b/odb/relational/oracle/context.cxx index 4ba8659..df62ce8 100644 --- a/odb/relational/oracle/context.cxx +++ b/odb/relational/oracle/context.cxx @@ -85,6 +85,8 @@ namespace relational insert_send_auto_id = false; delay_freeing_statement_result = false; need_image_clone = true; + global_index = true; + global_fkey = true; data_->bind_vector_ = "oracle::bind*"; // Populate the C++ type to DB type map. @@ -168,6 +170,23 @@ namespace relational s == "long long unsigned int"; } + qname context:: + sequence_name (qname const& table) + { + string n; + + if (options.sequence_suffix ().count (db) != 0) + n = table.uname () + options.sequence_suffix ()[db]; + else + n = compose_name (table.uname (), "seq"); + + n = transform_name (n, sql_name_sequence); + + qname r (table.qualifier ()); + r.append (n); + return r; + } + // // SQL type parsing. // diff --git a/odb/relational/oracle/context.hxx b/odb/relational/oracle/context.hxx index 6b07a5f..0008724 100644 --- a/odb/relational/oracle/context.hxx +++ b/odb/relational/oracle/context.hxx @@ -106,6 +106,12 @@ namespace relational static bool unsigned_integer (semantics::type&); + public: + // Construct sequence name from a given table name. + // + qname + sequence_name (qname const& table); + protected: virtual string const& convert_expr (string const&, semantics::data_member&, bool); diff --git a/odb/relational/oracle/schema.cxx b/odb/relational/oracle/schema.cxx index f07e0d6..ffe4b31 100644 --- a/odb/relational/oracle/schema.cxx +++ b/odb/relational/oracle/schema.cxx @@ -127,7 +127,7 @@ namespace relational { os << " BEGIN" << endl << " EXECUTE IMMEDIATE 'DROP SEQUENCE " << - quote_id (table + "_seq") << "';" << endl + quote_id (sequence_name (table)) << "';" << endl << " EXCEPTION" << endl << " WHEN OTHERS THEN" << endl << " IF SQLCODE != -2289 THEN RAISE; END IF;" << endl @@ -184,18 +184,6 @@ namespace relational fk.set ("oracle-fk-defined", true); // Mark it as defined. } } - - virtual string - name (sema_rel::foreign_key& fk) - { - // In Oracle, foreign key names are schema-global. Make them - // unique by prefixing the key name with table name. Note, - // however, that they cannot have a schema. - // - return quote_id ( - static_cast (fk.scope ()).name ().uname () - + "_" + fk.name ()); - } }; entry create_foreign_key_; @@ -244,7 +232,8 @@ namespace relational if (pk != 0 && pk->auto_ ()) { pre_statement (); - os_ << "CREATE SEQUENCE " << quote_id (t.name () + "_seq") << endl + os_ << "CREATE SEQUENCE " << + quote_id (sequence_name (t.name ())) << endl << " START WITH 1 INCREMENT BY 1" << endl; post_statement (); } @@ -266,14 +255,11 @@ namespace relational virtual string name (sema_rel::index& in) { - // In Oracle, index names are database-global. Make them unique - // by prefixing the index name with table name (preserving the - // schema). + // In Oracle, index names can be qualified with the schema. // - sema_rel::qname n ( - static_cast (in.scope ()).name ()); - - n.uname () += "_" + in.name (); + sema_rel::table& t (static_cast (in.scope ())); + sema_rel::qname n (t.name ().qualifier ()); + n.append (in.name ()); return quote_id (n); } }; diff --git a/odb/relational/oracle/source.cxx b/odb/relational/oracle/source.cxx index 85be6cc..f6cdfcd 100644 --- a/odb/relational/oracle/source.cxx +++ b/odb/relational/oracle/source.cxx @@ -17,7 +17,7 @@ namespace relational { namespace relational = relational::source; - struct query_parameters: relational::query_parameters + struct query_parameters: relational::query_parameters, context { query_parameters (base const& x): base (x), i_ (0) {} @@ -33,9 +33,7 @@ namespace relational virtual string auto_id () { - // The same sequence name as used in schema.cxx. - // - return quote_id (table_ + "_seq") + ".nextval"; + return quote_id (sequence_name (table_)) + ".nextval"; } private: @@ -600,9 +598,12 @@ namespace relational if (id != 0 && !poly_derived && id->count ("auto")) { + // Top-level auto id. + // os << endl << strlit (" RETURNING " + - convert_from (column_qname (*id), *id) + + convert_from (column_qname (*id, column_prefix ()), + *id) + " INTO " + qp.next ()); } diff --git a/odb/relational/pgsql/context.cxx b/odb/relational/pgsql/context.cxx index 391c65e..0f68281 100644 --- a/odb/relational/pgsql/context.cxx +++ b/odb/relational/pgsql/context.cxx @@ -84,6 +84,8 @@ namespace relational insert_send_auto_id = false; delay_freeing_statement_result = false; need_image_clone = false; + global_index = true; + global_fkey = false; data_->bind_vector_ = "pgsql::bind*"; data_->truncated_vector_ = "bool*"; diff --git a/odb/relational/pgsql/schema.cxx b/odb/relational/pgsql/schema.cxx index 5574bdb..b0d4f50 100644 --- a/odb/relational/pgsql/schema.cxx +++ b/odb/relational/pgsql/schema.cxx @@ -170,18 +170,6 @@ namespace relational { create_index (base const& x): base (x) {} - virtual string - name (sema_rel::index& in) - { - // In PostgreSQL, index names are database-global. Make them unique - // by prefixing the index name with table name. Note, however, that - // they cannot be qualified with the schema name. - // - return quote_id ( - static_cast (in.scope ()).name ().uname () - + "_" + in.name ()); - } - virtual void create (sema_rel::index& in) { diff --git a/odb/relational/pgsql/source.cxx b/odb/relational/pgsql/source.cxx index 332e25b..e106758 100644 --- a/odb/relational/pgsql/source.cxx +++ b/odb/relational/pgsql/source.cxx @@ -618,9 +618,12 @@ namespace relational if (id != 0 && !poly_derived && id->count ("auto")) { + // Top-level auto id. + // os << endl << strlit (" RETURNING " + - convert_from (column_qname (*id), *id)); + convert_from (column_qname (*id, column_prefix ()), + *id)); } } diff --git a/odb/relational/processor.cxx b/odb/relational/processor.cxx index 88e86fc..3e969be 100644 --- a/odb/relational/processor.cxx +++ b/odb/relational/processor.cxx @@ -1106,6 +1106,11 @@ namespace relational } } + // Add the table prefix if this database has global index names. + // + if (!in.name.empty () && global_index) + in.name = table_name_prefix (c.scope ()) + in.name; + // Handle container indexes. // if (j != in.members.end ()) @@ -1164,12 +1169,14 @@ namespace relational // be empty, in which case we will just fall back on the // member's public name. // - in.name = column_name (in.members.front ().path); + string n (column_prefix (in.members.front ().path, true).prefix); - if (in.name.empty ()) - in.name = public_name_db (*in.members.front ().path.back ()); + if (n.empty ()) + n = public_name_db (*in.members.front ().path.back ()); + else if (n[n.size () - 1] == '_') + n.resize (n.size () - 1); // Remove trailing underscore. - in.name = compose_name (in.name, "i"); + in.name = index_name (table_name (c), n); } ++i; diff --git a/odb/relational/source.cxx b/odb/relational/source.cxx index 74690d6..f133750 100644 --- a/odb/relational/source.cxx +++ b/odb/relational/source.cxx @@ -699,9 +699,14 @@ traverse_object (type& c) } if (opt != 0 && !poly_derived) + { + // Top-level version column. + // os << endl - << strlit (" AND " + column_qname (*opt) + "=" + + << strlit (" AND " + column_qname (*opt, column_prefix ()) + "=" + convert_to (qp->next (), *opt)); + } + os << ";" << endl; } @@ -744,8 +749,10 @@ traverse_object (type& c) convert_to (qp->next (), i->type, *i->member)); } + // Top-level version column. + // os << endl - << strlit (" AND " + column_qname (*opt) + "=" + + << strlit (" AND " + column_qname (*opt, column_prefix ()) + "=" + convert_to (qp->next (), *opt)) << ";" << endl; } @@ -3339,11 +3346,7 @@ traverse_view (type& c) // function would have to return a member path instead // of just a single member. // - table_prefix tp ( - context::schema (vo->obj->scope ()), - context::table_name_prefix (vo->obj->scope ()), - table_name (*vo->obj) + "_"); - ct = table_qname (*im, tp); + ct = table_qname (*im, table_prefix (*vo->obj)); } else ct = table_qname (*e.vo->obj, e.member_path); @@ -3516,10 +3519,10 @@ traverse_view (type& c) } else { - string col_prefix; + column_prefix col_prefix; if (im == 0) - col_prefix = object_columns_base::column_prefix (e.member_path); + col_prefix = column_prefix (e.member_path); instance l_cols (col_prefix); instance r_cols; diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx index 610c545..1e223af 100644 --- a/odb/relational/source.hxx +++ b/odb/relational/source.hxx @@ -80,7 +80,7 @@ namespace relational object_columns (statement_kind sk, statement_columns& sc, query_parameters* param = 0) - : object_columns_base (true, "", true), + : object_columns_base (true, true), sk_ (sk), sc_ (sc), param_ (param), depth_ (1) { } @@ -89,7 +89,7 @@ namespace relational statement_kind sk, statement_columns& sc, size_t depth = 1) - : object_columns_base (true, "", true), + : object_columns_base (true, true), sk_ (sk), sc_ (sc), param_ (0), @@ -158,12 +158,7 @@ namespace relational string table; if (!table_name_.empty ()) - { - table_prefix tp (schema (c.scope ()), - table_name_prefix (c.scope ()), - table_name (c) + "_"); - table = table_qname (*im, tp); - } + table = table_qname (*im, table_prefix (c)); instance oc (table, sk_, sc_); oc->traverse (*im, idt, "id", "object_id", &c); @@ -190,17 +185,20 @@ namespace relational if (composite_wrapper (idt)) { - n = column_prefix (m, key_prefix_, default_name_); + n = column_prefix (m, key_prefix_, default_name_).prefix; if (n.empty ()) n = public_name_db (m); - else + else if (n[n.size () - 1] == '_') n.resize (n.size () - 1); // Remove trailing underscore. } else - n = column_name (m, key_prefix_, default_name_); + { + bool dummy; + n = column_name (m, key_prefix_, default_name_, dummy); + } - table = quote_id (compose_name (column_prefix_, n)); + table = quote_id (compose_name (column_prefix_.prefix, n)); } instance oc (table, sk_, sc_); @@ -461,7 +459,7 @@ namespace relational string const& alias = "", string const prefix = "", string const& suffix = "\n") - : object_columns_base (true, "", true), + : object_columns_base (true, true), obj_ (obj), depth_ (depth), alias_ (alias), @@ -537,7 +535,7 @@ namespace relational //@@ context::{cur,top}_object; might have to be created every time. // object_joins (semantics::class_& scope, bool query, size_t depth = 1) - : object_columns_base (true, "", true), + : object_columns_base (true, true), query_ (query), depth_ (depth), table_ (table_qname (scope)), @@ -595,17 +593,20 @@ namespace relational if (composite_wrapper (utype (*id_member (c)))) { - n = column_prefix (m, key_prefix_, default_name_); + n = column_prefix (m, key_prefix_, default_name_).prefix; if (n.empty ()) n = public_name_db (m); - else + else if (n[n.size () - 1] == '_') n.resize (n.size () - 1); // Remove trailing underscore. } else - n = column_name (m, key_prefix_, default_name_); + { + bool dummy; + n = column_name (m, key_prefix_, default_name_, dummy); + } - alias = compose_name (column_prefix_, n); + alias = compose_name (column_prefix_.prefix, n); } semantics::class_* poly_root (polymorphic (c)); @@ -621,11 +622,7 @@ namespace relational // This container is a direct member of the class so the table // prefix is just the class table name. // - qname const& ct (table_name (c)); - table_prefix tp (schema (c.scope ()), - table_name_prefix (c.scope ()), - ct + "_"); - t = table_qname (*im, tp); + t = table_qname (*im, table_prefix (c)); // Container's value is our id. // @@ -1952,10 +1949,7 @@ namespace relational // This other container is a direct member of the class so the // table prefix is just the class table name. // - table_prefix tp (schema (c->scope ()), - table_name_prefix (c->scope ()), - table_name (*c) + "_"); - inv_table = table_name (*im, tp); + inv_table = table_name (*im, table_prefix (*c)); inv_qtable = quote_id (inv_table); inv_id_cols->traverse (*im, utype (inv_id), "id", "object_id", c); @@ -2077,7 +2071,10 @@ namespace relational if (ordered) { - string const& col (column_qname (m, "index", "index")); + // Top-level column. + // + string const& col ( + column_qname (m, "index", "index", column_prefix ())); os << endl << strlit (" ORDER BY " + qtable + "." + col); diff --git a/odb/relational/sqlite/context.cxx b/odb/relational/sqlite/context.cxx index 5dc3fa8..5e46c77 100644 --- a/odb/relational/sqlite/context.cxx +++ b/odb/relational/sqlite/context.cxx @@ -85,6 +85,8 @@ namespace relational insert_send_auto_id = true; delay_freeing_statement_result = false; need_image_clone = false; + global_index = true; + global_fkey = false; data_->bind_vector_ = "sqlite::bind*"; data_->truncated_vector_ = "bool*"; diff --git a/odb/relational/sqlite/schema.cxx b/odb/relational/sqlite/schema.cxx index 8efef66..1d4b1d2 100644 --- a/odb/relational/sqlite/schema.cxx +++ b/odb/relational/sqlite/schema.cxx @@ -56,14 +56,11 @@ namespace relational virtual string name (sema_rel::index& in) { - // In SQLite, index names are database-global. Make them unique - // by prefixing the index name with table name (preserving the - // database). + // In SQLite, index names can be qualified with the database. // - sema_rel::qname n ( - static_cast (in.scope ()).name ()); - - n.uname () += "_" + in.name (); + sema_rel::table& t (static_cast (in.scope ())); + sema_rel::qname n (t.name ().qualifier ()); + n.append (in.name ()); return quote_id (n); } -- cgit v1.1