From 1a87500a2e7e6d4c0cb783cc6f003fc703315d16 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 9 Oct 2015 18:42:26 +0200 Subject: Use odb::nested_key instead of brep::index_pair --- brep/package | 128 ++++++++++++----------------------------------------------- 1 file changed, 25 insertions(+), 103 deletions(-) (limited to 'brep/package') diff --git a/brep/package b/brep/package index fd7fb34..98e0ca4 100644 --- a/brep/package +++ b/brep/package @@ -17,6 +17,7 @@ #include #include // database #include +#include #include #include @@ -211,22 +212,6 @@ namespace brep // template implementation is required to instantiate unrelated key // classes to achieve proper table column naming with ODB pragmas. // - template - struct index_pair - { - std::size_t first; - std::size_t second; - - index_pair () = default; - index_pair (std::size_t f, std::size_t s): first (f), second (s) {} - - bool - operator< (const index_pair& v) const - { - return first < v.first || (first == v.first && second < v.second); - } - }; - #pragma db object pointer(std::shared_ptr) session class repository { @@ -389,19 +374,19 @@ namespace brep // license // - using _license_key = index_pair; + using _license_key = odb::nested_key; using _licenses_type = std::map<_license_key, std::string>; #pragma db value(_license_key) - #pragma db member(_license_key::first) column("alternative") - #pragma db member(_license_key::second) column("index") + #pragma db member(_license_key::outer) column("alternative_index") + #pragma db member(_license_key::inner) column("index") #pragma db member(license_alternatives) id_column("") value_column("") - #pragma db member(licenses) \ - virtual(_licenses_type) \ - after(license_alternatives) \ - get(_get (this.license_alternatives)) \ - set(_set (this.license_alternatives, (?))) \ + #pragma db member(licenses) \ + virtual(_licenses_type) \ + after(license_alternatives) \ + get(odb::nested_get (this.license_alternatives)) \ + set(odb::nested_set (this.license_alternatives, std::move (?))) \ id_column("") key_column("") value_column("license") // tags @@ -410,38 +395,38 @@ namespace brep // dependencies // - using _dependency_key = index_pair; + using _dependency_key = odb::nested_key; using _dependency_alternatives_type = std::map<_dependency_key, dependency>; #pragma db value(_dependency_key) - #pragma db member(_dependency_key::first) column("dependency") - #pragma db member(_dependency_key::second) column("index") + #pragma db member(_dependency_key::outer) column("dependency_index") + #pragma db member(_dependency_key::inner) column("index") #pragma db member(dependencies) id_column("") value_column("") - #pragma db member(dependency_alternatives) \ - virtual(_dependency_alternatives_type) \ - after(dependencies) \ - get(_get (this.dependencies)) \ - set(_set (this.dependencies, (?))) \ + #pragma db member(dependency_alternatives) \ + virtual(_dependency_alternatives_type) \ + after(dependencies) \ + get(odb::nested_get (this.dependencies)) \ + set(odb::nested_set (this.dependencies, std::move (?))) \ id_column("") key_column("") value_column("dep_") // requirements // - using _requirement_key = index_pair; + using _requirement_key = odb::nested_key; using _requirement_alternatives_type = std::map<_requirement_key, std::string>; #pragma db value(_requirement_key) - #pragma db member(_requirement_key::first) column("requirement") - #pragma db member(_requirement_key::second) column("index") + #pragma db member(_requirement_key::outer) column("requirement_index") + #pragma db member(_requirement_key::inner) column("index") #pragma db member(requirements) id_column("") value_column("") - #pragma db member(requirement_alternatives) \ - virtual(_requirement_alternatives_type) \ - after(requirements) \ - get(_get (this.requirements)) \ - set(_set (this.requirements, (?))) \ + #pragma db member(requirement_alternatives) \ + virtual(_requirement_alternatives_type) \ + after(requirements) \ + get(odb::nested_get (this.requirements)) \ + set(odb::nested_set (this.requirements, move (?))) \ id_column("") key_column("") value_column("id") #pragma db member(external_repositories) \ @@ -590,67 +575,4 @@ namespace odb using ::brep::order_by_version_desc; } -// Nested container emulation support for ODB. -// -// Note that the outer index in the inner container should strictly -// speaking be a foreign key pointing to the index of the outer -// container. The only way to achieve this currently is to manually -// add the constraint via ALTER TABLE ADD CONSTRAINT. Note, however, -// that as long as we only modify these tables via the ODB container -// interface, not having the foreign key (and not having ON DELETE -// CASCADE) should be harmless (since we have a foreign key pointing -// to the object id). -// -#include -#include -#include // size_t -#include // declval() -#include -#include // remove_reference - -namespace odb -{ - template - struct _inner: std::remove_reference ()[0])> {}; - - template - std::map, typename _inner::type> - _get (const std::vector& v) - { - using namespace std; - - using I = typename _inner::type; - using key = brep::index_pair; - - map r; - for (size_t n (0); n != v.size (); ++n) - { - const O& o (v[n]); - for (size_t m (0); m != o.size (); ++m) - r.emplace (key (n, m), o[m]); - } - return r; - } - - //@@ Second argument should be && once ODB uses move(). - // - template - void - _set (std::vector& v, std::map& r) - { - using namespace std; - - for (auto& p: r) - { - size_t n (p.first.first); - size_t m (p.first.second); - I& i (p.second); - - assert (n < v.size ()); - assert (m == v[n].size ()); - v[n].push_back (std::move (i)); - } - } -} - #endif // BREP_PACKAGE -- cgit v1.1