on xenial help sign in
Move AsyncQuery entirely into cpp file
commitaf15c2ac23066e1daa7c3fcaaafc0a3c81dcc665 authorDalton Durst <dalton@ubports.com> dateMon 18 Jan 2021, 11:02 (6 years ago) parentadd6528
2 files changed+178−188
plugins/Utils/windowstatestorage.cpp+177−156 plugins/Utils/windowstatestorage.h+1−32
plugins/Utils/windowstatestorage.cpp+177−156
@@ -28,191 +28,212 @@
2828#include <QRect>
2929#include <unity/shell/application/ApplicationInfoInterface.h>
3030
31−AsyncQuery::AsyncQuery(const QString& dbName):
32− m_dbName(dbName)
33−{
34−}
3531
36−AsyncQuery::~AsyncQuery()
32+class AsyncQuery: public QObject
3733{
38− QSqlDatabase::removeDatabase(m_connectionName);
39−}
34+ Q_OBJECT
4035
41−bool AsyncQuery::initdb()
42−{
43− QSqlDatabase connection = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"), m_connectionName);
44− connection.setDatabaseName(m_dbName);
45− if (!connection.open()) {
46− qWarning() << "Error opening state database " << m_dbName << connection.lastError().driverText() << connection.lastError().databaseText();
47− return false;
36+public:
37+ AsyncQuery(const QString& dbName):
38+ m_dbName(dbName)
39+ {
4840 }
49− QSqlQuery query(connection);
5041
51− if (!connection.tables().contains(QStringLiteral("geometry"))) {
52− QString geometryQuery = QStringLiteral("CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);");
53− if (!query.exec(geometryQuery)) {
54− logSqlError(query);
42+ ~AsyncQuery()
43+ {
44+ QSqlDatabase::removeDatabase(m_connectionName);
45+ }
46+
47+ Q_PROPERTY (const QString dbName READ getDbName)
48+
49+ Q_INVOKABLE const QString getDbName()
50+ {
51+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
52+ return connection.databaseName();
53+ }
54+
55+ Q_INVOKABLE bool initdb()
56+ {
57+ QSqlDatabase connection = QSqlDatabase::addDatabase(QStringLiteral("QSQLITE"), m_connectionName);
58+ connection.setDatabaseName(m_dbName);
59+ if (!connection.open()) {
60+ qWarning() << "Error opening state database " << m_dbName << connection.lastError().driverText() << connection.lastError().databaseText();
5561 return false;
5662 }
63+ QSqlQuery query(connection);
64+
65+ if (!connection.tables().contains(QStringLiteral("geometry"))) {
66+ QString geometryQuery = QStringLiteral("CREATE TABLE geometry(windowId TEXT UNIQUE, x INTEGER, y INTEGER, width INTEGER, height INTEGER);");
67+ if (!query.exec(geometryQuery)) {
68+ logSqlError(query);
69+ return false;
70+ }
71+ }
72+
73+ if (!connection.tables().contains(QStringLiteral("state"))) {
74+ QString stateQuery = QStringLiteral("CREATE TABLE state(windowId TEXT UNIQUE, state INTEGER);");
75+ if (!query.exec(stateQuery)) {
76+ logSqlError(query);
77+ return false;
78+ }
79+ }
80+
81+ if (!connection.tables().contains(QStringLiteral("stage"))) {
82+ QString stageQuery = QStringLiteral("CREATE TABLE stage(appId TEXT UNIQUE, stage INTEGER);");
83+ if (!query.exec(stageQuery)) {
84+ logSqlError(query);
85+ return false;
86+ }
87+ }
88+ return true;
5789 }
5890
59− if (!connection.tables().contains(QStringLiteral("state"))) {
60− QString stateQuery = QStringLiteral("CREATE TABLE state(windowId TEXT UNIQUE, state INTEGER);");
61− if (!query.exec(stateQuery)) {
91+ Q_INVOKABLE int getState(const QString &windowId) const
92+ {
93+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
94+ QSqlQuery query(connection);
95+ query.prepare(m_getStateQuery);
96+ query.bindValue(":windowId", windowId);
97+ query.exec();
98+ if (!query.isActive() || !query.isSelect()) {
6299 logSqlError(query);
63− return false;
100+ return -1;
101+ }
102+ if (!query.first()) {
103+ return -1;
104+ }
105+ bool converted = false;
106+ QVariant resultStr = query.value(0);
107+ int result = resultStr.toInt(&converted);
108+ if (converted) {
109+ return result;
110+ } else {
111+ qWarning() << "getState result expected integer, got " << resultStr;
112+ return -1;
64113 }
65114 }
66115
67− if (!connection.tables().contains(QStringLiteral("stage"))) {
68− QString stageQuery = QStringLiteral("CREATE TABLE stage(appId TEXT UNIQUE, stage INTEGER);");
69− if (!query.exec(stageQuery)) {
116+ Q_INVOKABLE QRect getGeometry(const QString &windowId) const
117+ {
118+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
119+ QSqlQuery query(connection);
120+ query.prepare(m_getGeometryQuery);
121+ query.bindValue(":windowId", windowId);
122+ query.exec();
123+ if (!query.isActive() || !query.isSelect()) {
70124 logSqlError(query);
71− return false;
125+ return QRect();
72126 }
73− }
74− return true;
75−}
76127
77−void AsyncQuery::saveState(const QString &windowId, int state)
78−{
79− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
80− QSqlQuery query(connection);
81− query.prepare(m_saveStateQuery);
82− query.bindValue(":windowId", windowId);
83− query.bindValue(":state", state);
84− if (!query.exec()) {
85− logSqlError(query);
86− }
87−}
128+ if (!query.first()) {
129+ return QRect();
130+ }
88131
89−int AsyncQuery::getState(const QString &windowId) const
90−{
91− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
92− QSqlQuery query(connection);
93− query.prepare(m_getStateQuery);
94− query.bindValue(":windowId", windowId);
95− query.exec();
96− if (!query.isActive() || !query.isSelect()) {
97− logSqlError(query);
98− return -1;
99− }
100− if (!query.first()) {
101− return -1;
102− }
103− bool converted = false;
104− QVariant resultStr = query.value(0);
105− int result = resultStr.toInt(&converted);
106− if (converted) {
107− return result;
108− } else {
109− qWarning() << "getState result expected integer, got " << resultStr;
110− return -1;
111− }
112−}
132+ bool xConverted, yConverted, widthConverted, heightConverted = false;
133+ int x, y, width, height;
134+ QVariant xResultStr = query.value(QStringLiteral("x"));
135+ QVariant yResultStr = query.value(QStringLiteral("y"));
136+ QVariant widthResultStr = query.value(QStringLiteral("width"));
137+ QVariant heightResultStr = query.value(QStringLiteral("height"));
138+ x = xResultStr.toInt(&xConverted);
139+ y = yResultStr.toInt(&yConverted);
140+ width = widthResultStr.toInt(&widthConverted);
141+ height = heightResultStr.toInt(&heightConverted);
142+
143+ if (xConverted && yConverted && widthConverted && heightConverted) {
144+ return QRect(x, y, width, height);
145+ } else {
146+ qWarning() << "getGeometry result expected integers, got x:"
147+ << xResultStr << "y:" << yResultStr << "width" << widthResultStr
148+ << "height:" << heightResultStr;
149+ return QRect();
150+ }
113151
114−void AsyncQuery::saveGeometry(const QString &windowId, const QRect &rect)
115−{
116− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
117− QSqlQuery query(connection);
118− query.prepare(m_saveGeometryQuery);
119− query.bindValue(":windowId", windowId);
120− query.bindValue(":x", rect.x());
121− query.bindValue(":y", rect.y());
122− query.bindValue(":width", rect.width());
123− query.bindValue(":height", rect.height());
124− if (!query.exec()) {
125− logSqlError(query);
126152 }
127−}
128153
129−QRect AsyncQuery::getGeometry(const QString &windowId) const
130−{
131− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
132− QSqlQuery query(connection);
133− query.prepare(m_getGeometryQuery);
134− query.bindValue(":windowId", windowId);
135− query.exec();
136− if (!query.isActive() || !query.isSelect()) {
137− logSqlError(query);
138− return QRect();
154+ Q_INVOKABLE int getStage(const QString &appId) const
155+ {
156+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
157+ QSqlQuery query(connection);
158+ query.prepare(m_getStageQuery);
159+ query.bindValue(":appId", appId);
160+ query.exec();
161+ if (!query.isActive() || !query.isSelect()) {
162+ logSqlError(query);
163+ return -1;
164+ }
165+ if (!query.first()) {
166+ return -1;
167+ }
168+ bool converted = false;
169+ QVariant resultStr = query.value(0);
170+ int result = resultStr.toInt(&converted);
171+ if (converted) {
172+ return result;
173+ } else {
174+ qWarning() << "getStage result expected integer, got " << resultStr;
175+ return -1;
176+ }
139177 }
140178
141− if (!query.first()) {
142− return QRect();
143− }
179+public Q_SLOTS:
144180
145− bool xConverted, yConverted, widthConverted, heightConverted = false;
146− int x, y, width, height;
147− QVariant xResultStr = query.value(QStringLiteral("x"));
148− QVariant yResultStr = query.value(QStringLiteral("y"));
149− QVariant widthResultStr = query.value(QStringLiteral("width"));
150− QVariant heightResultStr = query.value(QStringLiteral("height"));
151− x = xResultStr.toInt(&xConverted);
152− y = yResultStr.toInt(&yConverted);
153− width = widthResultStr.toInt(&widthConverted);
154− height = heightResultStr.toInt(&heightConverted);
155−
156− if (xConverted && yConverted && widthConverted && heightConverted) {
157− return QRect(x, y, width, height);
158− } else {
159− qWarning() << "getGeometry result expected integers, got x:"
160− << xResultStr << "y:" << yResultStr << "width" << widthResultStr
161− << "height:" << heightResultStr;
162− return QRect();
181+ void saveState(const QString &windowId, int state)
182+ {
183+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
184+ QSqlQuery query(connection);
185+ query.prepare(m_saveStateQuery);
186+ query.bindValue(":windowId", windowId);
187+ query.bindValue(":state", state);
188+ if (!query.exec()) {
189+ logSqlError(query);
190+ }
163191 }
164192
165−}
166−
167−void AsyncQuery::saveStage(const QString &appId, int stage)
168−{
169− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
170− QSqlQuery query(connection);
171− query.prepare(m_saveStageQuery);
172− query.bindValue(":appId", appId);
173− query.bindValue(":stage", stage);
174− if (!query.exec()) {
175− logSqlError(query);
193+ void saveGeometry(const QString &windowId, const QRect &rect)
194+ {
195+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
196+ QSqlQuery query(connection);
197+ query.prepare(m_saveGeometryQuery);
198+ query.bindValue(":windowId", windowId);
199+ query.bindValue(":x", rect.x());
200+ query.bindValue(":y", rect.y());
201+ query.bindValue(":width", rect.width());
202+ query.bindValue(":height", rect.height());
203+ if (!query.exec()) {
204+ logSqlError(query);
205+ }
176206 }
177−}
178207
179−int AsyncQuery::getStage(const QString &appId) const
180−{
181− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
182− QSqlQuery query(connection);
183− query.prepare(m_getStageQuery);
184− query.bindValue(":appId", appId);
185− query.exec();
186− if (!query.isActive() || !query.isSelect()) {
187− logSqlError(query);
188− return -1;
189− }
190− if (!query.first()) {
191− return -1;
192− }
193− bool converted = false;
194− QVariant resultStr = query.value(0);
195− int result = resultStr.toInt(&converted);
196− if (converted) {
197− return result;
198− } else {
199− qWarning() << "getStage result expected integer, got " << resultStr;
200− return -1;
208+ void saveStage(const QString &appId, int stage)
209+ {
210+ QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
211+ QSqlQuery query(connection);
212+ query.prepare(m_saveStageQuery);
213+ query.bindValue(":appId", appId);
214+ query.bindValue(":stage", stage);
215+ if (!query.exec()) {
216+ logSqlError(query);
217+ }
201218 }
202−}
203−
204−void AsyncQuery::logSqlError(const QSqlQuery query) const
205−{
206− qWarning() << "Error executing query" << query.lastQuery()
207− << "Driver error:" << query.lastError().driverText()
208− << "Database error:" << query.lastError().databaseText();
209−}
210219
211−const QString AsyncQuery::getDbName()
212−{
213− QSqlDatabase connection = QSqlDatabase::database(m_connectionName);
214− return connection.databaseName();
215−}
220+private:
221+ const QString m_connectionName = QStringLiteral("WindowStateStorage");
222+ const QString m_getStateQuery = QStringLiteral("SELECT state FROM state WHERE windowId = :windowId");
223+ const QString m_saveStateQuery = QStringLiteral("INSERT OR REPLACE INTO state (windowId, state) values (:windowId, :state)");
224+ const QString m_getGeometryQuery = QStringLiteral("SELECT * FROM geometry WHERE windowId = :windowId");
225+ const QString m_saveGeometryQuery = QStringLiteral("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values (:windowId, :x, :y, :width, :height)");
226+ const QString m_getStageQuery = QStringLiteral("SELECT stage FROM stage WHERE appId = :appId");
227+ const QString m_saveStageQuery = QStringLiteral("INSERT OR REPLACE INTO stage (appId, stage) values (:appId, :stage)");
228+ QString m_dbName;
229+
230+ void logSqlError(const QSqlQuery query) const
231+ {
232+ qWarning() << "Error executing query" << query.lastQuery()
233+ << "Driver error:" << query.lastError().driverText()
234+ << "Database error:" << query.lastError().databaseText();
235+ }
236+};
216237
217238WindowStateStorage::WindowStateStorage(const QString& dbName, QObject *parent):
218239 QObject(parent),
plugins/Utils/windowstatestorage.h+1−32
@@ -25,38 +25,7 @@
2525// unity-api
2626#include <unity/shell/application/Mir.h>
2727
28−class AsyncQuery: public QObject
29−{
30− Q_OBJECT
31−
32−public:
33− AsyncQuery(const QString& dbName);
34− ~AsyncQuery();
35−
36− Q_PROPERTY (const QString dbName READ getDbName)
37−
38− Q_INVOKABLE const QString getDbName();
39− Q_INVOKABLE bool initdb();
40− Q_INVOKABLE int getState(const QString &windowId) const;
41− Q_INVOKABLE QRect getGeometry(const QString &windowId) const;
42− Q_INVOKABLE int getStage(const QString &appId) const;
43−
44−public Q_SLOTS:
45− void saveState(const QString &windowId, int state);
46− void saveGeometry(const QString &windowId, const QRect &rect);
47− void saveStage(const QString &appId, int stage);
48−
49−private:
50− const QString m_connectionName = QStringLiteral("WindowStateStorage");
51− const QString m_getStateQuery = QStringLiteral("SELECT state FROM state WHERE windowId = :windowId");
52− const QString m_saveStateQuery = QStringLiteral("INSERT OR REPLACE INTO state (windowId, state) values (:windowId, :state)");
53− const QString m_getGeometryQuery = QStringLiteral("SELECT * FROM geometry WHERE windowId = :windowId");
54− const QString m_saveGeometryQuery = QStringLiteral("INSERT OR REPLACE INTO geometry (windowId, x, y, width, height) values (:windowId, :x, :y, :width, :height)");
55− const QString m_getStageQuery = QStringLiteral("SELECT stage FROM stage WHERE appId = :appId");
56− const QString m_saveStageQuery = QStringLiteral("INSERT OR REPLACE INTO stage (appId, stage) values (:appId, :stage)");
57− void logSqlError(const QSqlQuery) const;
58− QString m_dbName;
59−};
28+class AsyncQuery;
6029
6130class WindowStateStorage: public QObject
6231{