diff options
Diffstat (limited to 'odb/relational')
-rw-r--r-- | odb/relational/changelog.cxx | 18 | ||||
-rw-r--r-- | odb/relational/model.hxx | 6 | ||||
-rw-r--r-- | odb/relational/mssql/schema.cxx | 2 | ||||
-rw-r--r-- | odb/relational/mysql/schema.cxx | 2 | ||||
-rw-r--r-- | odb/relational/oracle/model.cxx | 7 | ||||
-rw-r--r-- | odb/relational/oracle/schema.cxx | 14 | ||||
-rw-r--r-- | odb/relational/schema.hxx | 4 | ||||
-rw-r--r-- | odb/relational/sqlite/model.cxx | 7 | ||||
-rw-r--r-- | odb/relational/sqlite/schema.cxx | 4 |
9 files changed, 51 insertions, 13 deletions
diff --git a/odb/relational/changelog.cxx b/odb/relational/changelog.cxx index 6fc85b7..63ea44f 100644 --- a/odb/relational/changelog.cxx +++ b/odb/relational/changelog.cxx @@ -97,6 +97,24 @@ namespace relational if (pk.auto_ () != opk->auto_ ()) diagnose_primary_key (pk, "auto kind"); + // Database-specific information. + // + for (primary_key::extra_map::const_iterator i ( + pk.extra ().begin ()); i != pk.extra ().end (); ++i) + { + if (opk->extra ().count (i->first) == 0 || + opk->extra ()[i->first] != i->second) + diagnose_primary_key (pk, i->first.c_str ()); + } + + for (primary_key::extra_map::const_iterator i ( + opk->extra ().begin ()); i != opk->extra ().end (); ++i) + { + if (pk.extra ().count (i->first) == 0 || + pk.extra ()[i->first] != i->second) + diagnose_primary_key (pk, i->first.c_str ()); + } + if (pk.contains_size () != opk->contains_size ()) diagnose_primary_key (pk, "member set"); diff --git a/odb/relational/model.hxx b/odb/relational/model.hxx index 6552048..af88eb5 100644 --- a/odb/relational/model.hxx +++ b/odb/relational/model.hxx @@ -187,6 +187,11 @@ namespace relational } virtual void + primary_key (sema_rel::primary_key&) + { + } + + virtual void constraints (semantics::data_member& m, string const& /* name */, string const& /* id */, @@ -211,6 +216,7 @@ namespace relational // name. // model_.new_edge<sema_rel::unames> (table_, *pkey_, ""); + primary_key (*pkey_); } model_.new_edge<sema_rel::contains> (*pkey_, c); diff --git a/odb/relational/mssql/schema.cxx b/odb/relational/mssql/schema.cxx index c61bbc2..18c1f87 100644 --- a/odb/relational/mssql/schema.cxx +++ b/odb/relational/mssql/schema.cxx @@ -224,7 +224,7 @@ namespace relational } virtual void - auto_ (sema_rel::column&) + auto_ (sema_rel::primary_key&) { os << " IDENTITY"; } diff --git a/odb/relational/mysql/schema.cxx b/odb/relational/mysql/schema.cxx index f89bb61..f06914a 100644 --- a/odb/relational/mysql/schema.cxx +++ b/odb/relational/mysql/schema.cxx @@ -134,7 +134,7 @@ namespace relational create_column (base const& x): base (x) {} virtual void - auto_ (sema_rel::column&) + auto_ (sema_rel::primary_key&) { os << " AUTO_INCREMENT"; } diff --git a/odb/relational/oracle/model.cxx b/odb/relational/oracle/model.cxx index 8032b3b..91f1285 100644 --- a/odb/relational/oracle/model.cxx +++ b/odb/relational/oracle/model.cxx @@ -51,6 +51,13 @@ namespace relational return ostr.str (); } + + virtual void + primary_key (sema_rel::primary_key& pk) + { + if (pk.auto_ ()) + pk.extra ()["sequence"] = sequence_name (table_.name ()).string (); + } }; entry<object_columns> object_columns_; } diff --git a/odb/relational/oracle/schema.cxx b/odb/relational/oracle/schema.cxx index 03da322..5856dd2 100644 --- a/odb/relational/oracle/schema.cxx +++ b/odb/relational/oracle/schema.cxx @@ -149,16 +149,14 @@ namespace relational using sema_rel::primary_key; - qname const& table (t.name ()); - sema_rel::table::names_iterator i (t.find ("")); // Special name. primary_key* pk (i != t.names_end () ? &dynamic_cast<primary_key&> (i->nameable ()) : 0); - string qt (quote_id (table)); + string qt (quote_id (t.name ())); string qs (pk != 0 && pk->auto_ () - ? quote_id (sequence_name (table)) + ? quote_id (qname::from_string (pk->extra ()["sequence"])) : ""); if (migration) @@ -249,7 +247,7 @@ namespace relational primary_key (); if (pk != 0 && pk->auto_ ()) - auto_ (c); + auto_ (*pk); } }; entry<create_column> create_column_; @@ -307,9 +305,11 @@ namespace relational if (pk != 0 && pk->auto_ ()) { + string qs ( + quote_id (qname::from_string (pk->extra ()["sequence"]))); + pre_statement (); - os_ << "CREATE SEQUENCE " << - quote_id (sequence_name (t.name ())) << endl + os_ << "CREATE SEQUENCE " << qs << endl << " START WITH 1 INCREMENT BY 1" << endl; post_statement (); } diff --git a/odb/relational/schema.hxx b/odb/relational/schema.hxx index 95dd68c..85dca09 100644 --- a/odb/relational/schema.hxx +++ b/odb/relational/schema.hxx @@ -535,7 +535,7 @@ namespace relational primary_key (); if (pk != 0 && pk->auto_ ()) - auto_ (c); + auto_ (*pk); } virtual void @@ -570,7 +570,7 @@ namespace relational } virtual void - auto_ (sema_rel::column&) + auto_ (sema_rel::primary_key&) { } diff --git a/odb/relational/sqlite/model.cxx b/odb/relational/sqlite/model.cxx index 63a5302..8f7e341 100644 --- a/odb/relational/sqlite/model.cxx +++ b/odb/relational/sqlite/model.cxx @@ -57,6 +57,13 @@ namespace relational return ostr.str (); } + + virtual void + primary_key (sema_rel::primary_key& pk) + { + if (pk.auto_ () && options.sqlite_lax_auto_id ()) + pk.extra ()["lax"] = "true"; + } }; entry<object_columns> object_columns_; } diff --git a/odb/relational/sqlite/schema.cxx b/odb/relational/sqlite/schema.cxx index 4a2eef2..46ce762 100644 --- a/odb/relational/sqlite/schema.cxx +++ b/odb/relational/sqlite/schema.cxx @@ -117,9 +117,9 @@ namespace relational } virtual void - auto_ (sema_rel::column&) + auto_ (sema_rel::primary_key& pk) { - if (options.sqlite_lax_auto_id ()) + if (pk.extra ().count ("lax")) os << " /*AUTOINCREMENT*/"; else os << " AUTOINCREMENT"; |