aboutsummaryrefslogtreecommitdiff
path: root/brep
diff options
context:
space:
mode:
authorBoris Kolpackov <boris@codesynthesis.com>2015-09-17 16:59:56 +0200
committerBoris Kolpackov <boris@codesynthesis.com>2015-09-24 11:23:36 +0200
commita64dad6a0a6f6893bbb6eed7065485c1965ff70b (patch)
tree913f0cfe6fff4391e43a801034bfa2ee7c625ccd /brep
parentb192a3fcc7875210b3e1f6bd2292022a78c9f0e1 (diff)
Package object model refactoring
Diffstat (limited to 'brep')
-rw-r--r--brep/package55
-rw-r--r--brep/package-version-details.cxx1
-rw-r--r--brep/package-version-search.cxx2
-rw-r--r--brep/package.cxx25
4 files changed, 40 insertions, 43 deletions
diff --git a/brep/package b/brep/package
index c81e652..c383b82 100644
--- a/brep/package
+++ b/brep/package
@@ -104,32 +104,33 @@ namespace brep
#pragma db value
struct package_version_id
{
- std::string repository;
std::string package;
std::uint16_t epoch;
std::string canonical_upstream;
+ std::uint16_t revision;
// Database mapping.
//
- #pragma db member(repository) points_to(repository) //on_delete(cascade)
#pragma db member(package) points_to(package) //on_delete(cascade)
};
inline bool
operator< (const package_version_id& x, const package_version_id& y)
{
- int r (x.repository.compare (y.repository));
+ int r (x.package.compare (y.package));
if (r != 0)
return r < 0;
- r = x.package.compare (y.package);
+ 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.epoch < y.epoch ||
- (x.epoch == y.epoch && x.canonical_upstream < y.canonical_upstream);
+ return x.revision < y.revision;
}
using priority = bpkg::priority;
@@ -229,13 +230,6 @@ namespace brep
class repository
{
public:
- using path_type = brep::path;
- using timestamp_type = brep::timestamp;
- using package_versions_type =
- std::vector<odb::lazy_weak_ptr<package_version>>;
- using prerequisite_repositories_type =
- std::vector<odb::lazy_weak_ptr<repository>>;
-
// Create internal repository.
//
repository (repository_location,
@@ -258,16 +252,14 @@ namespace brep
// Initialized with timestamp_nonexistent by default.
//
- timestamp_type packages_timestamp;
+ timestamp packages_timestamp;
// Initialized with timestamp_nonexistent by default.
// For external repositories stays timestamp_nonexistent.
//
- timestamp_type repositories_timestamp;
+ timestamp repositories_timestamp;
bool internal;
- package_versions_type package_versions;
- prerequisite_repositories_type prerequisite_repositories;
// Database mapping.
//
@@ -289,10 +281,6 @@ namespace brep
#pragma db member(id) virtual(_id_type) before id(canonical_name) \
get(_id) set(_id (std::move (?))) column("")
- #pragma db member(package_versions) inverse(id.data.repository)
- #pragma db member(prerequisite_repositories) id_column("repository") \
- value_column("prerequisite_repository") value_not_null
-
private:
friend class odb::access;
repository () = default;
@@ -333,7 +321,7 @@ namespace brep
//
#pragma db member(name) id
#pragma db member(tags) id_column("package") value_column("tag")
- #pragma db member(versions) inverse(id.data.package)
+ #pragma db member(versions) inverse(id.data.package) value_not_null
private:
friend class odb::access;
@@ -352,19 +340,18 @@ namespace brep
using dependencies_type = brep::dependencies;
using requirements_type = brep::requirements;
- package_version (odb::lazy_shared_ptr<repository_type>,
- odb::lazy_shared_ptr<package_type>,
+ package_version (odb::lazy_shared_ptr<package_type>,
version_type,
priority_type,
license_alternatives_type,
std::string changes,
dependencies_type,
requirements_type,
- optional<path> location);
+ optional<path> location,
+ odb::lazy_shared_ptr<repository_type>);
// Manifest data.
//
- odb::lazy_shared_ptr<repository_type> repository;
odb::lazy_shared_ptr<package_type> package;
version_type version;
priority_type priority;
@@ -372,8 +359,15 @@ namespace brep
std::string changes;
dependencies_type dependencies;
requirements_type requirements;
+ odb::lazy_shared_ptr<repository_type> internal_repository;
+
+ // Path to the package file. Set only for package versions present in
+ // internal repository.
+ //
optional<path> location;
+ std::vector<odb::lazy_shared_ptr<repository_type>> external_repositories;
+
// Database mapping.
//
@@ -385,7 +379,6 @@ namespace brep
#pragma db column("")
package_version_id data;
std::string upstream;
- std::uint16_t revision;
};
_id_type
@@ -396,7 +389,6 @@ namespace brep
#pragma db member(version) transient
#pragma db member(package) transient
- #pragma db member(repository) transient
#pragma db member(id) virtual(_id_type) before id(data) \
get(_id) set(_id (std::move (?), (!))) column("")
@@ -454,6 +446,11 @@ namespace brep
set(_set (this.requirements, (?))) \
id_column("") key_column("") value_column("id")
+ #pragma db member(external_repositories) \
+ id_column("") \
+ value_column("repository") \
+ value_not_null
+
private:
friend class odb::access;
package_version () = default;
@@ -462,7 +459,7 @@ namespace brep
#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.revision + "DESC LIMIT 1")
+ package_version::id.data.revision + "DESC LIMIT 1")
struct max_package_version
{
using version_type = brep::version;
diff --git a/brep/package-version-details.cxx b/brep/package-version-details.cxx
index 094c3a3..0faecd2 100644
--- a/brep/package-version-details.cxx
+++ b/brep/package-version-details.cxx
@@ -9,7 +9,6 @@
#include <cassert>
#include <stdexcept> // invalid_argument
-
#include <xml/serializer>
#include <odb/database.hxx>
diff --git a/brep/package-version-search.cxx b/brep/package-version-search.cxx
index d7fea2d..bd01a46 100644
--- a/brep/package-version-search.cxx
+++ b/brep/package-version-search.cxx
@@ -164,7 +164,7 @@ namespace brep
db_->query<package_version> ((query::id.data.package == name) +
"ORDER BY" + query::id.data.epoch + "DESC," +
query::id.data.canonical_upstream + "DESC," +
- query::id.revision + "DESC " +
+ query::id.data.revision + "DESC " +
"OFFSET" + to_string (pr.page () * rop) +
"LIMIT" + to_string (rop)));
diff --git a/brep/package.cxx b/brep/package.cxx
index 215754f..59efbfb 100644
--- a/brep/package.cxx
+++ b/brep/package.cxx
@@ -55,17 +55,16 @@ namespace brep
// package_version
//
package_version::
- package_version (lazy_shared_ptr<repository_type> rp,
- lazy_shared_ptr<package_type> pk,
+ package_version (lazy_shared_ptr<package_type> pk,
version_type vr,
priority_type pr,
license_alternatives_type la,
string ch,
dependencies_type dp,
requirements_type rq,
- optional<path> lc)
- : repository (move (rp)),
- package (move (pk)),
+ optional<path> lc,
+ lazy_shared_ptr<repository_type> rp)
+ : package (move (pk)),
version (move (vr)),
priority (move (pr)),
license_alternatives (move (la)),
@@ -74,6 +73,10 @@ namespace brep
requirements (move (rq)),
location (move (lc))
{
+ if (rp.load ()->internal)
+ internal_repository = move (rp);
+ else
+ external_repositories.emplace_back (move (rp));
}
package_version::_id_type package_version::
@@ -81,21 +84,19 @@ namespace brep
{
return _id_type {
{
- repository.object_id (),
package.object_id (),
version.epoch (),
- version.canonical_upstream ()
+ version.canonical_upstream (),
+ version.revision ()
},
- version.upstream (),
- version.revision ()};
+ version.upstream ()};
}
void package_version::
_id (_id_type&& v, database& db)
{
- repository = lazy_shared_ptr<repository_type> (db, v.data.repository);
package = lazy_shared_ptr<package_type> (db, v.data.package);
- version = version_type (v.data.epoch, move (v.upstream), v.revision);
+ version = version_type (v.data.epoch, move (v.upstream), v.data.revision);
assert (version.canonical_upstream () == v.data.canonical_upstream);
}
@@ -104,7 +105,7 @@ namespace brep
void max_package_version::
_id (package_version::_id_type&& v)
{
- version = version_type (v.data.epoch, move (v.upstream), v.revision);
+ version = version_type (v.data.epoch, move (v.upstream), v.data.revision);
assert (version.canonical_upstream () == v.data.canonical_upstream);
}