Public Slots | Signals | Public Member Functions

QueryWorker Class Reference

The class that does all the work with the database. More...

#include <querythread.h>

Inheritance diagram for QueryWorker:
Inheritance graph
[legend]
Collaboration diagram for QueryWorker:
Collaboration graph
[legend]

List of all members.

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 ()

Detailed Description

The class that does all the work with the database.

Normally, this class is instantiated in the QueryThread's run() method.

Todo:
The QueryWorker should be aware of his initializer, and should have access to his data, so that less data has to be passed at initialization time from QueryThread to QueryWorker?

Constructor & Destructor Documentation

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 (  ) 

{};


Member Function Documentation

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);
};


The documentation for this class was generated from the following files: