20#include <QApplication>
21#include <QThreadStorage>
22#include <QFutureWatcher>
23#include <QtConcurrent/QtConcurrentRun>
48 m_boundValues.append(
value);
58 return m_lastInsertId;
63 return m_numRowsAffected;
80 const QString query = m_query;
82 const QVector<QVariant> boundValues = m_boundValues;
83 m_boundValues.clear();
85 auto watcher =
new QFutureWatcher<Result>(
this);
86 connect(watcher, &QFutureWatcher<Result>::finished,
this, [=]() {
88 const auto result = watcher->result();
89 m_error = result.error;
90 m_lastInsertId = result.lastInsertId;
91 m_numRowsAffected = result.numRowsAffected;
92 m_records = result.records;
96 watcher->setFuture(QtConcurrent::run([=]() {
99 for (
const QVariant &
value : boundValues) {
100 q.addBindValue(
value);
104 res.error = q.lastError();
105 res.lastInsertId = q.lastInsertId();
106 res.numRowsAffected = q.numRowsAffected();
108 res.records.append(q.record());
125 if (QThread::currentThread() == qApp->thread()) {
126 return QSqlDatabase::database();
130 const QString threadStr = QStringLiteral(
"Falkon/%1").arg((quintptr) QThread::currentThread());
131 QSqlDatabase::removeDatabase(threadStr);
132 QSqlDatabase db = QSqlDatabase::addDatabase(
QSL(
"QSQLITE"), threadStr);
133 db.setDatabaseName(m_databaseName);
134 db.setConnectOptions(m_connectOptions);
144 m_databaseName =
database.databaseName();
145 m_connectOptions =
database.connectOptions();
151 return qz_sql_database();
SqlDatabase(QObject *parent=nullptr)
static SqlDatabase * instance()
void setDatabase(const QSqlDatabase &database)
QVariant lastInsertId() const
SqlQueryJob(QObject *parent=nullptr)
void addBindValue(const QVariant &value)
int numRowsAffected() const
void setQuery(const QString &query)
QVector< QSqlRecord > records() const
void finished(SqlQueryJob *job)
int value(const QColor &c)
QThreadStorage< QSqlDatabase > s_databases