class QDatabase_Manager : public QThread{public://подготовить и послать команду SQL bool prepexec(const QString & query_cmd, QList<QNero_DataBase::QUERY_PARAM_T> * params = NULL,bool gen_sig = true,bool remote_mode = true);.........private: QNero_DataBase * nero_db;}//Создание обхекта БД и подключение слотовvoid QDatabase_Manager::run(void){ nero_db = new QNero_DataBase(); connect(this,SIGNAL(signal_connect(bool,QString,QString,QString)),nero_db,SLOT(slot_connect(bool,QString,QString,QString)),Qt::QueuedConnection); connect(this,SIGNAL(signal_disconnect(bool)),nero_db,SLOT(slot_disconnect(bool))); connect(this,SIGNAL(signal_exec(QString,QList<QNero_DataBase::QUERY_PARAM_T>*,bool,bool)),nero_db,SLOT(slot_exec(QString,QList<QNero_DataBase::QUERY_PARAM_T>*,bool,bool)),Qt::QueuedConnection); connect(nero_db,SIGNAL(signal_write_log(QString)),this,SIGNAL(signal_write_log(QString)),Qt::QueuedConnection); connect(nero_db,SIGNAL(signal_set_connected(bool,bool)),this,SLOT(slot_connected(bool,bool)),Qt::QueuedConnection); connect(nero_db,SIGNAL(signal_set_done(bool)),this,SLOT(slot_set_done(bool)),Qt::QueuedConnection); QThread::exec(); ........ delete nero_db;}//функция подготовки команды запроса(query_cmd) и ее параметров(params, если они есть) к отправке в sql(удаленная mysql по умолчанию)void QDatabase_Manager::prepexec(const QString & query_cmd, QList<QNero_DataBase::QUERY_PARAM_T> * params,bool gen_sig, bool remote_mode){ done = false; data_error = false; emit signal_exec(query_cmd,params,gen_sig,remote_mode); while (!done) QApplication::processEvents(); if (!data_error) return true; else return false;}//слот обработки ответа от sqlvoid QDatabase_Manager::slot_set_done(bool error){ done = true; data_error = error;}
class QNero_DataBase : public QObject{ Q_OBJECTpublic: ......signals: void signal_set_connected(bool remote,bool value); void signal_set_done(bool data_error);public slots: ....... //подготовить и послать команду SQL bool slot_exec(const QString & query_cmd, QList<QNero_DataBase::QUERY_PARAM_T> * params = NULL,bool gen_sig = true,bool remote_mode = true);private: QSqlDatabase local_db,remote_db;//локальная и удаленная базы данных bool remote_transaction;//текущая транзакция к удаленной БД? QSqlQuery * local_query,* remote_query; QSqlRecord record;};//подготовить и послать команду SQLbool QNero_DataBase::slot_exec(const QString & query_cmd, QList<QNero_DataBase::QUERY_PARAM_T> * params,bool gen_sig,bool remote_mode){ //подготовка команды remote_query -> clear(); remote_query -> prepare(query_cmd); if (params != NULL) for (int i = 0; i < params -> count(); i++) remote_query -> bindValue(params -> at(i).key,params -> at(i).value); //отправка if (!remote_query -> exec()) { emit signal_set_done(true);//отправляем сигнал о том, что транзакция с БД завершена с ошибкой return false; } emit signal_set_done(false);//отправляем сигнал о том, что транзакция с БД завершена record = remote_query -> record(); return true;}
//переход к следующей записи, возвращает true, если запись естьbool QDatabase_Manager::next(){ return nero_db -> next();}//получение значение колонки column текущей записиQVariant QDatabase_Manager::value(const QString & column){ return nero_db -> value(column);}
//переход к следующей записи, возвращает true, если запись естьbool QNero_DataBase::next(){ return remote_query -> next();}//получение значение колонки column текущей записиQVariant QNero_DataBase::value(const QString & column){ return remote_query -> value(record.indexOf(column));}