PlasmaActivitiesStats

Database.h
1/*
2 SPDX-FileCopyrightText: 2014 Ivan Cukic <ivan.cukic@kde.org>
3
4 SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
5*/
6
7#ifndef COMMON_DATABASE_H
8#define COMMON_DATABASE_H
9
10#include <QRegularExpression>
11#include <QSqlQuery>
12#include <memory>
13
14namespace Common
15{
16class Database
17{
18public:
19 typedef std::shared_ptr<Database> Ptr;
20
21 enum Source {
22 ResourcesDatabase,
23 };
24
25 enum OpenMode {
26 ReadWrite,
27 ReadOnly,
28 };
29
30 static Ptr instance(Source source, OpenMode openMode);
31
32 QSqlQuery execQueries(const QStringList &queries) const;
33 QSqlQuery execQuery(const QString &query) const;
34 QSqlQuery createQuery() const;
35
36 void setPragma(const QString &pragma);
37 QVariant pragma(const QString &pragma) const;
38 QVariant value(const QString &query) const;
39
40 ~Database();
41 Database();
42
43 friend class Locker;
44 class Locker
45 {
46 public:
47 Locker(Database &database);
48 ~Locker();
49
50 private:
51 QSqlDatabase &m_database;
52 };
53
54#define DATABASE_TRANSACTION(A) \
55 /* enable this for debugging only: qDebug() << "Location:" << __FILE__ << __LINE__; */ \
56 Common::Database::Locker lock(A)
57
58private:
59 class Private;
60 std::unique_ptr<Private> d;
61};
62
63template<typename EscapeFunction>
64QString parseStarPattern(const QString &pattern, const QString &joker, EscapeFunction escape)
65{
66 const auto begin = pattern.constBegin();
67 const auto end = pattern.constEnd();
68
69 auto currentStart = pattern.constBegin();
70 auto currentPosition = pattern.constBegin();
71
72 bool isEscaped = false;
73
74 // This should be available in the QString class...
75 auto stringFromIterators = [&](const QString::const_iterator &currentStart, const QString::const_iterator &currentPosition) {
76 return pattern.mid(std::distance(begin, currentStart), std::distance(currentStart, currentPosition));
77 };
78
79 // Escaping % and _ for sql like
80 // auto escape = [] (QString str) {
81 // return str.replace("%", "\\%").replace("_", "\\_");
82 // };
83
84 QString resultPattern;
85 resultPattern.reserve(pattern.size() * 1.5);
86
87 for (; currentPosition != end; ++currentPosition) {
88 if (isEscaped) {
89 // Just skip the current character
90 isEscaped = false;
91
92 } else if (*currentPosition == QLatin1Char('\\')) {
93 // Skip two characters
94 isEscaped = true;
95
96 } else if (*currentPosition == QLatin1Char('*')) {
97 // Replacing the star with the sql like joker - %
98 resultPattern.append(escape(stringFromIterators(currentStart, currentPosition)) + joker);
99 currentStart = currentPosition + 1;
100
101 } else {
102 // This one is boring, nothing to do
103 }
104 }
105
106 if (currentStart != currentPosition) {
107 resultPattern.append(escape(stringFromIterators(currentStart, currentPosition)));
108 }
109
110 return resultPattern;
111}
112
113inline QString escapeSqliteLikePattern(QString pattern)
114{
115 return pattern.replace(QLatin1String("%"), QLatin1String("\\%"))
116 .replace(QLatin1String("_"), QLatin1String("\\_"))
117 .replace(QLatin1String("'"), QLatin1String("\\'"));
118}
119
120inline QString starPatternToLike(const QString &pattern)
121{
122 return parseStarPattern(pattern, QStringLiteral("%"), escapeSqliteLikePattern);
123}
124
125inline QRegularExpression starPatternToRegex(const QString &pattern)
126{
127 const QString parsed = parseStarPattern(pattern, QStringLiteral(".*"), QOverload<const QString &>::of(&QRegularExpression::escape));
128 return QRegularExpression(QRegularExpression::anchoredPattern(parsed));
129}
130
131} // namespace Common
132
133#endif // COMMON_DATABASE_H
QAction * end(const QObject *recvr, const char *slot, QObject *parent)
const QList< QKeySequence > & begin()
QString anchoredPattern(QStringView expression)
QString escape(QStringView str)
QString & append(QChar ch)
const_iterator constBegin() const const
const_iterator constEnd() const const
typedef const_iterator
QString mid(qsizetype position, qsizetype n) const const
QString & replace(QChar before, QChar after, Qt::CaseSensitivity cs)
void reserve(qsizetype size)
qsizetype size() const const
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Apr 11 2025 11:48:19 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.