diff options
5 files changed, 76 insertions, 35 deletions
| diff --git a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp index 230a00f..2ba14e7 100644 --- a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp @@ -22,6 +22,7 @@  #include <sql/maintenance/ebuildUpdate.sql.h>  #include <sql/maintenance/ebuildDelete.sql.h>  #include <sql/maintenance/ebuildDeps.sql.h> +#include <sql/maintenance/ebuildRDeps.sql.h>  namespace U = Gentoo::Utils;  using namespace Gentoo::Utils::File; @@ -97,6 +98,49 @@ namespace Gentoo {  		}  		void +		EbuildMetaProcessor::prepare(DB::Connection * dbc) +		{ +			depInsert = Utils::Database::namedTemp(dbc, "tmpEbuildDeps", { +						{ "ebuildId", "int" }, // 1 +						{ "runtime", "boolean" }, // 5 +						{ "category", "text" }, // 0 +						{ "package", "text" }, // 4 +						{ "version", "text" }, // 7 +						{ "slot", "text" }, // 6 +						{ "flags", "text" }, // 2 +						{ "op", "text" } // 3 +					}).second; +		} + +		void +		EbuildMetaProcessor::apply(DB::Connection * dbc) +		{ +			if (!ebuildIds.empty()) { +				DB::TablePatch t; +				t.pk = { "ebuildid", "packageid", "versionspec", "flags", "slot", "op" }; +				t.cols = { "ebuildid", "packageid", "versionspec", "flags", "slot", "op" }; +				U::EntityWhereFilter ewf("ebuildId", ebuildIds); +				t.where = &ewf; + +				DB::StaticSqlWriter sb(sql::maintenance::ebuildDeps.getSql()); +				t.srcExpr = &sb; +				t.dest = "gentoobrowse.ebuild_deps"; +				dbc->patchTable(&t); + +				DB::StaticSqlWriter sr(sql::maintenance::ebuildRDeps.getSql()); +				t.srcExpr = &sr; +				t.dest = "gentoobrowse.ebuild_rdeps"; +				dbc->patchTable(&t); +			} +		} + +		void +		EbuildMetaProcessor::tidy(DB::Connection * dbc) +		{ +			Utils::Database::drop(dbc, "tmpEbuildDeps"); +		} + +		void  		EbuildMetaProcessor::perEbuildUpdates(DB::Connection * dbc, const U::EbuildCacheParser & ecp, int64_t ebuildId, bool newest, int64_t packageId)  		{  			U::EntityWhereFilter ewf("ebuildId", ebuildId); @@ -118,31 +162,12 @@ namespace Gentoo {  			t.where = &ewf;  			dbc->patchTable(&t);  			// Dependencies -			t.pk = { "ebuildid", "packageid", "versionspec", "flags", "slot", "op" }; -			t.cols = { "ebuildid", "packageid", "versionspec", "flags", "slot", "op" }; -			t.where = &ewf; -			DB::StaticSqlWriter s(sql::maintenance::ebuildDeps.getSql()); -			t.srcExpr = &s; -			auto ins = Utils::Database::namedTemp(dbc, "tmpEbuildDeps", { -						{ "ebuildId", "int" }, // 1 -						{ "category", "text" }, // 0 -						{ "package", "text" }, // 4 -						{ "version", "text" }, // 6 -						{ "slot", "text" }, // 5 -						{ "flags", "text" }, // 2 -						{ "op", "text" } // 3 -					}); -			ins.second->bindParamI(1, ebuildId); -			auto db = Portage::Utils::Depend::parse(ecp.get("DEPEND").value_or("")); -			t.dest = "gentoobrowse.ebuild_deps"; -			insertDeps(ins.second.get(), db); -			dbc->patchTable(&t); -			dbc->execute("TRUNCATE TABLE tmpEbuildDeps"); -			auto dr = Portage::Utils::Depend::parse(ecp.get("RDEPEND").value_or("")); -			t.dest = "gentoobrowse.ebuild_rdeps"; -			insertDeps(ins.second.get(), dr); -			dbc->patchTable(&t); -			Utils::Database::drop(dbc, "tmpEbuildDeps"); +			ebuildIds.insert(ebuildId); +			depInsert->bindParamI(1, ebuildId); +			depInsert->bindParamB(5, false); +			insertDeps(Portage::Utils::Depend::parse(ecp.get("DEPEND").value_or(""))); +			depInsert->bindParamB(5, true); +			insertDeps(Portage::Utils::Depend::parse(ecp.get("RDEPEND").value_or("")));  			if (newest) {  				// HOMEPAGE  				U::EntityWhereFilter pwf("packageId", packageId); @@ -168,16 +193,16 @@ namespace Gentoo {  		}  		void -		EbuildMetaProcessor::insertDeps(DB::ModifyCommand * ins, const std::vector<Gentoo::DependencyPtr> & deps) +		EbuildMetaProcessor::insertDeps(const std::vector<Gentoo::DependencyPtr> & deps)  		{  			for (const auto & d : deps) { -				ins->bindParamS(0, d->category); -				ins->bindParamS(2, boost::algorithm::join(d->use, ",")); -				ins->bindParamS(3, d->op |= std::string()); -				ins->bindParamS(4, d->package); -				ins->bindParamS(5, d->slot |= std::string()); -				ins->bindParamS(6, d->version |= std::string()); -				ins->execute(); +				depInsert->bindParamS(0, d->category); +				depInsert->bindParamS(2, boost::algorithm::join(d->use, ",")); +				depInsert->bindParamS(3, d->op |= std::string()); +				depInsert->bindParamS(4, d->package); +				depInsert->bindParamS(6, d->slot |= std::string()); +				depInsert->bindParamS(7, d->version |= std::string()); +				depInsert->execute();  			}  		} diff --git a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h index 51daad0..a337e8b 100644 --- a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h +++ b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h @@ -19,8 +19,15 @@ namespace Gentoo {  				void deleted(DB::Connection * dbc, const boost::filesystem::path & fn) override;  			private: +				void prepare(DB::Connection * dbc) override; +				void apply(DB::Connection * dbc) override; +				void tidy(DB::Connection * dbc) override; +  				void perEbuildUpdates(DB::Connection * dbc, const Utils::EbuildCacheParser & ecp, int64_t ebuildId, bool newest, int64_t packageId); -				void insertDeps(DB::ModifyCommand * dbc, const std::vector<Gentoo::DependencyPtr> &); +				void insertDeps(const std::vector<Gentoo::DependencyPtr> &); + +				DB::ModifyCommandPtr depInsert; +				std::set<int64_t> ebuildIds;  		};  	}  } diff --git a/gentoobrowse-api/service/sql/maintenance/ebuildDeps.sql b/gentoobrowse-api/service/sql/maintenance/ebuildDeps.sql index 801c877..ae33b65 100644 --- a/gentoobrowse-api/service/sql/maintenance/ebuildDeps.sql +++ b/gentoobrowse-api/service/sql/maintenance/ebuildDeps.sql @@ -4,4 +4,5 @@  	WHERE c.categoryid = p.categoryid  	AND c.name = e.category  	AND p.name = e.package +	AND e.runtime = false  ) diff --git a/gentoobrowse-api/service/sql/maintenance/ebuildRDeps.sql b/gentoobrowse-api/service/sql/maintenance/ebuildRDeps.sql new file mode 100644 index 0000000..b0e54b9 --- /dev/null +++ b/gentoobrowse-api/service/sql/maintenance/ebuildRDeps.sql @@ -0,0 +1,8 @@ +( +	SELECT DISTINCT ebuildid, packageid, e.version versionspec, flags, slot, op +	FROM gentoobrowse.categories c, gentoobrowse.packages p, tmpEbuildDeps e +	WHERE c.categoryid = p.categoryid +	AND c.name = e.category +	AND p.name = e.package +	AND e.runtime = true +) diff --git a/gentoobrowse-api/unittests/testMaintenance.cpp b/gentoobrowse-api/unittests/testMaintenance.cpp index cef7554..8be95a1 100644 --- a/gentoobrowse-api/unittests/testMaintenance.cpp +++ b/gentoobrowse-api/unittests/testMaintenance.cpp @@ -79,7 +79,7 @@ BOOST_AUTO_TEST_CASE( refreshPackageTree )  	insRepo->execute();  	doRefreshPackageTree(sd, db, "4156eb45cf3b0ce1d7125b84efd8688c2d6e831d", "gentoo", -			m, 2084, 5, 1, 482, 981, 3626, 4593, 501, 393, 238, 50, 1573, 1323, 1059); +			m, 2084, 5, 1, 482, 981, 3626, 4593, 501, 393, 238, 50, 1573, 2008, 1543);  	db->execute("COPY gentoobrowse.categories TO '/tmp/categories1.tsv'");  	db->execute("COPY gentoobrowse.packages TO '/tmp/packages1.tsv'"); | 
