summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Goodliffe <dan@randomdan.homeip.net>2016-05-22 15:42:11 +0100
committerDan Goodliffe <dan@randomdan.homeip.net>2016-05-22 15:42:11 +0100
commita769f251d7be7b0ed2b48c437f70c8135a7b14c8 (patch)
tree7c1c5c3971d01c0c158ae16c26a04d55d0fe1e21
parentPrecompile regexen for dependencies (diff)
downloadgentoobrowse-api-a769f251d7be7b0ed2b48c437f70c8135a7b14c8.tar.bz2
gentoobrowse-api-a769f251d7be7b0ed2b48c437f70c8135a7b14c8.tar.xz
gentoobrowse-api-a769f251d7be7b0ed2b48c437f70c8135a7b14c8.zip
Add support for merging dependencies
-rw-r--r--gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp49
-rw-r--r--gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h2
-rw-r--r--gentoobrowse-api/service/sql/maintenance/ebuildDeps.sql7
-rw-r--r--gentoobrowse-api/service/utils/dbUtils.cpp11
-rw-r--r--gentoobrowse-api/service/utils/dbUtils.h3
5 files changed, 72 insertions, 0 deletions
diff --git a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp
index 7cbd902..ef849fb 100644
--- a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp
+++ b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.cpp
@@ -4,8 +4,10 @@
#include <selectcommandUtil.impl.h>
#include <sqlWriter.h>
#include <boost/filesystem/operations.hpp>
+#include <boost/algorithm/string/join.hpp>
#include <glibmm/regex.h>
#include <tablepatch.h>
+#include "depend.h"
#include "utils/fileUtils.h"
#include "utils/dbUtils.h"
#include "utils/ebuildCacheParser.h"
@@ -19,6 +21,7 @@
#include <sql/maintenance/ebuildInsert.sql.h>
#include <sql/maintenance/ebuildUpdate.sql.h>
#include <sql/maintenance/ebuildDelete.sql.h>
+#include <sql/maintenance/ebuildDeps.sql.h>
namespace U = Gentoo::Utils;
using namespace Gentoo::Utils::File;
@@ -114,6 +117,32 @@ namespace Gentoo {
t.cols = { "ebuildid", "arch" };
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");
if (newest) {
// HOMEPAGE
U::EntityWhereFilter pwf("packageId", packageId);
@@ -132,6 +161,26 @@ namespace Gentoo {
}
}
+ template<typename T>
+ const T & operator|=(const IceUtil::Optional<T> & a, const T & b)
+ {
+ return a ? *a : b;
+ }
+
+ void
+ EbuildMetaProcessor::insertDeps(DB::ModifyCommand * ins, const std::vector<Gentoo::DependencyPtr> & deps) const
+ {
+ 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();
+ }
+ }
+
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 3cd6ba9..fb9d48c 100644
--- a/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h
+++ b/gentoobrowse-api/service/maintenance/ebuildMetaProcessor.h
@@ -3,6 +3,7 @@
#include "../maintenanceimpl.h"
#include "utils/ebuildCacheParser.h"
+#include <portage-models.h>
#include <connection.h>
#include <modifycommand.h>
#include <boost/filesystem/path.hpp>
@@ -19,6 +20,7 @@ namespace Gentoo {
private:
void perEbuildUpdates(DB::Connection * dbc, const Utils::EbuildCacheParser & ecp, int64_t ebuildId, bool newest, int64_t packageId) const;
+ void insertDeps(DB::ModifyCommand * dbc, const std::vector<Gentoo::DependencyPtr> &) const;
};
}
}
diff --git a/gentoobrowse-api/service/sql/maintenance/ebuildDeps.sql b/gentoobrowse-api/service/sql/maintenance/ebuildDeps.sql
new file mode 100644
index 0000000..801c877
--- /dev/null
+++ b/gentoobrowse-api/service/sql/maintenance/ebuildDeps.sql
@@ -0,0 +1,7 @@
+(
+ 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
+)
diff --git a/gentoobrowse-api/service/utils/dbUtils.cpp b/gentoobrowse-api/service/utils/dbUtils.cpp
index c368c7a..1b38da6 100644
--- a/gentoobrowse-api/service/utils/dbUtils.cpp
+++ b/gentoobrowse-api/service/utils/dbUtils.cpp
@@ -19,6 +19,17 @@ namespace Gentoo {
return false;
}
+ void
+ bindOptionalS(DB::Command * db, unsigned int c, const IceUtil::Optional<std::string> & v)
+ {
+ if (v) {
+ db->bindParamS(c, *v);
+ }
+ else {
+ db->bindNull(c);
+ }
+ }
+
std::string
emptyClone(DB::Connection * db, const std::string & orig)
{
diff --git a/gentoobrowse-api/service/utils/dbUtils.h b/gentoobrowse-api/service/utils/dbUtils.h
index 95ae868..b533783 100644
--- a/gentoobrowse-api/service/utils/dbUtils.h
+++ b/gentoobrowse-api/service/utils/dbUtils.h
@@ -4,11 +4,14 @@
#include <command.h>
#include <modifycommand.h>
#include <connection.h>
+#include <IceUtil/Exception.h>
+#include <IceUtil/Optional.h>
namespace Gentoo {
namespace Utils {
namespace Database {
bool bindOptionalsS(DB::Command * db, unsigned int c, const std::vector<boost::optional<Glib::ustring> > & vs);
+ void bindOptionalS(DB::Command * db, unsigned int c, const IceUtil::Optional<std::string> & v);
std::string emptyClone(DB::Connection *, const std::string &);
std::pair<std::string, DB::ModifyCommandPtr> customTemp(DB::Connection *, const std::map<std::string, const std::string> & cols);