1
0
forked from BRT/arc
arc/database/dao/GeneralLogDAO.cpp
slava a6509b5653 - Add database migration for screenshot column in general_logs.
- Implement `cleanupOldData` in `DatabaseManager` to remove outdated entries and optimize storage.
- Introduce `unlockScreen` in `AdbUtils` and integrate it into common scripts for screen unlocking.
- Enhance `GeneralLogDAO` to support screenshot storage and retrieval.
- Expand `FileLogWindow` with screenshot viewer and horizontal layout.
- Add device ID migration logic in `BankProfileDAO` and `MaterialDAO`.
- Improve error handling in `EventHandler` by saving and logging screenshots for critical events.
2026-03-31 13:08:02 +07:00

73 lines
2.7 KiB
C++

#include "GeneralLogDAO.h"
#include <QSqlQuery>
#include <QSqlError>
#include "DatabaseManager.h"
#include "time/DateUtils.h"
bool GeneralLogDAO::insert(const QString &level, const QString &source, const QString &message) {
return insert(level, source, message, {});
}
bool GeneralLogDAO::insert(const QString &level, const QString &source, const QString &message,
const QByteArray &screenshot) {
QSqlQuery q(DatabaseManager::instance().database());
q.prepare(R"(
INSERT INTO general_logs (level, source, message, timestamp, screenshot)
VALUES (:level, :source, :message, :timestamp, :screenshot)
)");
q.bindValue(":level", level);
q.bindValue(":source", source);
q.bindValue(":message", message);
q.bindValue(":timestamp", DateUtils::toUtcString(QDateTime::currentDateTimeUtc()));
q.bindValue(":screenshot", screenshot.isEmpty() ? QVariant(QMetaType(QMetaType::QByteArray)) : screenshot);
return q.exec();
}
static QString buildWhereClause(const QStringList &levels) {
if (levels.isEmpty()) return {};
QStringList placeholders;
for (int i = 0; i < levels.size(); ++i)
placeholders << QString(":lvl%1").arg(i);
return " WHERE level IN (" + placeholders.join(',') + ")";
}
static void bindLevels(QSqlQuery &q, const QStringList &levels) {
for (int i = 0; i < levels.size(); ++i)
q.bindValue(QString(":lvl%1").arg(i), levels[i]);
}
QList<GeneralLogEntry> GeneralLogDAO::getLogs(int page, int pageSize, const QStringList &levels) {
QList<GeneralLogEntry> result;
QSqlQuery q(DatabaseManager::instance().database());
q.prepare(
"SELECT id, level, source, message, timestamp, screenshot FROM general_logs"
+ buildWhereClause(levels)
+ " ORDER BY id DESC LIMIT :limit OFFSET :offset"
);
bindLevels(q, levels);
q.bindValue(":limit", pageSize);
q.bindValue(":offset", page * pageSize);
if (!q.exec()) return result;
while (q.next()) {
GeneralLogEntry e;
e.id = q.value("id").toInt();
e.level = q.value("level").toString();
e.source = q.value("source").toString();
e.message = q.value("message").toString();
e.timestamp = DateUtils::fromUtcString(q.value("timestamp").toString());
e.screenshot = q.value("screenshot").toByteArray();
result.append(e);
}
return result;
}
int GeneralLogDAO::getTotalCount(const QStringList &levels) {
QSqlQuery q(DatabaseManager::instance().database());
q.prepare("SELECT COUNT(*) FROM general_logs" + buildWhereClause(levels));
bindLevels(q, levels);
if (!q.exec() || !q.next()) return 0;
return q.value(0).toInt();
}