| @@ -113,7 +113,7 @@ void catalog::_store_pkg(const package_info& pkg, const git_remote_listing& git) | |||
| sqlite3::exec( // | |||
| _stmt_cache, | |||
| R"( | |||
| INSERT INTO dds_cat_pkgs ( | |||
| INSERT OR REPLACE INTO dds_cat_pkgs ( | |||
| name, | |||
| version, | |||
| git_url, | |||
| @@ -216,6 +216,19 @@ std::optional<package_info> catalog::get(const package_id& pk_id) const noexcept | |||
| }; | |||
| } | |||
| 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 { | |||
| return sqlite3::exec_iter<std::string, std::string>( // | |||
| _stmt_cache, | |||
| @@ -224,11 +237,8 @@ std::vector<package_id> catalog::by_name(std::string_view sv) const noexcept { | |||
| FROM dds_cat_pkgs | |||
| WHERE name = ? | |||
| )"_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; | |||
| } | |||
| @@ -41,6 +41,7 @@ public: | |||
| void store(const package_info& info); | |||
| 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<dependency> dependencies_of(const package_id& pkg) const noexcept; | |||
| @@ -20,14 +20,28 @@ TEST_CASE_METHOD(catalog_test_case, "Store a simple package") { | |||
| {}, | |||
| 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"); | |||
| 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") { | |||