From 23316942ce06ca634005af394febef371e4cad43 Mon Sep 17 00:00:00 2001 From: Michael Zanetti Date: Thu, 24 May 2018 14:23:47 +0200 Subject: [PATCH] use bindValue for the log value filter --- libnymea-core/logging/logengine.cpp | 20 +++++++++++++------ libnymea-core/logging/logfilter.cpp | 4 ++-- .../auto/loggingdirect/testloggingdirect.cpp | 9 ++++++++- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/libnymea-core/logging/logengine.cpp b/libnymea-core/logging/logengine.cpp index 222c6603..ea0922a8 100644 --- a/libnymea-core/logging/logengine.cpp +++ b/libnymea-core/logging/logengine.cpp @@ -187,15 +187,23 @@ LogEngine::~LogEngine() QList LogEngine::logEntries(const LogFilter &filter) const { QList results; - QSqlQuery query; + QSqlQuery query(m_db); - QString queryCall = "SELECT * FROM entries ORDER BY timestamp;"; + QString queryString; if (filter.isEmpty()) { - query = m_db.exec(queryCall); + queryString = "SELECT * FROM entries ORDER BY timestamp;"; } else { - queryCall = QString("SELECT * FROM entries WHERE %1 ORDER BY timestamp;").arg(filter.queryString()); - query = m_db.exec(queryCall); + queryString = QString("SELECT * FROM entries WHERE %1 ORDER BY timestamp;").arg(filter.queryString()); } +// qCDebug(dcLogEngine()) << "Preparing query:" << queryString; + query.prepare(queryString); + + foreach (const QString &value, filter.values()) { + query.addBindValue(LogValueTool::serializeValue(value)); + qCDebug(dcLogEngine()) << "Binding value to query:" << LogValueTool::serializeValue(value); + } + + query.exec(); if (m_db.lastError().isValid()) { qCWarning(dcLogEngine) << "Error fetching log entries. Driver error:" << m_db.lastError().driverText() << "Database error:" << m_db.lastError().databaseText(); @@ -215,7 +223,7 @@ QList LogEngine::logEntries(const LogFilter &filter) const entry.setActive(query.value("active").toBool()); results.append(entry); } - qCDebug(dcLogEngine) << "Fetched" << results.count() << "entries for db query:" << queryCall; +// qCDebug(dcLogEngine) << "Fetched" << results.count() << "entries for db query:" << query.executedQuery(); return results; } diff --git a/libnymea-core/logging/logfilter.cpp b/libnymea-core/logging/logfilter.cpp index bf7fbb39..93b60454 100644 --- a/libnymea-core/logging/logfilter.cpp +++ b/libnymea-core/logging/logfilter.cpp @@ -341,11 +341,11 @@ QString LogFilter::createValuesString() const QString query; if (!m_values.isEmpty()) { if (m_values.count() == 1) { - query.append(QString("value = '%1' ").arg(m_values.first())); + query.append("value = ? "); } else { query.append("( "); foreach (const QString &value, m_values) { - query.append(QString("value = '%1' ").arg(value)); + query.append("value = ? "); if (value != m_values.last()) query.append("OR "); } diff --git a/tests/auto/loggingdirect/testloggingdirect.cpp b/tests/auto/loggingdirect/testloggingdirect.cpp index 6958d916..810dbfe7 100644 --- a/tests/auto/loggingdirect/testloggingdirect.cpp +++ b/tests/auto/loggingdirect/testloggingdirect.cpp @@ -69,17 +69,24 @@ void TestLoggingDirect::benchmarkDB_data() { void TestLoggingDirect::benchmarkDB() { + if (qgetenv("WITH_BENCHMARK").isEmpty()) { + QSKIP("Skipping benchmark tests: export WITH_BENCHMARK=1 to enable it."); + } + QFETCH(int, prefill); QFETCH(int, maxSize); // setting max log entries to "prefill" to trim it down to what this test needs. int overflow = 10; + qDebug() << "Flushing DB for test"; engine->setMaxLogEntries(prefill, overflow); engine->setMaxLogEntries(maxSize, overflow); - + qDebug() << "DB has" << engine->logEntries().count() << "entries"; + qDebug() << "Prefilling DB for test"; for (int i = engine->logEntries().count(); i < prefill; i++) { engine->logSystemEvent(QDateTime::currentDateTime(), true); } + qDebug() << "DB has" << engine->logEntries().count() << "entries"; qDebug() << "Starting benchmark with" << engine->logEntries().count() << "entries in the db"; QBENCHMARK {