parent
0536382c3e
commit
166ecad499
@ -1,225 +0,0 @@
|
|||||||
From 9b47babb6c4172535be0630141d6f8c6047c2724 Mon Sep 17 00:00:00 2001
|
|
||||||
From: =?UTF-8?q?Ivan=20=C4=8Cuki=C4=87?= <ivan.cukic@kde.org>
|
|
||||||
Date: Wed, 7 Mar 2018 23:15:49 +0100
|
|
||||||
Subject: [PATCH 1/5] Do not assume SQLite works and do not terminate on errors
|
|
||||||
|
|
||||||
The SQLite database gets corrupted more often than expected.
|
|
||||||
Instead of assuming that it works flawlessly and asserting
|
|
||||||
that it does, just report the issue to the terminal, and
|
|
||||||
just give empty results.
|
|
||||||
---
|
|
||||||
src/common/database/Database.cpp | 8 +++++---
|
|
||||||
src/resultmodel.cpp | 2 ++
|
|
||||||
src/resultset.cpp | 44 ++++++++++++++++++++--------------------
|
|
||||||
src/resultwatcher.cpp | 12 +++++++----
|
|
||||||
4 files changed, 37 insertions(+), 29 deletions(-)
|
|
||||||
|
|
||||||
diff --git a/src/common/database/Database.cpp b/src/common/database/Database.cpp
|
|
||||||
index 1dafeca..e21d267 100644
|
|
||||||
--- a/src/common/database/Database.cpp
|
|
||||||
+++ b/src/common/database/Database.cpp
|
|
||||||
@@ -202,9 +202,11 @@ Database::Ptr Database::instance(Source source, OpenMode openMode)
|
|
||||||
auto walResult = ptr->pragma(QStringLiteral("journal_mode = WAL"));
|
|
||||||
|
|
||||||
if (walResult != "wal") {
|
|
||||||
- qFatal("KActivities: Database can not be opened in WAL mode. Check the "
|
|
||||||
- "SQLite version (required >3.7.0). And whether your filesystem "
|
|
||||||
- "supports shared memory");
|
|
||||||
+ qWarning("KActivities: Database can not be opened in WAL mode. Check the "
|
|
||||||
+ "SQLite version (required >3.7.0). And whether your filesystem "
|
|
||||||
+ "supports shared memory");
|
|
||||||
+
|
|
||||||
+ return nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We don't have a big database, lets flush the WAL when
|
|
||||||
diff --git a/src/resultmodel.cpp b/src/resultmodel.cpp
|
|
||||||
index 7290b95..077edc8 100644
|
|
||||||
--- a/src/resultmodel.cpp
|
|
||||||
+++ b/src/resultmodel.cpp
|
|
||||||
@@ -891,6 +891,8 @@ public:
|
|
||||||
//_ Title and mimetype functions
|
|
||||||
void fillTitleAndMimetype(ResultSet::Result &result)
|
|
||||||
{
|
|
||||||
+ if (!database) return;
|
|
||||||
+
|
|
||||||
auto query = database->execQuery(
|
|
||||||
"SELECT "
|
|
||||||
"title, mimetype "
|
|
||||||
diff --git a/src/resultset.cpp b/src/resultset.cpp
|
|
||||||
index 744bb61..2fc081b 100644
|
|
||||||
--- a/src/resultset.cpp
|
|
||||||
+++ b/src/resultset.cpp
|
|
||||||
@@ -134,10 +134,8 @@ public:
|
|
||||||
: QString()));
|
|
||||||
|
|
||||||
if (query.lastError().isValid()) {
|
|
||||||
- qDebug() << "Error: " << query.lastError();
|
|
||||||
+ qWarning() << "[Error at ResultSetPrivate::initQuery]: " << query.lastError();
|
|
||||||
}
|
|
||||||
-
|
|
||||||
- Q_ASSERT_X(query.isActive(), "ResultSet initQuery", "Query is not valid");
|
|
||||||
}
|
|
||||||
|
|
||||||
QString agentClause(const QString &agent) const
|
|
||||||
@@ -245,13 +243,13 @@ public:
|
|
||||||
QStringList mimetypeFilter = transformedList(
|
|
||||||
queryDefinition.types(), &ResultSetPrivate::mimetypeClause);
|
|
||||||
|
|
||||||
- auto query = _query;
|
|
||||||
+ auto queryString = _query;
|
|
||||||
|
|
||||||
- query.replace("ORDER_BY_CLAUSE", "ORDER BY $orderingColumn resource ASC")
|
|
||||||
- .replace("LIMIT_CLAUSE", limitOffsetSuffix());
|
|
||||||
+ queryString.replace("ORDER_BY_CLAUSE", "ORDER BY $orderingColumn resource ASC")
|
|
||||||
+ .replace("LIMIT_CLAUSE", limitOffsetSuffix());
|
|
||||||
|
|
||||||
return kamd::utils::debug_and_return(DEBUG_QUERIES, "Query: ",
|
|
||||||
- query
|
|
||||||
+ queryString
|
|
||||||
.replace(QLatin1String("$orderingColumn"), orderingColumn)
|
|
||||||
.replace(QLatin1String("$agentsFilter"), agentsFilter.join(QStringLiteral(" OR ")))
|
|
||||||
.replace(QLatin1String("$activitiesFilter"), activitiesFilter.join(QStringLiteral(" OR ")))
|
|
||||||
@@ -265,7 +263,7 @@ public:
|
|
||||||
// TODO: We need to correct the scores based on the time that passed
|
|
||||||
// since the cache was last updated, although, for this query,
|
|
||||||
// scores are not that important.
|
|
||||||
- static const QString query =
|
|
||||||
+ static const QString queryString =
|
|
||||||
R"sql(
|
|
||||||
SELECT
|
|
||||||
rl.targettedResource as resource
|
|
||||||
@@ -302,14 +300,14 @@ public:
|
|
||||||
)sql"
|
|
||||||
;
|
|
||||||
|
|
||||||
- return query;
|
|
||||||
+ return queryString;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const QString &usedResourcesQuery()
|
|
||||||
{
|
|
||||||
// TODO: We need to correct the scores based on the time that passed
|
|
||||||
// since the cache was last updated
|
|
||||||
- static const QString query =
|
|
||||||
+ static const QString queryString =
|
|
||||||
R"sql(
|
|
||||||
SELECT
|
|
||||||
rsc.targettedResource as resource
|
|
||||||
@@ -341,7 +339,7 @@ public:
|
|
||||||
)sql"
|
|
||||||
;
|
|
||||||
|
|
||||||
- return query;
|
|
||||||
+ return queryString;
|
|
||||||
}
|
|
||||||
|
|
||||||
static const QString &allResourcesQuery()
|
|
||||||
@@ -349,7 +347,7 @@ public:
|
|
||||||
// TODO: We need to correct the scores based on the time that passed
|
|
||||||
// since the cache was last updated, although, for this query,
|
|
||||||
// scores are not that important.
|
|
||||||
- static const QString query =
|
|
||||||
+ static const QString queryString =
|
|
||||||
R"sql(
|
|
||||||
WITH
|
|
||||||
LinkedResourcesResults AS (
|
|
||||||
@@ -431,12 +429,15 @@ public:
|
|
||||||
)sql"
|
|
||||||
;
|
|
||||||
|
|
||||||
- return query;
|
|
||||||
+ return queryString;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResultSet::Result currentResult() const
|
|
||||||
{
|
|
||||||
ResultSet::Result result;
|
|
||||||
+
|
|
||||||
+ if (!database || !query.isActive()) return result;
|
|
||||||
+
|
|
||||||
result.setResource(query.value(QStringLiteral("resource")).toString());
|
|
||||||
result.setTitle(query.value(QStringLiteral("title")).toString());
|
|
||||||
result.setMimetype(query.value(QStringLiteral("mimetype")).toString());
|
|
||||||
@@ -448,19 +449,19 @@ public:
|
|
||||||
result.setLinkStatus(
|
|
||||||
(ResultSet::Result::LinkStatus)query.value(QStringLiteral("linkStatus")).toInt());
|
|
||||||
|
|
||||||
- auto query = database->createQuery();
|
|
||||||
+ auto linkedActivitiesQuery = database->createQuery();
|
|
||||||
|
|
||||||
- query.prepare(R"sql(
|
|
||||||
+ linkedActivitiesQuery.prepare(R"sql(
|
|
||||||
SELECT usedActivity
|
|
||||||
FROM ResourceLink
|
|
||||||
WHERE targettedResource = :resource
|
|
||||||
)sql");
|
|
||||||
|
|
||||||
- query.bindValue(":resource", result.resource());
|
|
||||||
- query.exec();
|
|
||||||
+ linkedActivitiesQuery.bindValue(":resource", result.resource());
|
|
||||||
+ linkedActivitiesQuery.exec();
|
|
||||||
|
|
||||||
QStringList linkedActivities;
|
|
||||||
- for (const auto &item: query) {
|
|
||||||
+ for (const auto &item: linkedActivitiesQuery) {
|
|
||||||
linkedActivities << item[0].toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
@@ -471,7 +472,7 @@ public:
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
-ResultSet::ResultSet(Query query)
|
|
||||||
+ResultSet::ResultSet(Query queryDefinition)
|
|
||||||
: d(new ResultSetPrivate())
|
|
||||||
{
|
|
||||||
using namespace Common;
|
|
||||||
@@ -483,10 +484,9 @@ ResultSet::ResultSet(Query query)
|
|
||||||
"that you do not have the Activity Manager running, or that "
|
|
||||||
"something else is broken on your system. Recent documents and "
|
|
||||||
"alike will not work!";
|
|
||||||
- Q_ASSERT_X((bool)d->database, "ResultSet constructor", "Database is NULL");
|
|
||||||
}
|
|
||||||
|
|
||||||
- d->queryDefinition = query;
|
|
||||||
+ d->queryDefinition = queryDefinition;
|
|
||||||
|
|
||||||
d->initQuery();
|
|
||||||
}
|
|
||||||
@@ -515,7 +515,7 @@ ResultSet::~ResultSet()
|
|
||||||
|
|
||||||
ResultSet::Result ResultSet::at(int index) const
|
|
||||||
{
|
|
||||||
- Q_ASSERT_X(d->query.isActive(), "ResultSet::at", "Query is not active");
|
|
||||||
+ if (!d->query.isActive()) return Result();
|
|
||||||
|
|
||||||
d->query.seek(index);
|
|
||||||
|
|
||||||
diff --git a/src/resultwatcher.cpp b/src/resultwatcher.cpp
|
|
||||||
index 32ffe29..5cf3b4c 100644
|
|
||||||
--- a/src/resultwatcher.cpp
|
|
||||||
+++ b/src/resultwatcher.cpp
|
|
||||||
@@ -159,11 +159,15 @@ public:
|
|
||||||
auto type = kamd::utils::make_lazy_val([&] () -> QString {
|
|
||||||
using Common::Database;
|
|
||||||
|
|
||||||
- auto query
|
|
||||||
+ auto database
|
|
||||||
= Database::instance(Database::ResourcesDatabase,
|
|
||||||
- Database::ReadOnly)
|
|
||||||
- ->execQuery("SELECT mimetype FROM ResourceInfo WHERE "
|
|
||||||
- "targettedResource = '" + resource + "'");
|
|
||||||
+ Database::ReadOnly);
|
|
||||||
+
|
|
||||||
+ if (!database) return QString();
|
|
||||||
+
|
|
||||||
+ auto query
|
|
||||||
+ = database->execQuery("SELECT mimetype FROM ResourceInfo WHERE "
|
|
||||||
+ "targettedResource = '" + resource + "'");
|
|
||||||
|
|
||||||
for (const auto &item : query) {
|
|
||||||
return item[0].toString();
|
|
||||||
--
|
|
||||||
2.14.3
|
|
||||||
|
|
@ -1 +1 @@
|
|||||||
SHA512 (kactivities-stats-5.44.0.tar.xz) = accf92136d9ab9255d3bde0aef93fd9254ed231e907114633c77f634fa5ffe9062b85d7c56e5cd1e16a4747134e01e7621d8d1e43ba837472667df0136984998
|
SHA512 (kactivities-stats-5.45.0.tar.xz) = ac2e12893be75826123e8743ff7b659c5dfb85a8c7deebc03a44d9e686a98753e76202e1f9a61f2fb111c49c3b61e0890220ecf201e47ddca15903fc8bb8e050
|
||||||
|
Loading…
Reference in new issue