9#include <common/database/schema/ResourcesDatabaseSchema.h>
12#include <QSqlDatabase>
21#include "plasma-activities-stats-logsettings.h"
27std::mutex databases_mutex;
31 Database::OpenMode openMode;
34bool operator<(
const DatabaseInfo &left,
const DatabaseInfo &right)
39std::map<DatabaseInfo, std::weak_ptr<Database>> databases;
42class QSqlDatabaseWrapper
45 QSqlDatabase m_database;
47 QString m_connectionName;
50 QSqlDatabaseWrapper(
const DatabaseInfo &info)
53 m_connectionName = QStringLiteral(
"kactivities_db_resources_")
57 + (info.openMode == Database::ReadOnly ? QStringLiteral(
"_readonly") : QStringLiteral(
"_readwrite"));
60 : QSqlDatabase::addDatabase(QStringLiteral(
"QSQLITE"), m_connectionName);
62 if (info.openMode == Database::ReadOnly) {
63 m_database.setConnectOptions(QStringLiteral(
"QSQLITE_OPEN_READONLY"));
67 m_database.setDatabaseName(ResourcesDatabaseSchema::path());
69 m_open = m_database.open();
72 qCWarning(PLASMA_ACTIVITIES_STATS_LOG) <<
"PlasmaActivities: Database is not open: " << m_database.connectionName() << m_database.databaseName()
73 << m_database.lastError();
75 if (info.openMode == Database::ReadWrite) {
76 qFatal(
"PlasmaActivities: Opening the database in RW mode should always succeed");
81 ~QSqlDatabaseWrapper()
83 qCDebug(PLASMA_ACTIVITIES_STATS_LOG) <<
"Closing SQL connection: " << m_connectionName;
96 QString connectionName()
const
98 return m_connectionName;
102class Database::Private
109 QSqlQuery query(
const QString &query)
111 return database ? QSqlQuery(query, database->get()) : QSqlQuery();
116 return database ? QSqlQuery(database->get()) : QSqlQuery();
119 std::unique_ptr<QSqlDatabaseWrapper> database;
122Database::Locker::Locker(Database &database)
123 : m_database(database.d->database->
get())
128Database::Locker::~Locker()
133Database::Ptr Database::instance(Source source, OpenMode openMode)
137 std::lock_guard<std::mutex> lock(databases_mutex);
142 info.openMode = openMode;
145 auto search = databases.find(info);
146 if (search != databases.end()) {
147 auto ptr = search->second.lock();
155 auto ptr = std::make_shared<Database>();
157 ptr->d->database = std::make_unique<QSqlDatabaseWrapper>(info);
159 if (!ptr->d->database->isOpen()) {
163 databases[info] = ptr;
165 if (info.openMode == ReadOnly) {
167 ptr->setPragma(QStringLiteral(
"query_only = 1"));
170 ptr->setPragma(QStringLiteral(
"synchronous = 0"));
174 ptr->setPragma(QStringLiteral(
"synchronous = 1"));
178 auto walResult = ptr->pragma(QStringLiteral(
"journal_mode = WAL"));
181 qCWarning(PLASMA_ACTIVITIES_STATS_LOG) <<
"PlasmaActivities: Database can not be opened in WAL mode. Check the "
182 "SQLite version (required >3.7.0). And whether your filesystem "
183 "supports shared memory";
190 ptr->setPragma(QStringLiteral(
"wal_autocheckpoint = 100"));
192 qCDebug(PLASMA_ACTIVITIES_STATS_LOG) <<
"PlasmaActivities: Database connection: " << ptr->d->database->connectionName()
193 <<
"\n query_only: " << ptr->pragma(QStringLiteral(
"query_only"))
194 <<
"\n journal_mode: " << ptr->pragma(QStringLiteral(
"journal_mode"))
195 <<
"\n wal_autocheckpoint: " << ptr->pragma(QStringLiteral(
"wal_autocheckpoint"))
196 <<
"\n synchronous: " << ptr->pragma(QStringLiteral(
"synchronous"));
202 : d(new Database::Private())
217 return d->query(query);
224 for (
const auto &query : queries) {
225 result = execQuery(query);
231void Database::setPragma(
const QString &pragma)
233 execQuery(QStringLiteral(
"PRAGMA ") + pragma);
238 return value(QStringLiteral(
"PRAGMA ") + pragma);
243 auto result = execQuery(query);
KIOCORE_EXPORT TransferJob * get(const QUrl &url, LoadType reload=NoReload, JobFlags flags=DefaultFlags)
bool operator<(const PosRange< Trait > &l, const PosRange< Trait > &r)
bool contains(const QString &connectionName)
QSqlDatabase database(const QString &connectionName, bool open)
QVariant value(const QString &name) const const
QString number(double n, char format, int precision)
QTextStream & left(QTextStream &stream)
QTextStream & right(QTextStream &stream)
Qt::HANDLE currentThreadId()