diff options
-rw-r--r-- | gentoobrowse-api/domain/converters.cpp | 69 | ||||
-rw-r--r-- | gentoobrowse-api/domain/converters.h | 11 | ||||
-rw-r--r-- | gentoobrowse-api/domain/unpackPqTextArray.h | 20 | ||||
-rw-r--r-- | gentoobrowse-api/domain/unpackPqTextArray.ll | 26 | ||||
-rw-r--r-- | gentoobrowse-api/service/maintenanceGitOperations.cpp | 37 |
5 files changed, 93 insertions, 70 deletions
diff --git a/gentoobrowse-api/domain/converters.cpp b/gentoobrowse-api/domain/converters.cpp index 33a479f..aa51c26 100644 --- a/gentoobrowse-api/domain/converters.cpp +++ b/gentoobrowse-api/domain/converters.cpp @@ -6,6 +6,15 @@ #include <boost/algorithm/string/split.hpp> namespace Slicer { + static + void + unpackPqTextArray(const std::string & s, ::Gentoo::StringList & list) + { + std::stringstream ss(s); + UnpackPqTextArray l(ss, list); + l.yylex(); + } + template<typename T> PqArray<T>::PqArray(std::vector<T> & l) : ModelPartForSequence<std::vector<T>>(l) @@ -24,11 +33,11 @@ namespace Slicer { std::string v; s->set(v); if (v.size() < 3) return; - typedef boost::algorithm::split_iterator<std::string::iterator> string_split_iterator; + typedef boost::algorithm::split_iterator<std::string::iterator> string_split_iterator; string_split_iterator sfi(++v.begin(), --v.end(), boost::algorithm::first_finder(",", boost::algorithm::is_iequal())); for(auto it = sfi; it != string_split_iterator(); ++it) { this->Model.push_back(boost::lexical_cast<T>(*it)); - } + } } void PqArray<std::string>::SetValue(ValueSourcePtr s) @@ -36,32 +45,20 @@ namespace Slicer { Model.clear(); std::string v; s->set(v); - std::stringstream ss(v); - ::Portage::Utils::UnpackPqTextArray l(ss, Model); - l.yylex(); + unpackPqTextArray(v, Model); } template<typename T> - void PqArray<T>::GetValue(ValueTargetPtr s) + void + PqArray<T>::GetValue(ValueTargetPtr s) { - if (this->Model.empty()) s->get("{}"); - std::vector<std::string> l2; - l2.reserve(this->Model.size()); - for(const auto & i : this->Model) { - l2.push_back(boost::lexical_cast<std::string>(i)); - } - s->get("{" + boost::algorithm::join(l2, ",") + "}"); + s->get(packPqArray(this->Model)); } - void PqArray<std::string>::GetValue(ValueTargetPtr s) + void + PqArray<std::string>::GetValue(ValueTargetPtr s) { - if (Model.empty()) s->get("{}"); - ::Gentoo::StringList l2(Model); - for(auto & i : l2) { - boost::algorithm::replace_all(i, "\"", "\\\""); - i = "\"" + i + "\""; - } - s->get("{" + boost::algorithm::join(l2, ",") + "}"); + s->get(packPqArray(this->Model)); } template class PqArray<Ice::Int>; @@ -70,23 +67,37 @@ namespace Slicer { unpackPqTextArray(const std::string & s) { ::Gentoo::StringList list; - std::stringstream ss(s); - ::Portage::Utils::UnpackPqTextArray l(ss, list); - l.yylex(); + unpackPqTextArray(s, list); return list; } + template<typename T> std::string - packPqTextArray(const ::Gentoo::StringList & l) + packPqArray(const T & l) { if (l.empty()) return "{}"; - ::Gentoo::StringList l2(l); - for(auto & i : l2) { - boost::algorithm::replace_all(i, "\"", "\\\""); - i = "\"" + i + "\""; + std::vector<std::string> l2; + l2.reserve(l.size()); + for(const auto & i : l) { + l2.push_back(packPqVar(i)); } return "{" + boost::algorithm::join(l2, ",") + "}"; } + template std::string packPqArray<std::set<std::string>>(const std::set<std::string> &); + + template<typename T> + std::string + packPqVar(const T & l) + { + return boost::lexical_cast<std::string>(l); + } + + template<> + std::string + packPqVar(const std::string & l) + { + return "\"" + boost::algorithm::replace_all_copy(l, "\"", "\\\"") + "\""; + } boost::posix_time::ptime shortDateToPosixTime(const std::string & s) diff --git a/gentoobrowse-api/domain/converters.h b/gentoobrowse-api/domain/converters.h index 84fd859..0bd7e91 100644 --- a/gentoobrowse-api/domain/converters.h +++ b/gentoobrowse-api/domain/converters.h @@ -29,9 +29,18 @@ namespace Slicer { ::Gentoo::StringList unpackPqTextArray(const std::string & s); + template<typename T> DLL_PUBLIC std::string - packPqTextArray(const ::Gentoo::StringList & l); + packPqArray(const T & l); + + template<typename T> + std::string + packPqVar(const T & l); + + template<> + std::string + packPqVar(const std::string & l); DLL_PUBLIC boost::posix_time::ptime diff --git a/gentoobrowse-api/domain/unpackPqTextArray.h b/gentoobrowse-api/domain/unpackPqTextArray.h index 246be71..aefaddd 100644 --- a/gentoobrowse-api/domain/unpackPqTextArray.h +++ b/gentoobrowse-api/domain/unpackPqTextArray.h @@ -7,19 +7,17 @@ #include <FlexLexer.h> #endif -namespace Portage { - namespace Utils { - class UnpackPqTextArray : public yyFlexLexer { - public: - UnpackPqTextArray(std::istream &, ::Gentoo::StringList & sl); +namespace Slicer { + class UnpackPqTextArray : public yyFlexLexer { + public: + UnpackPqTextArray(std::istream &, ::Gentoo::StringList & sl); - int yylex() override; - void LexerError(const char * msg) override; + int yylex() override; + void LexerError(const char * msg) override; - private: - ::Gentoo::StringList & list; - }; - } + private: + ::Gentoo::StringList & list; + }; } #endif diff --git a/gentoobrowse-api/domain/unpackPqTextArray.ll b/gentoobrowse-api/domain/unpackPqTextArray.ll index e4b0ccd..f8cce5f 100644 --- a/gentoobrowse-api/domain/unpackPqTextArray.ll +++ b/gentoobrowse-api/domain/unpackPqTextArray.ll @@ -4,7 +4,7 @@ %option 8bit %option stack %option yylineno -%option yyclass="Portage::Utils::UnpackPqTextArray" +%option yyclass="Slicer::UnpackPqTextArray" %option prefix="pqBase" %{ @@ -57,19 +57,17 @@ char [^"] %% -namespace Portage { - namespace Utils { - UnpackPqTextArray::UnpackPqTextArray(std::istream & f, ::Gentoo::StringList & sl) : - yyFlexLexer(&f, NULL), - list(sl) - { - } +namespace Slicer { + UnpackPqTextArray::UnpackPqTextArray(std::istream & f, ::Gentoo::StringList & sl) : + yyFlexLexer(&f, NULL), + list(sl) + { + } - void - UnpackPqTextArray::LexerError(const char * msg) - { - throw std::runtime_error(msg); - } - } + void + UnpackPqTextArray::LexerError(const char * msg) + { + throw std::runtime_error(msg); + } } diff --git a/gentoobrowse-api/service/maintenanceGitOperations.cpp b/gentoobrowse-api/service/maintenanceGitOperations.cpp index feba275..b178100 100644 --- a/gentoobrowse-api/service/maintenanceGitOperations.cpp +++ b/gentoobrowse-api/service/maintenanceGitOperations.cpp @@ -21,22 +21,23 @@ namespace Gentoo { namespace Service { using namespace Utils::Git; + typedef std::set<std::string> StringSet; + static int - onFile(const git_diff_delta * delta, float, void * fileset) + onFile(const git_diff_delta * delta, void * fileset) { - static_cast<StringList *>(fileset)->push_back(delta->old_file.path); - static_cast<StringList *>(fileset)->push_back(delta->new_file.path); + static_cast<StringSet *>(fileset)->insert(delta->old_file.path); + static_cast<StringSet *>(fileset)->insert(delta->new_file.path); return 0; } + template<typename T> static int - onBinaryFile(const git_diff_delta * delta, const git_diff_binary *, void * fileset) + onFile(const git_diff_delta * delta, T, void * fileset) { - static_cast<StringList *>(fileset)->push_back(delta->old_file.path); - static_cast<StringList *>(fileset)->push_back(delta->new_file.path); - return 0; + return onFile(delta, fileset); } static @@ -70,11 +71,8 @@ namespace Gentoo { // Get tree to tree diff auto diff = gitSafeGet(git_diff_tree_to_tree, git_diff_free, repo, currentTree.get(), parentTree.get(), nullptr); // Compare trees - StringList fs; - git_diff_foreach(diff.get(), onFile, onBinaryFile, nullptr, nullptr, &fs); - // Remove duplicate mentions of files - std::sort(fs.begin(), fs.end()); - fs.erase(std::unique(fs.begin(), fs.end()), fs.end()); + StringSet fs; + gitSafe(git_diff_foreach, diff.get(), onFile<float>, onFile<const git_diff_binary *>, nullptr, nullptr, &fs); // Insert commit into DB git_oid_tostr(str, sizeof(str), &oid); @@ -85,7 +83,7 @@ namespace Gentoo { cli->bindParamS(4, git_commit_body(commit.get())); cli->bindParamS(5, sig->name); cli->bindParamS(6, sig->email); - cli->bindParamS(7, Slicer::packPqTextArray(fs)); + cli->bindParamS(7, Slicer::packPqArray(fs)); cli->execute(); } } @@ -97,8 +95,9 @@ namespace Gentoo { sql::maintenance::reposToUpdate.select(dbc.get())->forEachRow<std::string, std::string, std::string>(&updateRepository); } + static int - insertFileChange(const git_diff_delta * delta, float, void * ptr) + insertFileChange(const git_diff_delta * delta, void * ptr) { auto ins = static_cast<DB::ModifyCommand *>(ptr); switch (delta->status) { @@ -121,6 +120,14 @@ namespace Gentoo { return 0; } + template<typename T> + static + int + insertFileChangeT(const git_diff_delta * delta, T, void * ptr) + { + return insertFileChange(delta, ptr); + } + static void writeChangesToFileList(DB::Connection * db, int64_t repoId, git_repository * repo, const git_oid & last, const git_oid & head); @@ -155,7 +162,7 @@ namespace Gentoo { auto diff = gitSafeGet(git_diff_tree_to_tree, git_diff_free, repo, lastTree.get(), headTree.get(), nullptr); auto ins = db->modify("INSERT INTO filelistraw(repoid, status, filename) VALUES(?, ?, ?)"); ins->bindParamI(0, repoId); - gitSafe(git_diff_foreach, diff.get(), insertFileChange, nullptr, nullptr, nullptr, ins.get()); + gitSafe(git_diff_foreach, diff.get(), insertFileChangeT<float>, insertFileChangeT<const git_diff_binary *>, nullptr, nullptr, ins.get()); } void |