#include #include #include //signal handler #include #include #include "search.h" static bool run = true; void sig_handler(int sig_num) { Log::info << "signalHandler triggered"; run = false; ::close(STDIN_FILENO); //interrupt input (void) sig_num; } int main(int argc, const char** argv) { Log::init(); Log::setConsoleLogLevel(Log::Level::TRACE); Log::addLogfile("log.txt", Log::Level::TRACE); #if __unix__ Log::setColoredOutput(true); #endif if(argc < 2) { Log::error << "Usage: " << argv[0] << " [ ....]"; return 1; } time_t start = time(nullptr); Search rootsearch; for(int i = 1; i < argc; ++i) { Log::info << "Load File: " << argv[i]; rootsearch.addFile(argv[i]); } rootsearch.finalize(); time_t end = time(nullptr); Log::info << rootsearch.getChatCount() << " Chats with " << rootsearch.getMessageCount() << " Messages loaded in " << end-start << "s"; signal(SIGINT, sig_handler); Search* search = nullptr; while(run) { if(!search) search = &rootsearch; Log::info << search->getMessageCount() << " Messages. Enter searchterm: "; std::string searchterm; std::getline(std::cin, searchterm); Log::trace << "searchterm: \"" << searchterm << "\""; if(!run) break; Log::info << "Enter Flags: [RI]"; std::string flags; std::cin >> flags; Searchflags parsedflags = Search::fromString(flags); if(!run) break; time_t start = time(nullptr); std::list results = search->search(searchterm, parsedflags); time_t end = time(nullptr); Log::info << results.size() << " results found in " << end-start << "s"; if(results.size()) { Log::info << "Print results ?"; char c; std::cin >> c; if(!run) break; if(c == 'y' || c == 'Y') { //print results for(const Message* m : results) { Log::info << search->getShortChatname(m->senderid) << "@" << search->getShortChatname(m->chatid) << "> (" << m->messageid << ") " << m->text; } } Log::info << "New Subfilter (y)? Clear Search (c)? Change current Filter (anykey)?"; std::cin >> c; if(!run) break; if(c == 'y' || c == 'Y') { //filter Search* subsearch = new Search(*search, &results); //delete old subsearch (dont delete root) if(search != &rootsearch) delete search; //set new search search = subsearch; } else if(c == 'c' || c == 'C') { //move to root search if(search != &rootsearch) { delete search; search = &rootsearch; } } } std::cin.ignore(std::numeric_limits::max(), '\n'); } if(search != &rootsearch) delete search; Log::stop(); return 0; }