| 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") { |