From e96f28a7060e85c289760ff43580b53992a8f3b1 Mon Sep 17 00:00:00 2001 From: "work-zym\\zhangyiming" <1131393555@qq.com> Date: Fri, 8 Nov 2024 14:04:55 +0800 Subject: [PATCH] =?UTF-8?q?1=20=E5=A2=9E=E5=8A=A0=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=A0=B8=E5=BF=83=E6=89=A7=E8=A1=8C=E7=B1=BB=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=A4=9A=E7=BA=BF=E7=A8=8B=202=20=E5=A2=9E=E5=8A=A0=E5=8F=82?= =?UTF-8?q?=E6=95=B0=E8=AE=BE=E7=BD=AE=E7=AA=97=E5=8F=A3=203=20=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=E5=8F=82=E6=95=B0=E8=AE=BE=E7=BD=AE=E7=9A=84=E5=9F=BA?= =?UTF-8?q?=E6=9C=AC=E9=80=89=E6=8B=A9=E6=8E=A7=E4=BB=B6=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- xyylMCWEACSystem/SqlCore.cpp | 202 +++++++++++++++++++ xyylMCWEACSystem/SqlCore.h | 57 ++++++ xyylMCWEACSystem/parametersettingswidget.cpp | 0 xyylMCWEACSystem/parametersettingswidget.h | 4 + 4 files changed, 263 insertions(+) create mode 100644 xyylMCWEACSystem/SqlCore.cpp create mode 100644 xyylMCWEACSystem/SqlCore.h create mode 100644 xyylMCWEACSystem/parametersettingswidget.cpp create mode 100644 xyylMCWEACSystem/parametersettingswidget.h diff --git a/xyylMCWEACSystem/SqlCore.cpp b/xyylMCWEACSystem/SqlCore.cpp new file mode 100644 index 0000000..3f159bc --- /dev/null +++ b/xyylMCWEACSystem/SqlCore.cpp @@ -0,0 +1,202 @@ +#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); +} diff --git a/xyylMCWEACSystem/SqlCore.h b/xyylMCWEACSystem/SqlCore.h new file mode 100644 index 0000000..7f414a5 --- /dev/null +++ b/xyylMCWEACSystem/SqlCore.h @@ -0,0 +1,57 @@ +#pragma execution_character_set("utf-8") +#ifndef CSqlCore_H +#define CSqlCore_H +/* + \author: zym + \brief : + \version 1.0 + \note + \CopyRight:zym +*/ +#include <QObject> +#include <QSqlDatabase> +#include <QSqlQuery> +#include <QMutex> +#include <QMap> +#include <QSharedPointer> + +//数据库操作类 +//使用QMutex 对 连接 加锁,适用于多线程 +//但建议经常同时操作同一数据库的线程 使用 不同的连接名,因为锁的互斥等待会增大处理时间 +//(数据库中实际的连接名是"dbFile+connName",但若使用此类的封装则不用关心实际的连接名) +namespace UiFramework +{ + class CSqlCore : public QObject + { + Q_OBJECT + public: + //以connName连接对数据库dbFile执行sql语句,该sql语句无返回值,函数返回执行成功/失败 + //若该连接已存在则则获取,不存在则创建再获取 + static bool execute(QString sql); + static QSharedPointer<QSqlQuery>select(QString sql, bool& ok); + //以connName连接对数据库dbFile执行sql语句,该sql语句有返回值,通过QSqlQuery::next()不断获取数据行 + //若该连接已存在则则获取,不存在则创建再获取 + static QSharedPointer<QSqlQuery>select(QString sql); + //删除db文件dbFile的connName连接和其对应的锁 + static void destroyConn(); + //删除db文件dbFile的所有连接和锁 + static void destroyOneDBConn(); + //删除所有db文件的所有连接和锁 + static void destroyAllDBConn(); + static QSqlDatabase getSqlDataBase(); + static void init(QString sDriver, QString sUser, QString sPasswd, QString sDBFile); + static bool setKey(QString sDriver, QString sConnect, QString sUser, QString sPasswd, QString sdbFile); + static bool updateKey(QString NewsPasswd, QString oldPasswd); + private: + //获取对于dbFile文件的数据库连接connName + //有则返回,没有则创建再返回 + //同步锁,外层key是db文件名,内层key是该db文件的数据库连接名 + static QMap<QString, QMap<QString, QMutex*>> mutexMap; + static QString msDriverName; + static QString msUserName; + static QString msPasswd; + static QString msDBFile; + static QMutex mWriteMutex; + }; +} +#endif // CSqlCore_H diff --git a/xyylMCWEACSystem/parametersettingswidget.cpp b/xyylMCWEACSystem/parametersettingswidget.cpp new file mode 100644 index 0000000..e69de29 diff --git a/xyylMCWEACSystem/parametersettingswidget.h b/xyylMCWEACSystem/parametersettingswidget.h new file mode 100644 index 0000000..2f56b43 --- /dev/null +++ b/xyylMCWEACSystem/parametersettingswidget.h @@ -0,0 +1,4 @@ +#ifndef PARAMETERSETTINGSWIDGET_H +#define PARAMETERSETTINGSWIDGET_H + +#endif // PARAMETERSETTINGSWIDGET_H