From 80b868be1e7c249daa714b0c7a5f87694edb8664 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 3 Jul 2015 18:23:51 +0200 Subject: Implement nested id support Now the 'id' specifier can optionally include the data member path to the id inside the composite value. For example: #pragma db id(first) std::pair p; Note that one somewhat counter-intuitive aspect of this new feature is that the whole member marked with id ('p' in the above example) and not just the actual id member ('p.first' in the above example) is treated as readonly. Such nested id also cannot be automatically assigned (auto specifier). --- odb/relational/source.hxx | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) (limited to 'odb/relational/source.hxx') diff --git a/odb/relational/source.hxx b/odb/relational/source.hxx index e67931f..f495cef 100644 --- a/odb/relational/source.hxx +++ b/odb/relational/source.hxx @@ -211,7 +211,7 @@ namespace relational semantics::class_& imc ( poly ? dynamic_cast (imf.scope ()) : c); - semantics::data_member& id (*id_member (imc)); + data_member_path& id (*id_member (imc)); semantics::type& idt (utype (id)); if (container (imb)) @@ -484,7 +484,7 @@ namespace relational instance l_cols; // Our id columns. instance r_cols; // Other side id columns. - semantics::data_member& id (*id_member (*us.obj)); + data_member_path& id (*id_member (*us.obj)); l_cols->traverse (id); @@ -1018,7 +1018,7 @@ namespace relational dt = quote_id (table); da = quote_id (poly ? alias + "_" + table.uname () : alias); - semantics::data_member& id (*id_member (c)); + data_member_path& id (*id_member (c)); instance oid_cols, cid_cols; oid_cols->traverse (id); @@ -1171,7 +1171,7 @@ namespace relational bool query_; size_t depth_; string table_; - semantics::data_member& id_; + data_member_path& id_; instance id_cols_; }; @@ -1391,7 +1391,7 @@ namespace relational // Order of these tests is important. // - if (!insert_send_auto_id && id (mi.m) && auto_ (mi.m)) + if (!insert_send_auto_id && auto_ (mi.m)) os << "if (sk != statement_insert && sk != statement_update)" << "{"; else if (section_ == 0 && separate_load (mi.m)) @@ -1567,7 +1567,7 @@ namespace relational // The same logic as in pre(). // - if (!insert_send_auto_id && id (mi.m) && auto_ (mi.m)) + if (!insert_send_auto_id && auto_ (mi.m)) block = true; else if (section_ == 0 && separate_load (mi.m)) block = true; @@ -1673,7 +1673,7 @@ namespace relational size_t insert (cc.total - cc.inverse - cc.optimistic_managed); size_t update (insert - cc.id - cc.readonly - cc.separate_update); - semantics::data_member* id; + data_member_path* id; if (!insert_send_auto_id && (id = id_member (c)) != 0 && auto_ (*id)) insert -= cc.id; @@ -2041,7 +2041,7 @@ namespace relational // If we don't send auto id in INSERT statement, ignore this // member altogether (we never send auto id in UPDATE). // - if (!insert_send_auto_id && id (mi.m) && auto_ (mi.m)) + if (!insert_send_auto_id && auto_ (mi.m)) return false; os << "// " << mi.m.name () << endl @@ -2985,7 +2985,7 @@ namespace relational bool poly_derived (poly && poly_root != &c); size_t poly_depth (poly_derived ? polymorphic_depth (c) : 1); - semantics::data_member* idm (id_member (poly ? *poly_root : c)); + data_member_path* idm (id_member (poly ? *poly_root : c)); os << "// " << mi.m.name () << (pre_ ? " pre" : " post") << endl << "//" << endl; @@ -3084,7 +3084,7 @@ namespace relational for (size_t i (0); i < poly_depth - 1; ++i) id_im += (i == 0 ? ".base" : "->base"); - string const& n (idm->name ()); + string const& n (idm->front ()->name ()); id_var = id_im + (poly_derived ? "->" : ".") + n + (n[n.size () - 1] == '_' ? "" : "_"); @@ -3563,7 +3563,7 @@ namespace relational if (polymorphic (*c)) c = &dynamic_cast (imf.scope ()); - semantics::data_member& inv_id (*id_member (*c)); + data_member_path& inv_id (*id_member (*c)); qname inv_table; // Other table name. string inv_qtable; @@ -6456,7 +6456,7 @@ namespace relational if (version (m)) p = version_value (m); - else if (context::id (m) && auto_ (m)) // Only simple id can be auto. + else if (auto_ (m)) // Only simple, direct id can be auto. p = qp_.auto_id (); else p = qp_.next (); -- cgit v1.1