work-zym\zhangyiming e96f28a706 1 增加数据核心执行类支持多线程
2 增加参数设置窗口
3 设计参数设置的基本选择控件类
2024-11-08 14:04:55 +08:00

203 lines
5.8 KiB
C++

#include "CSqlCore.h"
#include <QThread>
#include <QDebug>
#include <QSqlError>
#include <QFile>
#include "global_log.h"
using namespace UiFramework;
QMap<QString, QMap<QString, QMutex*>> CSqlCore::mutexMap;
QString CSqlCore::msDriverName;
QString CSqlCore::msPasswd;
QString CSqlCore::msUserName;
QString CSqlCore::msDBFile;
QMutex CSqlCore::mWriteMutex;
void CSqlCore::init(QString sDriver, QString sUser, QString sPasswd, QString sDBFile)
{
QByteArray base64User(sUser.toUtf8());
QByteArray base64Passwd(sPasswd.toUtf8());
msDriverName = sDriver;
msUserName = base64User.toBase64();
msPasswd = base64Passwd.toBase64();
msDBFile = sDBFile;
}
bool CSqlCore::setKey(QString sDriver,QString sConnect, QString sUser, QString sPasswd, QString sdbFile)
{
bool ok = false;
QSqlDatabase dataBase = QSqlDatabase::addDatabase(sDriver, sConnect);
if (QFile::exists(sdbFile))
{
QByteArray base64User(sUser.toUtf8());
QByteArray base64Passwd(sPasswd.toUtf8());
dataBase.setUserName(base64User.toBase64());
dataBase.setDatabaseName(sdbFile);//
dataBase.setPassword(base64Passwd.toBase64());
if (sPasswd.isEmpty())
{
dataBase.setConnectOptions("QSQLITE_REMOVE_KEY");
logInfo() << QString::fromLocal8Bit("½âÃÜ") << endl;
}
else
{
dataBase.setConnectOptions("QSQLITE_CREATE_KEY");
logInfo() << QString::fromLocal8Bit("¼ÓÃÜ") << endl;
}
if (!dataBase.open())
{
logError() << QString::fromLocal8Bit("ÃÜÂë´íÎó") << endl;
ok = false;
}
else
{
ok = true;
}
}
dataBase.close();
return ok;
}
bool CSqlCore::updateKey(QString NewsPasswd, QString oldPasswd)
{
bool ok = false;
getSqlDataBase().setPassword(oldPasswd);
getSqlDataBase().setConnectOptions("QSQLITE_UPDATE_KEY=" + NewsPasswd);
ok = getSqlDataBase().open();
if (!ok)
{
logError() << "updatePasswd: " << getSqlDataBase().lastError().driverText();
ok = false;
}
return ok;
}
bool CSqlCore::execute(QString sql )
{
QMutexLocker lockTemp(&mWriteMutex);
QString connName = QString("%1(%2)").arg(msDBFile).arg(QString::number(qint64(QThread::currentThread()), 16));//ÎļþÃû + Ïß³Ì
//qDebug() << "execute:" << connName << endl;
QSqlDatabase t = getSqlDataBase( );
mutexMap[msDBFile][connName]->lock();
if (!t.isOpen())
t.open(msUserName,msPasswd);
QSqlQuery sqlQuery(t);
bool flag = sqlQuery.exec(sql);
if (!flag)
{
logError() << connName << sqlQuery.lastError().text() << endl;
}
mutexMap[msDBFile][connName]->unlock();
return flag;
}
QSharedPointer<QSqlQuery> CSqlCore::select(QString sql)
{
//QMutexLocker lockTemp(&mWriteMutex);
QString connName = QString("%1(%2)").arg(msDBFile).arg(QString::number(qint64(QThread::currentThread()), 16));//ÎļþÃû + Ïß³Ì
//qDebug() << "select:" << connName << endl;
QSqlDatabase t = getSqlDataBase();
mutexMap[msDBFile][connName]->lock();
if (!t.isOpen())
t.open(msUserName,msPasswd);
// QSqlQuery *sqlQuery = new QSqlQuery(t);
//QSharedPointer<QSqlQuery> sqlQuery = new QSharedPointer<QSqlQuery(t)>;
QSharedPointer<QSqlQuery> sqlQuery = QSharedPointer<QSqlQuery>(new QSqlQuery(t));
if (!sqlQuery->exec(sql)) {
logError() << "CSqlCore::select() sql = " << sql << sqlQuery->lastError().text() << " failed!" << endl;
}
mutexMap[msDBFile][connName]->unlock();
return sqlQuery;
}
QSharedPointer<QSqlQuery> CSqlCore::select(QString sql, bool& ok)
{
//QMutexLocker lockTemp(&mWriteMutex);
QString connName = QString("%1(%2)").arg(msDBFile).arg(QString::number(qint64(QThread::currentThread()), 16));//ÎļþÃû + Ïß³Ì
//qDebug() << "select:" << connName << endl;
QSqlDatabase t = getSqlDataBase();
mutexMap[msDBFile][connName]->lock();
if (!t.isOpen())
t.open(msUserName, msPasswd);
// QSqlQuery *sqlQuery = new QSqlQuery(t);
//QSharedPointer<QSqlQuery> sqlQuery = new QSharedPointer<QSqlQuery(t)>;
QSharedPointer<QSqlQuery> sqlQuery = QSharedPointer<QSqlQuery>(new QSqlQuery(t));
ok = sqlQuery->exec(sql);
if (!ok)
{
logError() << "CSqlCore::select() sql = " << sql << sqlQuery->lastError().text() << " failed!" << endl;
}
mutexMap[msDBFile][connName]->unlock();
return sqlQuery;
}
void CSqlCore::destroyConn()
{
QString connName = QString("%1(%2)").arg(msDBFile).arg(QString::number(qint64(QThread::currentThread()), 16));//ÎļþÃû + Ïß³Ì
//qDebug() << "destroyConn:" << connName << endl;
if (!QSqlDatabase::contains( connName))
return;
QSqlDatabase t = QSqlDatabase::database(connName);
if (t.isOpen())
t.close();
QSqlDatabase::removeDatabase( connName);
delete mutexMap[msDBFile][connName];
mutexMap[msDBFile].remove(connName);
if (mutexMap[msDBFile].keys().length() == 0)
mutexMap.remove(msDBFile);
}
void CSqlCore::destroyOneDBConn()
{
// foreach (QString i, mutexMap[msDBFile].keys())
{
destroyConn();
}
}
void CSqlCore::destroyAllDBConn()
{
// foreach (QString i, mutexMap.keys())
// {
destroyOneDBConn();
// }
}
QSqlDatabase CSqlCore::getSqlDataBase()
{
QString connName = QString("%1(%2)").arg(msDBFile).arg(QString::number(qint64(QThread::currentThread()), 16));//ÎļþÃû + Ïß³Ì
if (!QSqlDatabase::contains(connName))
{
QSqlDatabase database = QSqlDatabase::addDatabase(msDriverName, connName);
database.setDatabaseName(msDBFile);
database.setUserName(msUserName);
database.setPassword(msPasswd);
if (!mutexMap.contains(msDBFile))
{
QMap<QString, QMutex*> tMap;
mutexMap.insert(msDBFile, tMap);
}
if (database.isOpen() || database.open())
{
QSqlQuery query(database);
query.exec("PRAGMA journal_mode=WAL;"); // ÉèÖÃWALģʽ
query.finish();
query.clear();
}
else
{
logWarning() << "DB open failed! " << database.lastError().text() << endl;
}
QMutex *mutex = new QMutex();
mutexMap[msDBFile].insert(connName, mutex);
}
return QSqlDatabase::database( connName);
}