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