summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gentoobrowse-api/service/maintenanceimpl.cpp63
-rw-r--r--gentoobrowse-api/service/maintenanceimpl.h5
-rw-r--r--gentoobrowse-api/service/sql/maintenance/createTempFileListView.sql2
-rw-r--r--gentoobrowse-api/unittests/testMaintenance.cpp9
4 files changed, 54 insertions, 25 deletions
diff --git a/gentoobrowse-api/service/maintenanceimpl.cpp b/gentoobrowse-api/service/maintenanceimpl.cpp
index b9a83b4..eddf2b2 100644
--- a/gentoobrowse-api/service/maintenanceimpl.cpp
+++ b/gentoobrowse-api/service/maintenanceimpl.cpp
@@ -21,10 +21,39 @@ namespace Gentoo {
return FilePtr(popen(find, "r"), pclose);
}
+ static
void
- Maintenance::createTempFileList(DB::Connection * dbc)
+ fileDeleted(DB::Connection * dbc, const boost::filesystem::path &, DB::SelectCommandPtr s)
+ {
+ // b.filename, b.filesize, b.filetypeid, b.moddate, b.pathparts, b.repoid
+ s->forEachRow<std::string, int64_t, int64_t, boost::posix_time::ptime, std::string, int64_t>([dbc](auto fn, auto, auto, auto, auto, auto) {
+ fprintf(stderr, "deleted file: %s\n", fn.c_str());
+ });
+ }
+
+ static
+ void
+ fileChanged(DB::Connection * dbc, const boost::filesystem::path &, DB::SelectCommandPtr s)
+ {
+ // a.filename, a.repoid, a.filesize old_filesize, a.filetypeid old_filetypeid, a.moddate old_moddate, a.pathparts old_pathparts, b.filesize new_filesize, b.filetypeid new_filetypeid, b.moddate new_moddate, b.pathparts new_pathparts
+ s->forEachRow<std::string, int64_t, int64_t, int64_t, boost::posix_time::ptime, std::string, int64_t, int64_t, boost::posix_time::ptime, std::string>([dbc](auto fn, auto, auto, auto, auto, auto, auto, auto, auto, auto) {
+ fprintf(stderr, "updated file: %s\n", fn.c_str());
+ });
+ }
+
+ static
+ void
+ fileCreated(DB::Connection * dbc, const boost::filesystem::path &, DB::SelectCommandPtr s)
+ {
+ // b.filename, b.filesize, b.filetypeid, b.moddate, b.pathparts, b.repoid
+ s->forEachRow<std::string, int64_t, int64_t, boost::posix_time::ptime, std::string, int64_t>([dbc](auto fn, auto, auto, auto, auto, auto) {
+ fprintf(stderr, "new file: %s\n", fn.c_str());
+ });
+ }
+
+ void
+ Maintenance::createTempFileList(DB::Connection * dbc, const boost::filesystem::path & tmp)
{
- auto tmp = boost::filesystem::temp_directory_path() / "import";
boost::filesystem::remove_all(tmp);
boost::filesystem::create_directories(tmp);
dbc->select("SELECT name, path FROM gentoobrowse.repos")->forEachRow<std::string, std::string>([&tmp](auto n, auto p) {
@@ -34,41 +63,35 @@ namespace Gentoo {
dbc->beginBulkUpload("filelist", "");
dbc->bulkUploadData(findInPath(tmp.string()).get());
dbc->endBulkUpload(nullptr);
- boost::filesystem::remove_all(tmp);
- }
-
- void
- Maintenance::createTempFileListView(DB::Connection * dbc)
- {
dbc->execute(sql::maintenance::createTempFileListView::sql);
}
void
- Maintenance::mergeTempFileList(DB::Connection * dbc)
+ Maintenance::processChanges(DB::Connection * dbc, const boost::filesystem::path & tmp)
{
DB::TablePatch tp;
tp.src = "tmp";
tp.dest = "gentoobrowse.files";
- tp.pk.insert("repoid");
- tp.pk.insert("filename");
- tp.cols.insert("repoid");
- tp.cols.insert("filename");
- tp.cols.insert("filetypeid");
- tp.cols.insert("pathparts");
- tp.cols.insert("filesize");
- tp.cols.insert("moddate");
+ tp.pk = {"repoid", "filename"};
+ tp.cols = {"repoid", "filename", "filetypeid", "pathparts", "filesize", "moddate"};
+ tp.beforeDelete = boost::bind(&fileDeleted, dbc, tmp, _1);
+ tp.beforeUpdate = boost::bind(&fileChanged, dbc, tmp, _1);
+ tp.beforeInsert = boost::bind(&fileCreated, dbc, tmp, _1);
dbc->patchTable(&tp);
+ boost::filesystem::remove_all(tmp);
+ dbc->execute("DROP VIEW tmp");
+ dbc->execute("DROP TABLE filelist");
}
void
Maintenance::refreshPackageTree(const Ice::Current &)
{
+ auto tmp = boost::filesystem::temp_directory_path() / "import";
auto dbc = db->get();
dbc->execute("SET search_path = gentoobrowse, pg_catalog");
DB::TransactionScope tx(dbc.get());
- createTempFileList(dbc.get());
- createTempFileListView(dbc.get());
- mergeTempFileList(dbc.get());
+ createTempFileList(dbc.get(), tmp);
+ processChanges(dbc.get(), tmp);
dbc->execute("SET search_path = public, pg_catalog");
}
}
diff --git a/gentoobrowse-api/service/maintenanceimpl.h b/gentoobrowse-api/service/maintenanceimpl.h
index b7f3b3e..c5ad6b7 100644
--- a/gentoobrowse-api/service/maintenanceimpl.h
+++ b/gentoobrowse-api/service/maintenanceimpl.h
@@ -16,9 +16,8 @@ namespace Gentoo {
void refreshPackageTree(const Ice::Current &) override;
private:
- static void createTempFileList(DB::Connection *);
- static void createTempFileListView(DB::Connection *);
- static void mergeTempFileList(DB::Connection *);
+ static void createTempFileList(DB::Connection *, const boost::filesystem::path &);
+ static void processChanges(DB::Connection *, const boost::filesystem::path &);
static FilePtr findInPath(const std::string &);
};
}
diff --git a/gentoobrowse-api/service/sql/maintenance/createTempFileListView.sql b/gentoobrowse-api/service/sql/maintenance/createTempFileListView.sql
index 91dd062..f40473e 100644
--- a/gentoobrowse-api/service/sql/maintenance/createTempFileListView.sql
+++ b/gentoobrowse-api/service/sql/maintenance/createTempFileListView.sql
@@ -5,7 +5,7 @@ SELECT
ft.filetypeid,
(STRING_TO_ARRAY(fl.filename, '/'))[2:100] pathparts,
fl.filesize,
- fl.filemtime AT TIME ZONE 'utc' moddate
+ fl.filemtime moddate
FROM filelist fl, gentoobrowse.repos r, gentoobrowse.filetypes ft
WHERE (STRING_TO_ARRAY(fl.filename, '/'))[1] = r.name
AND (STRING_TO_ARRAY(fl.filename, '/'))[2:100] ~ ft.spec
diff --git a/gentoobrowse-api/unittests/testMaintenance.cpp b/gentoobrowse-api/unittests/testMaintenance.cpp
index 38fb258..bb8de21 100644
--- a/gentoobrowse-api/unittests/testMaintenance.cpp
+++ b/gentoobrowse-api/unittests/testMaintenance.cpp
@@ -42,18 +42,25 @@ BOOST_FIXTURE_TEST_SUITE(tp, TestClient)
BOOST_AUTO_TEST_CASE( refreshPackageTree )
{
SampleData sd;
- sd.extract("4156eb45cf3b0ce1d7125b84efd8688c2d6e831d", "gentoo");
auto db = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("GentooBrowseAPI"));
auto insRepo = db->modify("INSERT INTO gentoobrowse.repos(name, path) VALUES(?, ?)");
insRepo->bindParamS(0, "gentoo");
insRepo->bindParamS(1, (treeDir / "gentoo").string());
insRepo->execute();
+ sd.extract("4156eb45cf3b0ce1d7125b84efd8688c2d6e831d", "gentoo");
m->refreshPackageTree();
+ sd.clean();
db->select("SELECT COUNT(*) FROM gentoobrowse.files")->forEachRow<int64_t>([](auto n) {
BOOST_REQUIRE_EQUAL(2084, n);
});
+
+ sd.extract("756569aa764177340726dd3d40b41d89b11b20c7", "gentoo");
+ m->refreshPackageTree();
+ sd.clean();
+
+ m->refreshPackageTree();
}
BOOST_AUTO_TEST_SUITE_END();