summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gentoobrowse-api/service/maintenanceimpl.cpp60
-rw-r--r--gentoobrowse-api/service/maintenanceimpl.h20
2 files changed, 46 insertions, 34 deletions
diff --git a/gentoobrowse-api/service/maintenanceimpl.cpp b/gentoobrowse-api/service/maintenanceimpl.cpp
index 0957dda..bbece65 100644
--- a/gentoobrowse-api/service/maintenanceimpl.cpp
+++ b/gentoobrowse-api/service/maintenanceimpl.cpp
@@ -51,58 +51,62 @@ namespace Gentoo {
{
}
+ template<typename T>
+ Maintenance::FileProcessorPtr
+ Maintenance::createFileProessor()
+ {
+ return FileProcessorPtr(new T());
+ }
+
Maintenance::Maintenance(IceTray::DatabasePoolPtr d) :
IceTray::AbstractDatabaseClient(d)
{
- fps[CategoryMetaProcessor::FILETYPEID] = new CategoryMetaProcessor();
- fps[PackageManifestProcessor::FILETYPEID] = new PackageManifestProcessor();
- fps[PackageMetaProcessor::FILETYPEID] = new PackageMetaProcessor();
- fps[EbuildMetaProcessor::FILETYPEID] = new EbuildMetaProcessor();
- fps[UseGlobalProcessor::FILETYPEID] = new UseGlobalProcessor();
- fps[UseLocalProcessor::FILETYPEID] = new UseLocalProcessor();
- fps[UseGroupProcessor::FILETYPEID] = new UseGroupProcessor();
- fps[MasksProcessor::FILETYPEID] = new MasksProcessor();
+ fpfs[CategoryMetaProcessor::FILETYPEID] = &createFileProessor<CategoryMetaProcessor>;
+ fpfs[PackageManifestProcessor::FILETYPEID] = &createFileProessor<PackageManifestProcessor>;
+ fpfs[PackageMetaProcessor::FILETYPEID] = &createFileProessor<PackageMetaProcessor>;
+ fpfs[EbuildMetaProcessor::FILETYPEID] = &createFileProessor<EbuildMetaProcessor>;
+ fpfs[UseGlobalProcessor::FILETYPEID] = &createFileProessor<UseGlobalProcessor>;
+ fpfs[UseLocalProcessor::FILETYPEID] = &createFileProessor<UseLocalProcessor>;
+ fpfs[UseGroupProcessor::FILETYPEID] = &createFileProessor<UseGroupProcessor>;
+ fpfs[MasksProcessor::FILETYPEID] = &createFileProessor<MasksProcessor>;
}
Maintenance::~Maintenance()
{
- for(const auto & fp : fps) {
- delete fp.second;
- }
}
void
- Maintenance::fileDeleted(DB::Connection * dbc, const boost::filesystem::path & tmp, DB::SelectCommandPtr s)
+ Maintenance::fileDeleted(DB::Connection * dbc, const FileProcessors * fps, const boost::filesystem::path & tmp, 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,&tmp,this](auto fn, auto, auto ft, auto, auto, auto) {
- this->fileHandle(ft, boost::bind(&FileProcessor::deleted, _1, dbc, fn));
+ s->forEachRow<std::string, int64_t, int64_t, boost::posix_time::ptime, std::string, int64_t>([dbc,&tmp,this,fps](auto fn, auto, auto ft, auto, auto, auto) {
+ this->fileHandle(ft, fps, boost::bind(&FileProcessor::deleted, _1, dbc, fn));
});
}
void
- Maintenance::fileChanged(DB::Connection * dbc, const boost::filesystem::path & tmp, DB::SelectCommandPtr s)
+ Maintenance::fileChanged(DB::Connection * dbc, const FileProcessors * fps, const boost::filesystem::path & tmp, 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,&tmp,this](auto fn, auto, auto, auto ft, auto, auto, auto, auto, auto, auto) {
- this->fileHandle(ft, boost::bind(&FileProcessor::modified, _1, dbc, fn, tmp / fn));
+ 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,&tmp,this,fps](auto fn, auto, auto, auto ft, auto, auto, auto, auto, auto, auto) {
+ this->fileHandle(ft, fps, boost::bind(&FileProcessor::modified, _1, dbc, fn, tmp / fn));
});
}
void
- Maintenance::fileCreated(DB::Connection * dbc, const boost::filesystem::path & tmp, DB::SelectCommandPtr s)
+ Maintenance::fileCreated(DB::Connection * dbc, const FileProcessors * fps, const boost::filesystem::path & tmp, 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,&tmp,this](auto fn, auto, auto ft, auto, auto, auto) {
- this->fileHandle(ft, boost::bind(&FileProcessor::created, _1, dbc, fn, tmp / fn));
+ s->forEachRow<std::string, int64_t, int64_t, boost::posix_time::ptime, std::string, int64_t>([dbc,&tmp,this,fps](auto fn, auto, auto ft, auto, auto, auto) {
+ this->fileHandle(ft, fps, boost::bind(&FileProcessor::created, _1, dbc, fn, tmp / fn));
});
}
void
- Maintenance::fileHandle(int64_t ft, const FileHandleFunc & f) const
+ Maintenance::fileHandle(int64_t ft, const FileProcessors * fps, const FileHandleFunc & f) const
{
- auto i = fps.find(ft);
- if (i != fps.end()) {
+ auto i = fps->find(ft);
+ if (i != fps->end()) {
f(i->second);
}
}
@@ -131,15 +135,19 @@ namespace Gentoo {
void
Maintenance::processChanges(DB::Connection * dbc, const boost::filesystem::path & tmp)
{
+ FileProcessors fps;
+ for (const auto & fpf : fpfs) {
+ fps[fpf.first] = fpf.second();
+ }
DB::StaticSqlWriter src(sql::maintenance::fileList.getSql());
DB::TablePatch tp;
tp.srcExpr = &src;
tp.dest = "gentoobrowse.files";
tp.pk = {"repoid", "filename"};
tp.cols = {"repoid", "filename", "filetypeid", "pathparts", "filesize", "moddate"};
- tp.beforeDelete = boost::bind(&Maintenance::fileDeleted, this, dbc, tmp, _1);
- tp.beforeUpdate = boost::bind(&Maintenance::fileChanged, this, dbc, tmp, _1);
- tp.beforeInsert = boost::bind(&Maintenance::fileCreated, this, dbc, tmp, _1);
+ tp.beforeDelete = boost::bind(&Maintenance::fileDeleted, this, dbc, &fps, tmp, _1);
+ tp.beforeUpdate = boost::bind(&Maintenance::fileChanged, this, dbc, &fps, tmp, _1);
+ tp.beforeInsert = boost::bind(&Maintenance::fileCreated, this, dbc, &fps, tmp, _1);
DB::StaticSqlWriter obpo("processOrder NULLS LAST");
tp.order = &obpo;
dbc->patchTable(&tp);
diff --git a/gentoobrowse-api/service/maintenanceimpl.h b/gentoobrowse-api/service/maintenanceimpl.h
index 846507b..378cbd1 100644
--- a/gentoobrowse-api/service/maintenanceimpl.h
+++ b/gentoobrowse-api/service/maintenanceimpl.h
@@ -19,9 +19,11 @@ namespace Gentoo {
virtual void modified(DB::Connection * dbc, const boost::filesystem::path & fn, const boost::filesystem::path & path) const;
virtual void deleted(DB::Connection * dbc, const boost::filesystem::path & fn) const;
};
+ typedef boost::shared_ptr<const FileProcessor> FileProcessorPtr;
- typedef std::map<int64_t, const FileProcessor *> FileProcessors;
- typedef boost::function<void(const FileProcessor *)> FileHandleFunc;
+ typedef std::map<int64_t, boost::function<FileProcessorPtr()>> FileProcessorFactories;
+ typedef std::map<int64_t, FileProcessorPtr> FileProcessors;
+ typedef boost::function<void(FileProcessorPtr)> FileHandleFunc;
Maintenance(IceTray::DatabasePoolPtr d);
~Maintenance();
@@ -31,12 +33,14 @@ namespace Gentoo {
private:
static void createTempFileList(DB::Connection *, const boost::filesystem::path &);
void processChanges(DB::Connection *, const boost::filesystem::path &);
- void fileDeleted(DB::Connection * dbc, const boost::filesystem::path &, DB::SelectCommandPtr s);
- void fileChanged(DB::Connection * dbc, const boost::filesystem::path &, DB::SelectCommandPtr s);
- void fileCreated(DB::Connection * dbc, const boost::filesystem::path & tmp, DB::SelectCommandPtr s);
- void fileHandle(int64_t filetypeId, const FileHandleFunc &) const;
-
- FileProcessors fps;
+ void fileDeleted(DB::Connection * dbc, const FileProcessors *, const boost::filesystem::path &, DB::SelectCommandPtr s);
+ void fileChanged(DB::Connection * dbc, const FileProcessors *, const boost::filesystem::path &, DB::SelectCommandPtr s);
+ void fileCreated(DB::Connection * dbc, const FileProcessors *, const boost::filesystem::path & tmp, DB::SelectCommandPtr s);
+ void fileHandle(int64_t filetypeId, const FileProcessors *, const FileHandleFunc &) const;
+
+ template <typename T>
+ static FileProcessorPtr createFileProessor();
+ FileProcessorFactories fpfs;
};
}
}