sqlite3::exec( // | sqlite3::exec( // | ||||
_stmt_cache, | _stmt_cache, | ||||
R"( | R"( | ||||
INSERT INTO dds_cat_pkgs ( | |||||
INSERT OR REPLACE INTO dds_cat_pkgs ( | |||||
name, | name, | ||||
version, | version, | ||||
git_url, | git_url, | ||||
}; | }; | ||||
} | } | ||||
auto pair_to_pkg_id = [](auto&& pair) { | |||||
const auto& [name, ver] = pair; | |||||
return package_id{name, semver::version::parse(ver)}; | |||||
}; | |||||
std::vector<package_id> catalog::all() const noexcept { | |||||
return sqlite3::exec_iter<std::string, std::string>( // | |||||
_stmt_cache, | |||||
"SELECT name, version FROM dds_cat_pkgs"_sql) | |||||
| ranges::views::transform(pair_to_pkg_id) // | |||||
| ranges::to_vector; | |||||
} | |||||
std::vector<package_id> catalog::by_name(std::string_view sv) const noexcept { | std::vector<package_id> catalog::by_name(std::string_view sv) const noexcept { | ||||
return sqlite3::exec_iter<std::string, std::string>( // | return sqlite3::exec_iter<std::string, std::string>( // | ||||
_stmt_cache, | _stmt_cache, | ||||
FROM dds_cat_pkgs | FROM dds_cat_pkgs | ||||
WHERE name = ? | WHERE name = ? | ||||
)"_sql, | )"_sql, | ||||
std::tie(sv)) // | |||||
| ranges::views::transform([](auto& pair) { | |||||
auto& [name, ver] = pair; | |||||
return package_id{name, semver::version::parse(ver)}; | |||||
}) | |||||
std::tie(sv)) // | |||||
| ranges::views::transform(pair_to_pkg_id) // | |||||
| ranges::to_vector; | | ranges::to_vector; | ||||
} | } | ||||
void store(const package_info& info); | void store(const package_info& info); | ||||
std::optional<package_info> get(const package_id& id) const noexcept; | std::optional<package_info> get(const package_id& id) const noexcept; | ||||
std::vector<package_id> all() const noexcept; | |||||
std::vector<package_id> by_name(std::string_view sv) const noexcept; | std::vector<package_id> by_name(std::string_view sv) const noexcept; | ||||
std::vector<dependency> dependencies_of(const package_id& pkg) const noexcept; | std::vector<dependency> dependencies_of(const package_id& pkg) const noexcept; | ||||
{}, | {}, | ||||
dds::git_remote_listing{"http://example.com", "master", std::nullopt}, | dds::git_remote_listing{"http://example.com", "master", std::nullopt}, | ||||
}); | }); | ||||
CHECK_THROWS(db.store(dds::package_info{ | |||||
dds::package_id("foo", semver::version::parse("1.2.3")), | |||||
{}, | |||||
dds::git_remote_listing{"http://example.com", "master", std::nullopt}, | |||||
})); | |||||
auto pkgs = db.by_name("foo"); | auto pkgs = db.by_name("foo"); | ||||
REQUIRE(pkgs.size() == 1); | REQUIRE(pkgs.size() == 1); | ||||
CHECK(pkgs[0].name == "foo"); | |||||
CHECK(pkgs[0].version == semver::version::parse("1.2.3")); | |||||
auto info = db.get(pkgs[0]); | |||||
REQUIRE(info); | |||||
CHECK(info->ident == pkgs[0]); | |||||
CHECK(info->deps.empty()); | |||||
CHECK(std::holds_alternative<dds::git_remote_listing>(info->remote)); | |||||
CHECK(std::get<dds::git_remote_listing>(info->remote).ref == "master"); | |||||
// Update the entry with a new git remote ref | |||||
CHECK_NOTHROW(db.store(dds::package_info{ | |||||
dds::package_id("foo", semver::version::parse("1.2.3")), | |||||
{}, | |||||
dds::git_remote_listing{"http://example.com", "develop", std::nullopt}, | |||||
})); | |||||
// The previous pkg_id is still a valid lookup key | |||||
info = db.get(pkgs[0]); | |||||
REQUIRE(info); | |||||
CHECK(std::get<dds::git_remote_listing>(info->remote).ref == "develop"); | |||||
} | } | ||||
TEST_CASE_METHOD(catalog_test_case, "Package requirements") { | TEST_CASE_METHOD(catalog_test_case, "Package requirements") { |