| 
				
			 | 
			
			 | 
			@@ -78,7 +78,7 @@ void migrate_repodb_2(nsql::database& db) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			void migrate_repodb_3(nsql::database& db) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    db.exec(R"( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        CREATE TABLE dds_cat_remotes ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        CREATE TABLE dds_pkg_remotes ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            remote_id INTEGER PRIMARY KEY AUTOINCREMENT, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            name TEXT NOT NULL UNIQUE, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            remote_url TEXT NOT NULL, | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -86,23 +86,23 @@ void migrate_repodb_3(nsql::database& db) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            db_mtime TEXT | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        CREATE TABLE dds_cat_pkgs_new ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        CREATE TABLE dds_pkgs ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            pkg_id INTEGER PRIMARY KEY AUTOINCREMENT, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            name TEXT NOT NULL, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            version TEXT NOT NULL, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            description TEXT NOT NULL, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            remote_url TEXT NOT NULL, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            remote_id INTEGER | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                REFERENCES dds_cat_remotes | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                REFERENCES dds_pkg_remotes | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                ON DELETE CASCADE, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            UNIQUE (name, version, remote_id) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        INSERT INTO dds_cat_pkgs_new(pkg_id, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                     name, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                     version, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                     description, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                                     remote_url) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        INSERT INTO dds_pkgs(pkg_id, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                             name, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                             version, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                             description, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                             remote_url) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            SELECT pkg_id, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                   name, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                   version, | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -115,11 +115,11 @@ void migrate_repodb_3(nsql::database& db) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                   ) || '#' || git_ref | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            FROM dds_cat_pkgs; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        CREATE TABLE dds_cat_pkg_deps_new ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        CREATE TABLE dds_pkg_deps ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            dep_id INTEGER PRIMARY KEY AUTOINCREMENT, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            pkg_id INTEGER | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                NOT NULL | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                REFERENCES dds_cat_pkgs_new(pkg_id) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                REFERENCES dds_pkgs(pkg_id) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                ON DELETE CASCADE, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            dep_name TEXT NOT NULL, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            low TEXT NOT NULL, | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -127,12 +127,10 @@ void migrate_repodb_3(nsql::database& db) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            UNIQUE(pkg_id, dep_name) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        INSERT INTO dds_cat_pkg_deps_new SELECT * FROM dds_cat_pkg_deps; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        INSERT INTO dds_pkg_deps SELECT * FROM dds_cat_pkg_deps; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        DROP TABLE dds_cat_pkg_deps; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        DROP TABLE dds_cat_pkgs; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ALTER TABLE dds_cat_pkgs_new RENAME TO dds_cat_pkgs; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ALTER TABLE dds_cat_pkg_deps_new RENAME TO dds_cat_pkg_deps; | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    )"); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			} | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -150,7 +148,7 @@ void store_with_remote(neo::sqlite3::statement_cache& stmts, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                       const http_remote_listing&     http) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    nsql::exec(  // | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        stmts(R"( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            INSERT OR REPLACE INTO dds_cat_pkgs ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            INSERT OR REPLACE INTO dds_pkgs ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                name, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                version, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                remote_url, | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -177,7 +175,7 @@ void store_with_remote(neo::sqlite3::statement_cache& stmts, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    nsql::exec(  // | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        stmts(R"( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            INSERT OR REPLACE INTO dds_cat_pkgs ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            INSERT OR REPLACE INTO dds_pkgs ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                name, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                version, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                remote_url, | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -202,7 +200,7 @@ void do_store_pkg(neo::sqlite3::database&        db, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    std::visit([&](auto&& remote) { store_with_remote(st_cache, pkg, remote); }, pkg.remote); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    auto  db_pkg_id  = db.last_insert_rowid(); | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    auto& new_dep_st = st_cache(R"( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        INSERT INTO dds_cat_pkg_deps ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        INSERT INTO dds_pkg_deps ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            pkg_id, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            dep_name, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            low, | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -319,7 +317,7 @@ std::optional<pkg_info> pkg_db::get(const pkg_id& pk_id) const noexcept { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            version, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            remote_url, | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			            description | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        FROM dds_cat_pkgs | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        FROM dds_pkgs | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        WHERE name = ?1 AND version = ?2 | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        ORDER BY pkg_id DESC | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    )"_sql); | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -379,7 +377,7 @@ auto pair_to_pkg_id = [](auto&& pair) { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			
  | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			std::vector<pkg_id> pkg_db::all() const noexcept { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			    return nsql::exec_tuples<std::string, std::string>( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			               _stmt_cache("SELECT name, version FROM dds_cat_pkgs"_sql)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			               _stmt_cache("SELECT name, version FROM dds_pkgs"_sql)) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        | neo::lref                                 // | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        | ranges::views::transform(pair_to_pkg_id)  // | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			        | ranges::to_vector; | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -390,7 +388,7 @@ std::vector<pkg_id> pkg_db::by_name(std::string_view sv) const noexcept { | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			               _stmt_cache( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                   R"( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                SELECT name, version | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  FROM dds_cat_pkgs | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  FROM dds_pkgs | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 WHERE name = ? | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 ORDER BY pkg_id DESC | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                )"_sql), | 
		
		
	
	
		
			
			| 
				
			 | 
			
			 | 
			@@ -409,11 +407,11 @@ std::vector<dependency> pkg_db::dependencies_of(const pkg_id& pkg) const noexcep | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                   R"( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                WITH this_pkg_id AS ( | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                    SELECT pkg_id | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                      FROM dds_cat_pkgs | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                      FROM dds_pkgs | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                     WHERE name = ? AND version = ? | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                ) | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                SELECT dep_name, low, high | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  FROM dds_cat_pkg_deps | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                  FROM dds_pkg_deps | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                 WHERE pkg_id IN this_pkg_id | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			              ORDER BY dep_name | 
		
		
	
		
			
			 | 
			 | 
			
			 | 
			                )"_sql), |