void Logstalgia::readLog(int buffer_rows) { profile_start("readLog"); set_utc_tz(); int entries_read = 0; std::string linestr; BaseLog* baselog = getLog(); time_t read_timestamp = 0; while( baselog->getNextLine(linestr) ) { //trim whitespace if(linestr.size()>0) { size_t string_end = linestr.find_last_not_of(" \t\f\v\n\r"); if(string_end == std::string::npos) { linestr = ""; } else if(string_end != linestr.size()-1) { linestr = linestr.substr(0,string_end+1); } } LogEntry le; bool parsed_entry; //determine format if(accesslog==0) { //is this a recognized NCSA access log? NCSALog* ncsalog = new NCSALog(); if((parsed_entry = ncsalog->parseLine(linestr, le))) { accesslog = ncsalog; } else { delete ncsalog; } if(accesslog==0) { //is this a custom log? CustomAccessLog* customlog = new CustomAccessLog(); if((parsed_entry = customlog->parseLine(linestr, le))) { accesslog = customlog; } else { delete customlog; } } } else { if(!(parsed_entry = accesslog->parseLine(linestr, le))) { debugLog("error: could not read line %s\n", linestr.c_str()); } } if(parsed_entry) { if((!mintime || mintime <= le.timestamp) && (!settings.stop_time || settings.stop_time > le.timestamp)) { queued_entries.push_back(new LogEntry(le)); total_entries++; entries_read++; //read at least the buffered row count if specified //otherwise read all entries with the same time if(buffer_rows) { if(entries_read > buffer_rows) break; } else { if(read_timestamp && read_timestamp < le.timestamp) break; } read_timestamp = le.timestamp; } } } profile_stop(); unset_utc_tz(); if(queued_entries.empty() && seeklog != 0) { if(total_entries==0) { if(mintime != 0) { logstalgia_quit("could not parse any entries in the specified time period"); } else { logstalgia_quit("could not parse any entries"); } } //no more entries end_reached = true; return; } if(seeklog != 0) { float percent = seeklog->getPercent(); if(percent > settings.stop_position) { end_reached = true; return; } if(!settings.disable_progress) slider.setPercent(percent); } //set start time if currently 0 if(starttime==0 && !queued_entries.empty()) { starttime = queued_entries.front()->timestamp; currtime = 0; } }
void Logstalgia::readLog(int buffer_rows) { profile_start("readLog"); //change TZ to UTC putenv((char*)"TZ=UTC"); tzset(); int entries_read = 0; std::string linestr; BaseLog* baselog = getLog(); time_t read_timestamp = 0; while( baselog->getNextLine(linestr) ) { //trim whitespace if(linestr.size()>0) { size_t string_end = linestr.find_last_not_of(" \t\f\v\n\r"); if(string_end == std::string::npos) { linestr = ""; } else if(string_end != linestr.size()-1) { linestr = linestr.substr(0,string_end+1); } } LogEntry le; bool parsed_entry; //determine format if(accesslog==0) { //is this a recognized NCSA access log? NCSALog* ncsalog = new NCSALog(); if((parsed_entry = ncsalog->parseLine(linestr, le))) { accesslog = ncsalog; } else { delete ncsalog; } if(accesslog==0) { //is this a custom log? CustomAccessLog* customlog = new CustomAccessLog(); if((parsed_entry = customlog->parseLine(linestr, le))) { accesslog = customlog; } else { delete customlog; } } } else { if(!(parsed_entry = accesslog->parseLine(linestr, le))) { debugLog("error: could not read line %s\n", linestr.c_str()); } } if(parsed_entry) { if(mintime == 0 || mintime <= le.timestamp) { queued_entries.push_back(new LogEntry(le)); total_entries++; entries_read++; //read at least the buffered row count if specified //otherwise read all entries with the same time if(buffer_rows) { if(entries_read > buffer_rows) break; } else { if(read_timestamp && read_timestamp < le.timestamp) break; } read_timestamp = le.timestamp; } } } profile_stop(); //reset TZ to previous value if(!old_tz.empty()) { putenv((char*)old_tz.c_str()); } else { #ifdef HAVE_UNSETENV unsetenv("TZ"); #else putenv("TZ="); #endif } tzset(); if(queued_entries.empty() && seeklog != 0) { if(total_entries==0) { logstalgia_quit("could not parse first entry"); } //no more entries end_reached = true; return; } if(seeklog != 0) { float percent = seeklog->getPercent(); if(percent > gStopPosition) { end_reached = true; return; } if(!gDisableProgress) slider.setPercent(percent); } //set start time if currently 0 if(starttime==0 && !queued_entries.empty()) { starttime = queued_entries.front()->timestamp; currtime = 0; } }