#pragma execution_character_set("utf-8")
#ifndef SqlCore_H
#define SqlCore_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"，但若使用此类的封装则不用关心实际的连接名）

    class SqlCore : 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 // SqlCore_H
