/**
* @brief
数据库连接类

* @version
V 1.0.0

* @author
王益俊

* @date
创建时间:  2018-04-17\n

* @note
2018-04-17  创建类。\n

* @warning

* @bug

*/

#pragma once

#include <string>
#include <mysql.h>
#include "CDBResultSet.h"
#include "CDBCommon.h"

namespace YADB
{
	class CDBConnect
	{
	private:
		MYSQL * __pConn;//数据库连接
		CDBResultSet __RessultSet;//结果集
		bool __IsTemp;//是否是临时的(如果是临时使用的,归还到连接池中时会自动删除,以保持总体连接数不变)
		MYSQL_STMT *__pstmt;//预处理
	public:
		CDBConnect( bool IsTemp = false );
		~CDBConnect();
		/**
		* @brief
		连接数据库函数。

		* @param  [in] const _DB_POOL_SETTING_& Setting  数据库连接设置\n
		* @param  [out] std::string& Error  错误信息\n

		* @return 返回连接数据库是否成功
		* @return  true   成功\n
		* @return  false  失败\n

		* @note

		* @warning

		* @bug

		*/
		bool Connect( const _DB_CONN_SETTING_& DBSetting, std::string& Error );
		/**
		* @brief
		关闭连接函数。

		* @param  无\n

		* @return  无\n

		* @note

		* @warning

		* @bug

		*/
		void Close();
		/**
		* @brief
		测试连接函数。

		* @param [out] std::string& Error 错误信息\n

		* @return 返回测试连接是否成功
		* @return  0  连接测试成功\n
		* @return  !=0  连接测试失败\n

		* @note

		* @warning

		* @bug

		*/
		int ConnctionTest( std::string& Error );
		/**
		* @brief
		设置自动提交的函数。

		* @param [in] bool Mode 是否是否自动提交\n
		* @param [out] std::string& Error 错误信息\n

		* @return 返回设置自动提交是否成功
		* @return  0  成功\n
		* @return  !=0  失败\n

		* @note

		* @warning

		* @bug

		*/
		int AutoCommit( bool Mode, std::string& Error );
		/**
		* @brief
		提交函数。

		* @param [out] std::string& Error 错误信息\n

		* @return 返回提交是否成功
		* @return  0  成功\n
		* @return  !=0  失败\n

		* @note

		* @warning

		* @bug

		*/
		int Commit( std::string& Error  );
		/**
		* @brief
		回滚函数。

		* @param [out] std::string& Error  错误信息\n

		* @return 返回回滚是否成功
		* @return  0  成功\n
		* @return  !=0  失败\n

		* @note

		* @warning

		* @bug

		*/
		int RollBack( std::string& Error );
		/**
		* @brief
		执行SQL语句返回结果集函数。

		* @param [in] const char *szSql  SQL语句\n
		* @param [out] std::string& Error  错误信息\n

		* @return 返回结果集
		* @return  0  失败\n
		* @return  !=0  成功\n

		* @note

		* @warning

		* @bug

		*/
		CDBResultSet* ExecuteQuery( const char *szSql, std::string& Error );
		/**
		* @brief
		执行SQL语句返回mysql原始结果集函数。

		* @param [in] const char *szSql  SQL语句\n
		* @param [out] std::string& Error  错误信息\n

		* @return 返回的mysql原始结果集
		* @return  ==0  失败\n
		* @return  !=0  成功\n

		* @note

		* @warning

		* @bug

		*/
		MYSQL_RES* Query( const char *szSql, std::string& Error );
		/**
		* @brief
		执行SQL语句函数。

		* @param [in] const char *szSql  SQL语句\n
		* @param [out] std::string& Error  错误信息\n

		* @return 返回影响到的记录数量
		* @return  -1  失败\n
		* @return  >=0  成功\n

		* @note

		* @warning

		* @bug

		*/
		my_ulonglong ExecuteSql( const char *szSql, std::string& Error );
		/**
		* @brief
		执行SQL语句函数。

		* @param [in] const char *szSql  SQL语句\n
		* @param [out] std::string& Error  错误信息\n

		* @return 返回影响到的记录数量
		* @return  -1  失败\n
		* @return  >=0  成功\n

		* @note

		* @warning

		* @bug

		*/
		my_ulonglong ExecuteRealSql( const char *szSql, std::string& Error );
		/**
		* @brief
		获得最后一次错误信息函数。

		* @param 无\n

		* @return 返回最后一次错误

		* @note

		* @warning

		* @bug

		*/
		const char* GetLastError();
		/**
		* @brief
		获得最后一次插入的ID函数。

		* @param [out] std::string& Error  错误信息\n

		* @return 返回最后一次插入的ID
		* @return  -1  失败\n
		* @return  >=0  成功\n

		* @note

		* @warning

		* @bug

		*/
		my_ulonglong GetLastInsertID( std::string& Error );
		/**
		* @brief
		获得是否是临时的连接函数。

		* @param 无\n

		* @return 返回是否是临时的

		* @note

		* @warning

		* @bug

		*/
		bool IsTemp();
		/**
		* @brief
		准备stmt函数。

		* @param const char *szSql 预处理SQL语句\n
		* @param [out] std::string& Error  错误信息\n

		* @return 返回准备stmt是否成功
		* @return  false  失败\n
		* @return  true  成功\n

		* @note

		* @warning

		* @bug

		*/
		bool Preparestmt( const char *szSql, std::string& Error );
		/**
		* @brief
		执行stmt函数。

		* @param [in] MYSQL_BIND *stBinds  要执行的BIND\n
		* @param [in] uint64_t *piId  执行后获得的ID\n
		* @param [out] std::string& Error  错误信息\n

		* @return 返回执行stmt成功还是失败
		* @return  false  失败\n
		* @return  true  成功\n

		* @note

		* @warning

		* @bug

		*/
		bool stmtExcute( MYSQL_BIND *stBinds, uint64_t *piId, std::string& Error );
		/**
		* @brief
		关闭stmt函数。

		* @param 无\n

		* @return 无\n

		* @note

		* @warning

		* @bug

		*/
		void stmtClose();
		/**
		* @brief
		执行SQL语句并获得自动生成的ID函数。

		* @param [in] const char *szSql  SQL语句\n
		* @param [out] std::string& Error  错误信息\n

		* @return 返回自动生成的ID
		* @return  <1  失败\n
		* @return  >=1  成功\n

		* @note

		* @warning

		* @bug

		*/
		my_ulonglong ExecuteSqlID( const char *szSql, std::string& Error );
	};
}