diff options
author | Boris Kolpackov <boris@codesynthesis.com> | 2015-10-02 09:50:20 +0200 |
---|---|---|
committer | Boris Kolpackov <boris@codesynthesis.com> | 2015-10-07 18:04:38 +0200 |
commit | ba93b336890205933a57fae958c0ec6be5932ac7 (patch) | |
tree | e645eb45097a6ad7ae976a4111143d9c57ea4b8d /brep/package | |
parent | ce8a7b9e50945758efdafc63869e1b44864f9d7d (diff) |
Simplify version comparison
Diffstat (limited to 'brep/package')
-rw-r--r-- | brep/package | 68 |
1 files changed, 45 insertions, 23 deletions
diff --git a/brep/package b/brep/package index 6ca0c12..6cd87e9 100644 --- a/brep/package +++ b/brep/package @@ -68,6 +68,30 @@ namespace brep // to TEXT as a comma-separated list. // + // Version comparison operators. + // + template <typename T1, typename T2> + inline auto + operator< (const T1& x, const T2& y) -> decltype (x.epoch < y.epoch) + { + return x.epoch < y.epoch || + (x.epoch == y.epoch && + x.canonical_upstream < y.canonical_upstream) || + (x.epoch == y.epoch && + x.canonical_upstream == y.canonical_upstream && + x.revision < y.revision); + } + + template <typename T> + inline auto + order_by_version_desc (const T& x) -> decltype (x.epoch == 0) + { + return "ORDER BY" + + x.epoch + "DESC," + + x.canonical_upstream + "DESC," + + x.revision + "DESC"; + } + // Forward declarations. // class repository; @@ -109,9 +133,16 @@ namespace brep struct package_version_id { std::string package; - std::uint16_t epoch; - std::string canonical_upstream; - std::uint16_t revision; + + #pragma db value + struct version_type + { + std::uint16_t epoch; + std::string canonical_upstream; + std::uint16_t revision; + }; + + version_type version; // Database mapping. // @@ -126,15 +157,7 @@ namespace brep if (r != 0) return r < 0; - if (x.epoch != y.epoch) - return x.epoch < y.epoch; - - r = x.canonical_upstream.compare (y.canonical_upstream); - - if (r != 0) - return r < 0; - - return x.revision < y.revision; + return x.version < y.version; } using priority = bpkg::priority; @@ -458,10 +481,9 @@ namespace brep package_version () = default; }; - #pragma db view object(package_version) \ - query((?) + "ORDER BY" + package_version::id.data.epoch + "DESC," + \ - package_version::id.data.canonical_upstream + "DESC," + \ - package_version::id.data.revision + "DESC LIMIT 1") + #pragma db view object(package_version) \ + query((?) + order_by_version_desc (package_version::id.data.version) + \ + "LIMIT 1") struct max_package_version { using version_type = brep::version; @@ -486,13 +508,7 @@ namespace brep #pragma db view object(package_version = version) \ object(package_version = v: \ version::id.data.package == v::id.data.package && \ - (version::id.data.epoch < v::id.data.epoch || \ - (version::id.data.epoch == v::id.data.epoch && \ - (version::id.data.canonical_upstream < \ - v::id.data.canonical_upstream || \ - (version::id.data.canonical_upstream == \ - v::id.data.canonical_upstream && \ - version::id.data.revision < v::id.data.revision))))) \ + version::id.data.version < v::id.data.version) \ object(package inner: version::id.data.package == package::name && \ version::internal_repository.is_not_null () && \ v::id.data.package.is_null ()) @@ -521,6 +537,12 @@ namespace brep }; } +namespace odb +{ + using ::brep::operator<; + using ::brep::order_by_version_desc; +} + // Nested container emulation support for ODB. // // Note that the outer index in the inner container should strictly |