The class that does all the work with the database. More...
#include <querythread.h>
Public Slots | |
void | slotExecute (QueryQueue *queue) |
Signals | |
void | querying (bool) |
Emited at start and end of each query. | |
void | signal_result (QueryThreadCommand result) |
Public Member Functions | |
QueryWorker (QueryThreadConnSpecs &specs, QueryQueue *queryQueue, QObject *parent=0) | |
~QueryWorker () | |
QueryThreadCommand | currentCmd () |
The class that does all the work with the database.
Normally, this class is instantiated in the QueryThread's run() method.
QueryWorker::QueryWorker | ( | QueryThreadConnSpecs & | specs, | |
QueryQueue * | queryQueue, | |||
QObject * | parent = 0 | |||
) |
: QObject(parent), m_requester(0) { createConnection(specs, "ThreadConnection"); Q_ASSERT(queryQueue); this->m_queryQueue = queryQueue; };
QueryWorker::~QueryWorker | ( | ) |
{};
QueryThreadCommand QueryWorker::currentCmd | ( | ) |
Referenced by QueryThread::currentCmd().
{ QMutexLocker lock(&m_currentCmdMutex); return m_currentCmd; }
void QueryWorker::querying | ( | bool | ) | [signal] |
Emited at start and end of each query.
Referenced by slotExecute().
void QueryWorker::signal_result | ( | QueryThreadCommand | result | ) | [signal] |
Referenced by slotExecute().
void QueryWorker::slotExecute | ( | QueryQueue * | queue | ) | [slot] |
{ QueryThreadCommand cmd = queue->dequeue(); if (!cmd.isValid()) return; setCurrentCmd(cmd); emit querying(true); //Executing and setting of result; QSharedPointer<QSqlQuery> result; QSqlDatabase db = QSqlDatabase::database("ThreadConnection", false); if (!db.isOpen() && !db.isOpenError()) connectToDatabase(db); if (cmd.isEmpty() || db.isOpenError() || !db.isOpen()) { qDebug() << "Threaded connection to database not open."; result = QSharedPointer<QSqlQuery>(new QSqlQuery()); } else { do { result = QSharedPointer<QSqlQuery>(new QSqlQuery(cmd.dequeueQuery(), db)); if (result->lastError().isValid() && !result->lastError().text().contains("canceling statement due to user request")) { qWarning() << "Error from DB worker thread: " << result->lastError() << "\nAborting execution..."; qDebug() << "Caused in query: " << result->lastQuery(); break; } } while (!cmd.isEmpty()); } releaseCurrentCmd(); cmd.setResult(result); // it's more efficient to assign a raw pointer than to copy the shared one... emit signal_result(cmd); emit querying(false); };