Skip to content

Commit da6fdea

Browse files
committed
Use std::optional to check for receivers
1 parent 347cd82 commit da6fdea

6 files changed

Lines changed: 68 additions & 59 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# SPDX-License-Identifier: MIT
33

44
cmake_minimum_required(VERSION 3.26)
5-
project(libasql VERSION 0.101.0 LANGUAGES CXX)
5+
project(libasql VERSION 0.102.0 LANGUAGES CXX)
66

77
include(GNUInstallDirs)
88
include(GenerateExportHeader)

src/ADriverSqlite.cpp

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ ADriverSqlite::ADriverSqlite(const QString &connInfo)
2727
QMutexLocker _(&m_worker.m_promisesMutex);
2828
while (!m_worker.m_promisesReady.isEmpty()) {
2929
QueryPromise promise = m_worker.m_promisesReady.dequeue();
30-
if (!promise.checkReceiver || !promise.receiver.isNull()) {
30+
if (!promise.receiver.has_value() || !promise.receiver->isNull()) {
3131
if (promise.cb) {
3232
AResult result{promise.result};
3333
promise.cb(result);
@@ -82,19 +82,21 @@ void ADriverSqlite::open(const std::shared_ptr<ADriver> &driver,
8282
selfDriver = driver;
8383

8484
OpenPromise promise{
85-
.cb = cb,
86-
.receiver = receiver,
87-
.checkReceiver = static_cast<bool>(receiver),
85+
.cb = cb,
8886
};
8987

88+
if (receiver) {
89+
promise.receiver = receiver;
90+
}
91+
9092
connect(&m_worker, &ASqliteThread::openned, this, [this, promise](bool isOpen, QString error) {
9193
if (isOpen) {
9294
setState(ADatabase::State::Connected, {});
9395
} else {
9496
setState(ADatabase::State::Disconnected, error);
9597
}
9698

97-
if (!promise.checkReceiver || !promise.receiver.isNull()) {
99+
if (!promise.receiver.has_value() || !promise.receiver->isNull()) {
98100
if (promise.cb) {
99101
promise.cb(isOpen, error);
100102
}
@@ -124,7 +126,8 @@ bool ADriverSqlite::isOpen() const
124126
void ADriverSqlite::setState(ADatabase::State state, const QString &status)
125127
{
126128
m_state = state;
127-
if (m_stateChangedCb && (!m_stateChangedReceiverSet || !m_stateChangedReceiver.isNull())) {
129+
if (m_stateChangedCb &&
130+
(!m_stateChangedReceiver.has_value() || !m_stateChangedReceiver->isNull())) {
128131
m_stateChangedCb(state, status);
129132
}
130133
}
@@ -137,9 +140,10 @@ ADatabase::State ADriverSqlite::state() const
137140
void ADriverSqlite::onStateChanged(QObject *receiver,
138141
std::function<void(ADatabase::State, const QString &)> cb)
139142
{
140-
m_stateChangedCb = cb;
141-
m_stateChangedReceiver = receiver;
142-
m_stateChangedReceiverSet = receiver;
143+
m_stateChangedCb = cb;
144+
if (receiver) {
145+
m_stateChangedReceiver = receiver;
146+
}
143147
}
144148

145149
void ADriverSqlite::begin(const std::shared_ptr<ADriver> &db, QObject *receiver, AResultFn cb)
@@ -166,11 +170,12 @@ void ADriverSqlite::exec(const std::shared_ptr<ADriver> &db,
166170
selfDriver = db;
167171

168172
QueryPromise data{
169-
.cb = cb,
170-
.result = std::make_shared<AResultSqlite>(),
171-
.receiver = receiver,
172-
.checkReceiver = static_cast<bool>(receiver),
173+
.cb = cb,
174+
.result = std::make_shared<AResultSqlite>(),
173175
};
176+
if (receiver) {
177+
data.receiver = receiver;
178+
}
174179
data.result->m_query.setRawData(query.data(), query.size());
175180

176181
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
@@ -191,11 +196,12 @@ void ADriverSqlite::exec(const std::shared_ptr<ADriver> &db,
191196
selfDriver = db;
192197

193198
QueryPromise data{
194-
.cb = cb,
195-
.result = std::make_shared<AResultSqlite>(),
196-
.receiver = receiver,
197-
.checkReceiver = static_cast<bool>(receiver),
199+
.cb = cb,
200+
.result = std::make_shared<AResultSqlite>(),
198201
};
202+
if (receiver) {
203+
data.receiver = receiver;
204+
}
199205
data.result->m_query = query.toUtf8();
200206

201207
#if QT_VERSION >= QT_VERSION_CHECK(6, 7, 0)
@@ -217,11 +223,12 @@ void ADriverSqlite::exec(const std::shared_ptr<ADriver> &db,
217223
selfDriver = db;
218224

219225
QueryPromise data{
220-
.cb = cb,
221-
.result = std::make_shared<AResultSqlite>(),
222-
.receiver = receiver,
223-
.checkReceiver = static_cast<bool>(receiver),
226+
.cb = cb,
227+
.result = std::make_shared<AResultSqlite>(),
224228
};
229+
if (receiver) {
230+
data.receiver = receiver;
231+
}
225232
data.result->m_query.setRawData(query.data(), query.size());
226233
data.result->m_queryArgs = params;
227234

@@ -244,11 +251,12 @@ void ADriverSqlite::exec(const std::shared_ptr<ADriver> &db,
244251
selfDriver = db;
245252

246253
QueryPromise data{
247-
.cb = cb,
248-
.result = std::make_shared<AResultSqlite>(),
249-
.receiver = receiver,
250-
.checkReceiver = static_cast<bool>(receiver),
254+
.cb = cb,
255+
.result = std::make_shared<AResultSqlite>(),
251256
};
257+
if (receiver) {
258+
data.receiver = receiver;
259+
}
252260
data.result->m_query = query.toUtf8();
253261
data.result->m_queryArgs = params;
254262

@@ -274,9 +282,10 @@ void ADriverSqlite::exec(const std::shared_ptr<ADriver> &db,
274282
.preparedQuery = query,
275283
.cb = cb,
276284
.result = std::make_shared<AResultSqlite>(),
277-
.receiver = receiver,
278-
.checkReceiver = static_cast<bool>(receiver),
279285
};
286+
if (receiver) {
287+
data.receiver = receiver;
288+
}
280289
data.result->m_query = query.query();
281290
data.result->m_queryArgs = params;
282291

src/ADriverSqlite.hpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,14 @@ class AResultSqlite final : public AResultPrivate
6868

6969
struct OpenPromise {
7070
ADatabaseOpenFn cb;
71-
QPointer<QObject> receiver;
72-
bool checkReceiver;
71+
std::optional<QPointer<QObject>> receiver;
7372
};
7473

7574
struct QueryPromise {
7675
std::optional<APreparedQuery> preparedQuery;
7776
AResultFn cb;
7877
std::shared_ptr<AResultSqlite> result;
79-
QPointer<QObject> receiver;
80-
bool checkReceiver;
78+
std::optional<QPointer<QObject>> receiver;
8179
};
8280

8381
class ASqliteThread final : public QThread
@@ -191,18 +189,17 @@ class ADriverSqlite final : public ADriver
191189
const QString &name) override;
192190

193191
private:
194-
QPointer<QObject> m_stateChangedReceiver;
192+
std::optional<QPointer<QObject>> m_stateChangedReceiver;
195193
std::function<void(ADatabase::State, const QString &)> m_stateChangedCb;
196194
std::shared_ptr<ADriver> selfDriver;
197195
ASqliteThread m_worker;
198196
QThread m_thread;
199-
ADatabase::State m_state = ADatabase::State::Disconnected;
200-
int m_pipelineSync = 0;
201-
int m_queueSize = 0;
202-
bool m_stateChangedReceiverSet = false;
203-
bool m_flush = false;
204-
bool m_queryRunning = false;
205-
bool m_notificationPtrSet = false;
197+
ADatabase::State m_state = ADatabase::State::Disconnected;
198+
int m_pipelineSync = 0;
199+
int m_queueSize = 0;
200+
bool m_flush = false;
201+
bool m_queryRunning = false;
202+
bool m_notificationPtrSet = false;
206203
};
207204

208205
} // namespace ASql

src/adriverpg.cpp

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -158,11 +158,12 @@ void ADriverPg::open(const std::shared_ptr<ADriver> &driver, QObject *receiver,
158158
qDebug(ASQL_PG) << "Open" << connectionInfo();
159159
m_conn = std::make_unique<APgConn>(connectionInfo());
160160
if (m_conn->conn()) {
161-
m_openCaller = std::make_unique<OpenCaller>();
162-
m_openCaller->driver = driver;
163-
m_openCaller->cb = cb;
164-
m_openCaller->receiverPtr = receiver;
165-
m_openCaller->checkReceiver = static_cast<bool>(receiver);
161+
m_openCaller = std::make_unique<OpenCaller>();
162+
m_openCaller->driver = driver;
163+
m_openCaller->cb = cb;
164+
if (receiver) {
165+
m_openCaller->receiverPtr = receiver;
166+
}
166167

167168
const auto socket = m_conn->socket();
168169
if (socket > 0) {
@@ -383,7 +384,8 @@ bool ADriverPg::isOpen() const
383384
void ADriverPg::setState(ADatabase::State state, const QString &status)
384385
{
385386
m_state = state;
386-
if (m_stateChangedCb && (!m_stateChangedReceiverSet || !m_stateChangedReceiver.isNull())) {
387+
if (m_stateChangedCb &&
388+
(!m_stateChangedReceiver.has_value() || !m_stateChangedReceiver->isNull())) {
387389
m_stateChangedCb(state, status);
388390
}
389391
}
@@ -396,9 +398,10 @@ ADatabase::State ADriverPg::state() const
396398
void ADriverPg::onStateChanged(QObject *receiver,
397399
std::function<void(ADatabase::State, const QString &)> cb)
398400
{
399-
m_stateChangedCb = cb;
400-
m_stateChangedReceiver = receiver;
401-
m_stateChangedReceiverSet = receiver;
401+
m_stateChangedCb = cb;
402+
if (receiver) {
403+
m_stateChangedReceiver = receiver;
404+
}
402405
}
403406

404407
void ADriverPg::begin(const std::shared_ptr<ADriver> &db, QObject *receiver, AResultFn cb)

src/adriverpg.h

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -216,19 +216,18 @@ class ADriverPg final : public ADriver
216216
struct OpenCaller {
217217
std::shared_ptr<ADriver> driver;
218218
ADatabaseOpenFn cb;
219-
QPointer<QObject> receiverPtr;
220-
bool checkReceiver = false;
219+
std::optional<QPointer<QObject>> receiverPtr;
221220

222221
void emit(bool isOpen, const QString &error)
223222
{
224-
if (cb && (!checkReceiver || !receiverPtr.isNull())) {
223+
if (cb && (!receiverPtr.has_value() || !receiverPtr->isNull())) {
225224
cb(isOpen, error);
226225
}
227226
}
228227
};
229228
std::unique_ptr<OpenCaller> m_openCaller;
230229

231-
QPointer<QObject> m_stateChangedReceiver;
230+
std::optional<QPointer<QObject>> m_stateChangedReceiver;
232231
std::function<void(ADatabase::State, const QString &)> m_stateChangedCb;
233232
QHash<QString, ANotificationFn> m_subscribedNotifications;
234233
std::queue<APGQuery> m_queuedQueries;
@@ -238,12 +237,11 @@ class ADriverPg final : public ADriver
238237
std::unique_ptr<QSocketNotifier> m_readNotify;
239238
std::unique_ptr<QTimer> m_autoSyncTimer;
240239
std::unique_ptr<APgConn> m_conn;
241-
ADatabase::State m_state = ADatabase::State::Disconnected;
242-
int m_pipelineSync = 0;
243-
bool m_stateChangedReceiverSet = false;
244-
bool m_flush = false;
245-
bool m_queryRunning = false;
246-
bool m_notificationPtrSet = false;
240+
ADatabase::State m_state = ADatabase::State::Disconnected;
241+
int m_pipelineSync = 0;
242+
bool m_flush = false;
243+
bool m_queryRunning = false;
244+
bool m_notificationPtrSet = false;
247245
};
248246

249247
} // namespace ASql

tests/sqlite_tst.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,10 @@ void TestSqlite::cleanupTest()
5353

5454
void TestSqlite::testQueries()
5555
{
56+
5657
QEventLoop loop;
5758
{
59+
// CP.51 this only works because qScopeGuard increases the finished ref count.
5860
auto finished = std::make_shared<QObject>();
5961
connect(finished.get(), &QObject::destroyed, &loop, &QEventLoop::quit);
6062

0 commit comments

Comments
 (0)