Files
DbLogAnalyzer/threads/remotescannerthread.cpp

87 lines
2.1 KiB
C++
Raw Normal View History

2019-04-01 10:43:36 +02:00
#include "remotescannerthread.h"
#include <QDirIterator>
#include <QFileInfo>
#include <QStringBuilder>
RemoteScannerThread::RemoteScannerThread(const QString &dir, QObject *parent) :
QThread(parent),
m_dir(dir)
{
}
void RemoteScannerThread::run()
{
scanForHosts();
}
void RemoteScannerThread::scanForHosts()
{
if (m_files)
qFatal("thread was already run");
QDirIterator iter(m_dir, QDir::Dirs | QDir::NoDotAndDotDot);
while (iter.hasNext())
{
if (isInterruptionRequested())
return;
const QFileInfo fileInfo(iter.next());
const auto host = fileInfo.fileName();
emit logMessage(tr("Scanning host %0...").arg(host));
scanForLogfiles(host, fileInfo.absoluteFilePath());
}
emit progressUpdate(m_files, m_files - m_valid);
emit finished(m_result);
}
void RemoteScannerThread::scanForLogfiles(const QString &hostname, const QString &hostDir)
{
auto &hostEntry = m_result[hostname];
QDirIterator dirIter(hostDir, { "*.log.gz" }, QDir::Files);
while (dirIter.hasNext())
{
if (isInterruptionRequested())
return;
const QFileInfo fileInfo(dirIter.next());
m_files++;
const auto match = m_fileExpression.match(fileInfo.fileName());
if (!match.hasMatch())
continue;
const auto process = match.captured(1);
if (process.endsWith(QStringLiteral(".olog")))
continue;
const auto date = QDate::fromString(match.captured(2), QStringLiteral("yyyyMMdd"));
if (date.isNull())
continue;
m_valid++;
Q_ASSERT(!hostEntry[process].contains(date));
hostEntry[process].insert(date, {
hostname % "/" % fileInfo.fileName(),
fileInfo.absoluteFilePath(),
fileInfo.size(),
true
});
const auto now = QDateTime::currentDateTime();
if (m_lastUpdate.isNull() || m_lastUpdate.msecsTo(now) >= 100)
{
emit progressUpdate(m_files, m_files - m_valid);
m_lastUpdate = now;
}
}
}