DiffResults diff(const QueryData& old_, const QueryData& new_) { DiffResults r; QueryData overlap; for (const auto& i : new_) { auto item = std::find(old_.begin(), old_.end(), i); if (item != old_.end()) { overlap.push_back(i); } else { r.added.push_back(i); } } std::multiset<Row> overlap_set(overlap.begin(), overlap.end()); std::multiset<Row> old_set(old_.begin(), old_.end()); std::set_difference(old_set.begin(), old_set.end(), overlap_set.begin(), overlap_set.end(), std::back_inserter(r.removed)); return r; }
bool addUniqueRowToQueryData(QueryData& q, const Row& r) { if (std::find(q.begin(), q.end(), r) != q.end()) { return false; } q.push_back(r); return true; }
QueryData pidsFromContext(const QueryContext& context, bool all) { QueryData procs; if (context.hasConstraint("pid", EQUALS)) { context.forEachConstraint( "pid", EQUALS, ([&procs](const std::string& expr) { auto proc = SQL::selectAllFrom("processes", "pid", EQUALS, expr); procs.insert(procs.end(), procs.begin(), procs.end()); })); } else if (!all) { procs = SQL::selectAllFrom( "processes", "pid", EQUALS, std::to_string(platformGetPid())); } else { procs = SQL::selectAllFrom("processes"); } return procs; }