1 /*
2  * SPDX-FileCopyrightText: 2013 Daniel Vrátil <dvratil@redhat.com>
3  *
4  * SPDX-License-Identifier: LGPL-2.1-or-later
5  *
6  */
7 
8 #pragma once
9 
10 #include <QFile>
11 #include <QMap>
12 #include <QMutex>
13 #include <QObject>
14 #include <QVariant>
15 #include <QVector>
16 
17 #include <atomic>
18 #include <memory>
19 
20 class QSqlQuery;
21 class QDBusArgument;
22 
23 struct DbConnection {
24     qint64 id;
25     QString name;
26     qint64 start;
27     QString trxName;
28     qint64 transactionStart;
29 };
30 
31 QDBusArgument &operator<<(QDBusArgument &arg, const DbConnection &con);
32 QDBusArgument &operator>>(QDBusArgument &arg, DbConnection &con);
33 
34 namespace Akonadi
35 {
36 namespace Server
37 {
38 class StorageDebugger : public QObject
39 {
40     Q_OBJECT
41 
42 public:
43     static StorageDebugger *instance();
44 
45     ~StorageDebugger() override;
46 
47     void addConnection(qint64 id, const QString &name);
48     void removeConnection(qint64 id);
49     void changeConnection(qint64 id, const QString &name);
50     void addTransaction(qint64 connectionId, const QString &name, uint duration, const QString &error);
51     void removeTransaction(qint64 connectionId, bool commit, uint duration, const QString &error);
52 
53     void enableSQLDebugging(bool enable);
isSQLDebuggingEnabled()54     inline bool isSQLDebuggingEnabled() const
55     {
56         return mEnabled;
57     }
58 
59     void queryExecuted(qint64 connectionId, const QSqlQuery &query, int duration);
60 
incSequence()61     inline void incSequence()
62     {
63         ++mSequence;
64     }
65 
66     void writeToFile(const QString &file);
67 
68     Q_SCRIPTABLE QVector<DbConnection> connections() const;
69 
70 Q_SIGNALS:
71     void connectionOpened(qint64 id, qint64 timestamp, const QString &name);
72     void connectionChanged(qint64 id, const QString &name);
73     void connectionClosed(qint64 id, qint64 timestamp);
74 
75     void transactionStarted(qint64 connectionId, const QString &name, qint64 timestamp, uint duration, const QString &error);
76     void transactionFinished(qint64 connectionId, bool commit, qint64 timestamp, uint duration, const QString &error);
77 
78     void queryExecuted(double sequence,
79                        qint64 connectionId,
80                        qint64 timestamp,
81                        uint duration,
82                        const QString &query,
83                        const QMap<QString, QVariant> &values,
84                        int resultsCount,
85                        const QList<QList<QVariant>> &result,
86                        const QString &error);
87 
88 private:
89     StorageDebugger();
90 
91     static StorageDebugger *mSelf;
92     static QMutex mMutex;
93 
94     std::unique_ptr<QFile> mFile;
95 
96     std::atomic_bool mEnabled = {false};
97     std::atomic_int64_t mSequence = {0};
98     QVector<DbConnection> mConnections;
99 };
100 
101 } // namespace Server
102 } // namespace Akonadi
103 
104