aboutsummaryrefslogtreecommitdiff
path: root/odb/relational
diff options
context:
space:
mode:
Diffstat (limited to 'odb/relational')
-rw-r--r--odb/relational/common-query.cxx11
-rw-r--r--odb/relational/context.cxx42
-rw-r--r--odb/relational/context.hxx19
-rw-r--r--odb/relational/model.hxx54
-rw-r--r--odb/relational/mssql/context.cxx2
-rw-r--r--odb/relational/mssql/schema.cxx23
-rw-r--r--odb/relational/mssql/source.cxx10
-rw-r--r--odb/relational/mysql/context.cxx2
-rw-r--r--odb/relational/mysql/schema.cxx12
-rw-r--r--odb/relational/oracle/context.cxx19
-rw-r--r--odb/relational/oracle/context.hxx6
-rw-r--r--odb/relational/oracle/schema.cxx28
-rw-r--r--odb/relational/oracle/source.cxx11
-rw-r--r--odb/relational/pgsql/context.cxx2
-rw-r--r--odb/relational/pgsql/schema.cxx12
-rw-r--r--odb/relational/pgsql/source.cxx5
-rw-r--r--odb/relational/processor.cxx15
-rw-r--r--odb/relational/source.cxx21
-rw-r--r--odb/relational/source.hxx53
-rw-r--r--odb/relational/sqlite/context.cxx2
-rw-r--r--odb/relational/sqlite/schema.cxx11
21 files changed, 208 insertions, 152 deletions
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<sema_rel::unames> (
- 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<object_columns_list> ocl (column_name (im.path));
+ instance<object_columns_list> 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<sema_rel::unames> (
- 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<sema_rel::index> (
id + ".id", sin->type, sin->method, sin->options);
in->set ("cxx-location", sin->loc);
- model_.new_edge<sema_rel::unames> (
- t,
- *in,
- (sin->name.empty () ? compose_name (id_name, "i") : sin->name));
}
else
{
in = &model_.new_node<sema_rel::index> (id + ".id");
in->set ("cxx-location", m.location ());
- model_.new_edge<sema_rel::unames> (
- t, *in, compose_name (id_name, "i"));
}
+ model_.new_edge<sema_rel::unames> (
+ 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<object_columns> 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<sema_rel::index> (
id + ".index", sin->type, sin->method, sin->options);
in->set ("cxx-location", sin->loc);
- model_.new_edge<sema_rel::unames> (
- t,
- *in,
- (sin->name.empty () ? compose_name (col, "i") : sin->name));
}
else
{
in = &model_.new_node<sema_rel::index> (id + ".index");
in->set ("cxx-location", m.location ());
- model_.new_edge<sema_rel::unames> (
- t, *in, compose_name (col, "i"));
}
+ model_.new_edge<sema_rel::unames> (
+ t,
+ *in,
+ sin != 0 && !sin->name.empty ()
+ ? sin->name
+ : index_name (name, col));
+
model_.new_edge<sema_rel::contains> (
*in,
dynamic_cast<column&> (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<sema_rel::table&> (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<sema_rel::table&> (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<sema_rel::table&> (fk.scope ()).name ().uname ()
- + "_" + fk.name ());
- }
};
entry<create_foreign_key> 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<sema_rel::table&> (in.scope ()).name ());
-
- n.uname () += "_" + in.name ();
+ sema_rel::table& t (static_cast<sema_rel::table&> (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<sema_rel::table&> (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<object_columns_list> l_cols (col_prefix);
instance<object_columns_list> 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<object_columns> 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<object_columns> 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<sema_rel::table&> (in.scope ()).name ());
-
- n.uname () += "_" + in.name ();
+ sema_rel::table& t (static_cast<sema_rel::table&> (in.scope ()));
+ sema_rel::qname n (t.name ().qualifier ());
+ n.append (in.name ());
return quote_id (n);
}