diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2016-04-24 17:26:25 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2016-04-25 21:27:50 +0100 |
commit | 4016743d54a958f85774afc7c9b266981e0d1d1e (patch) | |
tree | 5d3a5231789a10b59771bd910d13c6a367d6f8e9 | |
parent | Use a command *, not a commandptr (diff) | |
download | gentoobrowse-api-4016743d54a958f85774afc7c9b266981e0d1d1e.tar.bz2 gentoobrowse-api-4016743d54a958f85774afc7c9b266981e0d1d1e.tar.xz gentoobrowse-api-4016743d54a958f85774afc7c9b266981e0d1d1e.zip |
Update IUSE and KEYWORDS
4 files changed, 69 insertions, 18 deletions
diff --git a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp index 648decf..2b2541b 100644 --- a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp +++ b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp @@ -1,6 +1,8 @@ #include "ebuildMetaProcessor.h" #include <modifycommand.h> #include <sqlWriter.h> +#include <selectcommandUtil.impl.h> +#include <sqlWriter.h> #include <boost/filesystem/operations.hpp> #include <glibmm/regex.h> #include <tablepatch.h> @@ -58,25 +60,27 @@ namespace Gentoo { class SplitEbuildProps : public DB::SqlWriter { public: - SplitEbuildProps(int e, const std::string & p) : + SplitEbuildProps(int e, const std::string & c, const boost::optional<Glib::ustring> & p) : ebuildId(e), + colName(c), props(p) { } void writeSql(AdHoc::Buffer & sql) override { - sql.append("(SELECT ?::int ebuildId, trim(regexp_split_to_table(?, '\\s+'), '+') use)"); + sql.appendbf("(SELECT DISTINCT ?::int ebuildId, trim(regexp_split_to_table(?, '\\s+'), '+') %s)", colName); } void bindParams(DB::Command * c, unsigned int & offset) override { c->bindParamI(offset++, ebuildId); - c->bindParamS(offset++, props); + Utils::Database::bindOptionalsS(c, offset++, { props }); } const int ebuildId; - const std::string props; + const std::string colName; + const boost::optional<Glib::ustring> props; }; const int EbuildMetaProcessor::FILETYPEID = 1; @@ -106,7 +110,7 @@ namespace Gentoo { pi->bindParamS(3, categoryName); pi->execute(); // Create an ebuild - auto m = dbc->modify(sql::maintenance::ebuildInsert::sql); + auto m = dbc->select(sql::maintenance::ebuildInsert::sql); m->bindParamS(0, ebuildVersion); m->bindParamS(1, ebuildVersion); Utils::Database::bindOptionalsS(m.get(), 2, { ecp.get("SLOT") }); @@ -115,15 +119,9 @@ namespace Gentoo { m->bindParamS(5, repoName); m->bindParamS(6, categoryName); m->bindParamS(7, packageName); - m->forEachRow<int64_t>([dbc,&ecp] (auto ebuildId) { - // USE flags - DB::TablePatch t; - SplitEbuildProps sep(ebuildId, ecp.get("USE").value_or(Glib::ustring())); - t.dest = "gentoobrowse.ebuild_uses"; - t.srcExpr = &sep; - t.pk = { "ebuildid", "use" }; - t.cols = { "ebuildid", "use" }; - dbc->patchTable(&t); + m->forEachRow<int64_t>([this,dbc,&ecp,&fn] (auto ebuildId) { + fprintf(stderr, "Created ebuild %ld for %s\n", ebuildId, fn.c_str()); + this->perEbuildUpdates(dbc, ecp, ebuildId); }); } } @@ -134,19 +132,62 @@ namespace Gentoo { Glib::MatchInfo matches; const Glib::ustring pv = (fn / 4).string(); if (packageVersion->match(pv, matches)) { - auto m = dbc->modify(sql::maintenance::ebuildUpdate::sql); + auto m = dbc->select(sql::maintenance::ebuildUpdate::sql); EbuildCacheParser ecp(path); - Utils::Database::bindOptionalsS(m, 0, { ecp.get("SLOT") }); - Utils::Database::bindOptionalsS(m, 1, { ecp.get("LICENSE") }); + Utils::Database::bindOptionalsS(m.get(), 0, { ecp.get("SLOT") }); + Utils::Database::bindOptionalsS(m.get(), 1, { ecp.get("LICENSE") }); m->bindParamT(2, boost::posix_time::from_time_t(ecp.getStat().st_mtim.tv_sec)); m->bindParamS(3, (fn / 0).string()); // repo m->bindParamS(4, (fn / 3).string()); // category m->bindParamS(5, matches.fetch(1)); // package m->bindParamS(6, matches.fetch(2)); // version - m->execute(false); + m->forEachRow<int64_t>([this,dbc,&ecp,&fn] (auto ebuildId) { + fprintf(stderr, "Updated ebuild %ld for %s\n", ebuildId, fn.c_str()); + this->perEbuildUpdates(dbc, ecp, ebuildId); + }); } } + class EbuildWhereFilter : public DB::SqlWriter { + public: + EbuildWhereFilter(int64_t e) : ebuildId(e) { } + + void writeSql(AdHoc::Buffer & sql) override + { + sql.append("b.ebuildId = ?"); + } + + void bindParams(DB::Command * c, unsigned int & offset) override + { + c->bindParamI(offset++, ebuildId); + } + + const int64_t ebuildId; + }; + + void + EbuildMetaProcessor::perEbuildUpdates(DB::Connection * dbc, const EbuildCacheParser & ecp, int64_t ebuildId) const + { + EbuildWhereFilter ewf(ebuildId); + // USE flags + DB::TablePatch t; + SplitEbuildProps sep_use(ebuildId, "use", ecp.get("IUSE")); + t.dest = "gentoobrowse.ebuild_uses"; + t.srcExpr = &sep_use; + t.pk = { "ebuildid", "use" }; + t.cols = { "ebuildid", "use" }; + t.where = &ewf; + dbc->patchTable(&t); + // USE flags + SplitEbuildProps sep_keywords(ebuildId, "arch", ecp.get("KEYWORDS")); + t.dest = "gentoobrowse.ebuild_archs"; + t.srcExpr = &sep_keywords; + t.pk = { "ebuildid", "arch" }; + t.cols = { "ebuildid", "arch" }; + t.where = &ewf; + dbc->patchTable(&t); + } + void EbuildMetaProcessor::deleted(DB::Connection * dbc, const boost::filesystem::path & fn) const { diff --git a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h index d06ccf9..90c0d94 100644 --- a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h +++ b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h @@ -8,6 +8,8 @@ namespace Gentoo { namespace Service { + class EbuildCacheParser; + class EbuildMetaProcessor : public Maintenance::FileProcessor { public: static const int FILETYPEID; @@ -15,6 +17,9 @@ namespace Gentoo { void created(DB::Connection * dbc, const boost::filesystem::path & fn, const boost::filesystem::path & path) const; void modified(DB::Connection * dbc, const boost::filesystem::path & fn, const boost::filesystem::path & path) const; void deleted(DB::Connection * dbc, const boost::filesystem::path & fn) const; + + private: + void perEbuildUpdates(DB::Connection * dbc, const EbuildCacheParser & ecp, int64_t ebuildId) const; }; } } diff --git a/gentoobrowse-api/service/sql/maintenance/ebuildInsert.sql b/gentoobrowse-api/service/sql/maintenance/ebuildInsert.sql index 949b92a..110b7c8 100644 --- a/gentoobrowse-api/service/sql/maintenance/ebuildInsert.sql +++ b/gentoobrowse-api/service/sql/maintenance/ebuildInsert.sql @@ -1,3 +1,4 @@ +-- libdbpp:no-cursor INSERT INTO gentoobrowse.ebuilds(packageid, version, versioninst, slot, license, moddate, repoid) SELECT p.packageid, ?, gentoobrowse.ebuildversion_constructor(?), ?, ?, ?, r.repoid FROM gentoobrowse.packages p, gentoobrowse.categories c, gentoobrowse.repos r @@ -5,3 +6,4 @@ WHERE c.categoryid = p.categoryid AND r.name = ? AND c.name = ? AND p.name = ? +RETURNING ebuildid diff --git a/gentoobrowse-api/service/sql/maintenance/ebuildUpdate.sql b/gentoobrowse-api/service/sql/maintenance/ebuildUpdate.sql index dc8ae85..fc83417 100644 --- a/gentoobrowse-api/service/sql/maintenance/ebuildUpdate.sql +++ b/gentoobrowse-api/service/sql/maintenance/ebuildUpdate.sql @@ -1,10 +1,13 @@ +-- libdbpp:no-cursor UPDATE gentoobrowse.ebuilds e SET slot = ?, license = ?, moddate = ? FROM gentoobrowse.packages p, gentoobrowse.categories c, gentoobrowse.repos r WHERE c.categoryid = p.categoryid +AND e.packageid = p.packageid AND r.name = ? AND c.name = ? AND p.name = ? AND e.version = ? +RETURNING ebuildid |