Jelajahi Sumber

fix db encode

lixioayao 6 tahun lalu
induk
melakukan
da736b9eb7

+ 1 - 0
Makefile.am

@@ -28,6 +28,7 @@ AM_LDFLAGS=-Wall -pthread -m64 -g -std=c++11  -L${prefix}/lib  -L/usr/local/mysq
 yals_SOURCES=${AM_SOURCES} main.cpp
 yals_CPPFLAGS=${AM_CPPFLAGS} 
 yals_LDFLAGS=${AM_LDFLAGS}  -lev -lzlog -lrt -lboost_chrono -lboost_system -lboost_thread -lmysqlclient -lthree_rates
+
 yals_LDADD=db/libyadb.a websocket/libwebsocket.a
 
 async_SOURCES=async.cpp

+ 0 - 3
area_beh.h

@@ -1,3 +0,0 @@
-
-
-

+ 2 - 2
db/Makefile.am

@@ -3,12 +3,12 @@ AUTOMAKE_OPTIONS=foreign
 noinst_LIBRARIES=libyadb.a
 
 
-CXXFLAGS=-fPIC -g
+CXXFLAGS=-g
 AM_CPPFLAGS=-Wall -pthread -m64 -std=c++11  -I${prefix}/include -I/usr/local/mysql/include -I. -I.. -I../websocket/sio
 AM_LDFLAGS =-Wall -pthread -m64 -std=c++11  -L${prefix}/lib  -L/usr/local/mysql/lib
 
 libyadb_a_SOURCES= db_card.cpp db_api/CDBResultSet.cpp db_api/CDBConnect.cpp \
-		db_api/CDBHelper.cpp db_api/CDBConnPool.cpp db_tool.cpp db_area.cpp db_history.cpp
+				   db_api/CDBHelper.cpp db_api/CDBConnPool.cpp db_tool.cpp db_area.cpp db_history.cpp
 
 DEFS= 
 EXTRA_DIST=

+ 29 - 29
db/db_api/CDBCommon.h

@@ -1,18 +1,18 @@
 /**
 * @brief
-数据库公共头文件
+鏁版嵁搴撳叕鍏卞ご鏂囦欢
 
 * @version
 V 1.0.0
 
 * @author
-王益俊
+鐜嬬泭淇�
 
 * @date
-创建时间:  2018-04-19\n
+鍒涘缓鏃堕棿:  2018-04-19\n
 
 * @note
-2018-04-19  初次创建。\n
+2018-04-19  鍒濇�鍒涘缓銆俓n
 
 * @warning
 
@@ -28,43 +28,43 @@ V 1.0.0
 namespace YADB
 {
 	//----------------------------------------------------------------------------
-	//                                 数据库错误定义
+	//                                 鏁版嵁搴撻敊璇�畾涔�
 	//----------------------------------------------------------------------------
-	const int DB_ERR_NO_ERROR               = 0;//无错误
-	const int DB_ERR_NOT_CONNECT_DB         = -1;//未连接数据库
-	const int DB_ERR_EXCUTE_QUERY           = -1;//执行查询失败
-	const int DB_ERR_QUERY_RES_NOT_INITED   = -1;//查询结果集还未初始化
+	const int DB_ERR_NO_ERROR               = 0;//鏃犻敊璇�
+	const int DB_ERR_NOT_CONNECT_DB         = -1;//鏈�繛鎺ユ暟鎹�簱
+	const int DB_ERR_EXCUTE_QUERY           = -1;//鎵ц�鏌ヨ�澶辫触
+	const int DB_ERR_QUERY_RES_NOT_INITED   = -1;//鏌ヨ�缁撴灉闆嗚繕鏈�垵濮嬪寲
 
 	//----------------------------------------------------------------------------
-	//                                 其它定义
+	//                                 鍏跺畠瀹氫箟
 	//----------------------------------------------------------------------------
-	const int MAX_ASYNC_EXEC_FAILED_COUNT   = 3;//最大异步执行失败次数
-	const int MAX_ASYNC_QUEQUE_CAPACITY     = 32 * 1024;//异步执行队列最大容量
+	const int MAX_ASYNC_EXEC_FAILED_COUNT   = 3;//鏈€澶у紓姝ユ墽琛屽け璐ユ�鏁�
+	const int MAX_ASYNC_QUEQUE_CAPACITY     = 32 * 1024;//寮傛�鎵ц�闃熷垪鏈€澶у�閲�
 
 	/**
 	* @brief
-	数据库连接数枚举
+	鏁版嵁搴撹繛鎺ユ暟鏋氫妇
 	*/
 	enum _DB_CONNECT_COUNT_
 	{
-		DCC_MIN_COUNT = 1,//最小连接数
-		DCC_MAX_COUNT = 60,//最大连接数
+		DCC_MIN_COUNT = 1,//鏈€灏忚繛鎺ユ暟
+		DCC_MAX_COUNT = 60,//鏈€澶ц繛鎺ユ暟
 	};
 
 	/**
 	* @brief
-	数据库连接设置结构体
+	鏁版嵁搴撹繛鎺ヨ�缃�粨鏋勪綋
 	*/
 	struct _DB_CONN_SETTING_
 	{
-		unsigned int Port;//端口
-		int TimeOut;//连接数据库超时(单位:秒)
-		std::string Host;//数据库主机地址
-		std::string User;//用户名
-		std::string PWD;//密码
-		std::string DBName;//数据库名
-		std::string CharSet;//字符集
-		std::string stmtSQL;//预处理SQL
+		unsigned int Port;//绔�彛
+		int TimeOut;//杩炴帴鏁版嵁搴撹秴鏃�(鍗曚綅锛氱�)
+		std::string Host;//鏁版嵁搴撲富鏈哄湴鍧€
+		std::string User;//鐢ㄦ埛鍚�
+		std::string PWD;//瀵嗙爜
+		std::string DBName;//鏁版嵁搴撳悕
+		std::string CharSet;//瀛楃�闆�
+		std::string stmtSQL;//棰勫�鐞哠QL
 		_DB_CONN_SETTING_()
 		{
 			Port    = 3306;
@@ -74,11 +74,11 @@ namespace YADB
 
 	/**
 	* @brief
-	数据库连接池设置结构体
+	鏁版嵁搴撹繛鎺ユ睜璁剧疆缁撴瀯浣�
 	*/
 	struct _DB_POOL_SETTING_ : public _DB_CONN_SETTING_
 	{
-		int PoolSize;//连接池大小
+		int PoolSize;//杩炴帴姹犲ぇ灏�
 		_DB_POOL_SETTING_()
 		{
 			PoolSize = 0;
@@ -87,12 +87,12 @@ namespace YADB
 
 	/**
 	* @brief
-	异步执行结构体
+	寮傛�鎵ц�缁撴瀯浣�
 	*/
 	struct _ASYNC_SQL_
 	{
-		int FailedCount;//执行失败次数
-		std::string SQL; //SQ语句
+		int FailedCount;//鎵ц�澶辫触娆℃暟
+		std::string SQL; //SQ璇�彞
 		_ASYNC_SQL_()
 		{
 			FailedCount = 0;

+ 26 - 402
db/db_api/CDBConnPool.cpp

@@ -1,389 +1,14 @@
-<<<<<<< HEAD
-#include "CDBConnPool.h"
-#include <boost/bind.hpp>
-#include <boost/lockfree/queue.hpp>
-#include <stdio.h>
-namespace YADB
-{
-	boost::lockfree::queue<_ASYNC_SQL_*, boost::lockfree::capacity<MAX_ASYNC_QUEQUE_CAPACITY>> __AsyncQueue;//寮傛�鎵ц�鏃犻攣闃熷垪
-
-	CDBConnPool::CDBConnPool()
-	{
-		__pAsyncDBConn = 0;
-		printf("connpool  ....\n");
-	}
-
-	CDBConnPool::~CDBConnPool()
-	{
-		Close();
-	}
-
-	CDBConnect * CDBConnPool::__CreateIdleConn( std::string& Error, bool IsTemp )
-	{
-		std::string ConnErr;
-
-		_DB_CONN_SETTING_ ConnSetting = static_cast< _DB_CONN_SETTING_ >(__Setting);
-		CDBConnect* pConn = new CDBConnect( IsTemp );
-		if ( !pConn->Connect( ConnSetting, ConnErr ) )
-		{
-			delete pConn;
-			pConn = 0;
-			return 0;
-		}
-
-		//濡傛灉璁剧疆浜嗛�澶勭悊SQL瑕佸噯澶囬�澶勭悊
-		if ( !ConnSetting.stmtSQL.empty() )
-		{
-			if ( !pConn->Preparestmt( ConnSetting.stmtSQL.c_str(), Error ) )
-			{
-				delete pConn;
-				pConn = 0;
-				return 0;
-			}
-		}
-
-		__IdleConnList.push_back( pConn );
-		return pConn;
-	}
-
-	bool CDBConnPool::Create( const _DB_POOL_SETTING_& Setting, std::string& Error )
-	{
-		std::unique_lock<std::mutex> lock( __mtx );
-
-		if ( Setting.PoolSize < DCC_MIN_COUNT )
-		{
-			Error = "PoolSize is too small!"+std::to_string(Setting.PoolSize);
-			return false;
-		}
-
-		if ( Setting.PoolSize > DCC_MAX_COUNT )
-		{
-			Error = "PoolSize is too big!";
-			return false;
-		}
-
-		__Setting = Setting;
-		std::string ConnErr;
-		for ( int i = 0; i < __Setting.PoolSize; i++ )
-		{
-			CDBConnect* pConn = __CreateIdleConn( Error );
-			if ( !pConn )
-			{
-				return false;
-			}
-		}
-
-		//鍒涘缓寮傛�鎵ц�绾跨▼
-		__CreateAsyncThrdConn();
-
-		//鍚�姩寮傛�鎵ц�绾跨▼
-		__StartAsyncThrd();
-
-		return true;
-	}
-
-	void CDBConnPool::Close()
-	{
-		std::unique_lock<std::mutex> lock( __mtx );
-
-		//鍋滄�寮傛�鎵ц�绾跨▼
-		__StopAsyncThrd();
-
-		//鍒�櫎寮傛�鎵ц�绾跨▼杩炴帴
-		__DestroyAsyncThrdConn();
-
-		//鎶婃墍鏈夊垪琛ㄤ腑鐨勮繛鎺ュ�璞¢兘鍏抽棴鍒犻櫎骞舵竻闄ゅ垪琛�
-		CDBConnect* pConn = 0;
-		std::list<CDBConnect*>::iterator lit_conn;
-		for ( lit_conn = __BusyConnList.begin(); lit_conn != __BusyConnList.end(); lit_conn++ )
-		{
-			pConn = *lit_conn;
-			pConn->Close();
-			delete pConn;
-			pConn = 0;
-		}
-		__BusyConnList.clear();
-
-		for ( lit_conn = __IdleConnList.begin(); lit_conn != __IdleConnList.end(); lit_conn++ )
-		{
-			pConn = *lit_conn;
-			pConn->Close();
-			delete pConn;
-			pConn = 0;
-		}
-		__IdleConnList.clear();
-	}
-
-	CDBConnect * CDBConnPool::GetDBConnect( std::string& Error )
-	{
-		std::unique_lock<std::mutex> lock( __mtx );
-
-		CDBConnect* pConn = 0;
-
-		if ( __IdleConnList.size() > 0 )
-		{
-			pConn = *(__IdleConnList.begin());
-			__IdleConnList.pop_front();
-			__BusyConnList.push_back( pConn );
-		}
-		else
-		{
-			//濡傛灉宸茬粡娌℃湁绌洪棽杩炴帴,鍙��褰撳墠杩炴帴姹犳暟閲忔病鏈夎秴杩囨渶澶ц繛鎺ユ暟灏卞垱寤轰竴涓�复鏃惰繛鎺�
-			if ( __IdleConnList.size() < DCC_MAX_COUNT )
-			{
-				pConn = __CreateIdleConn( Error, true );
-				if ( !pConn )
-				{
-					Error = "Error,failed connect to database!";
-					return 0;
-				}
-
-				__IdleConnList.pop_front();
-				__BusyConnList.push_back( pConn );
-			}
-			else
-			{
-				Error = "Error,db connect count beyond the max connect count!";
-				return 0;
-			}
-		}
-
-		//楠岃瘉鐪嬫暟鎹�簱杩炴帴鏄�惁杩樻湁鏁�
-		if ( pConn )
-		{
-			if ( pConn->ConnctionTest( Error ) != 0 )
-			{
-				//閲嶈繛涓€娆�
-				_DB_CONN_SETTING_ ConnSetting = static_cast< _DB_CONN_SETTING_ >(__Setting);
-				pConn->Close();
-				int nRet = pConn->Connect( ConnSetting, Error );
-				if ( nRet < 0 )
-				{
-					GiveBack( pConn );
-					Error = "Error,failed connect to database!";
-					return 0;
-				}
-			}
-		}
-
-		return pConn;
-	}
-
-	void CDBConnPool::GiveBack( CDBConnect * pConn )
-	{
-		std::unique_lock<std::mutex> lock( __mtx );
-
-		if ( 0 == pConn )
-		{
-			return;
-		}
-
-		__BusyConnList.remove( pConn );
-
-		//濡傛灉鏄�复鏃惰繛鎺�,鐩存帴鍒犻櫎涓嶅啀鏀惧叆鍒扮┖闂茶繛鎺ュ垪琛ㄤ腑
-		if ( pConn->IsTemp() )
-		{
-			delete pConn;
-			pConn = 0;
-		}
-		else
-		{
-			__IdleConnList.push_back( pConn );
-		}
-	}
-
-	void CDBConnPool::_AsyncThreadFunc( CDBConnPool* pOwner )
-	{
-		std::string Error;
-		while( pOwner->__Running )
-		{
-			_ASYNC_SQL_* pData = 0;
-			while ( __AsyncQueue.pop( pData ) )
-			{
-				if ( pData )
-				{
-					if ( __pAsyncDBConn )
-					{
-						my_ulonglong llRes = 0;
-						llRes = __pAsyncDBConn->ExecuteRealSql( pData->SQL.c_str(), Error );
-						if ( -1 == llRes )
-						{
-							//Execute failed, write log...
-							printf( "Error,璋冪敤ExcuteRealSql澶辫触,Err=%s\n", Error.c_str() );
-							//濡傛灉澶辫触浜嗙湅鏄�笉鏄�暟鎹�簱鏂�紑杩炴帴浜嗭紝灏濊瘯閲嶆柊杩炴帴涓€娆�
-							if ( __pAsyncDBConn->ConnctionTest( Error ) != 0 )
-							{
-								_DB_CONN_SETTING_ ConnSetting = static_cast< _DB_CONN_SETTING_ >(__Setting);
-								__pAsyncDBConn->Close();
-								int nRet = __pAsyncDBConn->Connect( ConnSetting, Error );
-								if ( nRet < 0 )
-								{
-									Error = "Error,failed connect to database!";
-									//Connect failed, write log...
-									printf( "Error,failed connect to database,Err=%s\n", Error.c_str() );
-									//濡傛灉杩炴帴澶辫触浜嗕紤鎭�竴涓�
-									boost::this_thread::sleep( boost::posix_time::milliseconds( 100 ) );
-								}
-							}
-
-							//濡傛灉鎵ц�澶辫触锛屽け璐ユ�鏁板姞涓€锛屽け璐ユ�鏁板皬浜庢渶澶уけ璐ユ�鏁版斁鍒伴槦灏句笅娆″啀鎵ц�
-							pData->FailedCount++;
-							if ( pData->FailedCount < MAX_ASYNC_EXEC_FAILED_COUNT )
-							{
-								_ASYNC_SQL_* pNewData = new _ASYNC_SQL_();
-								pNewData->FailedCount = pData->FailedCount;
-								pNewData->SQL         = pData->SQL;
-								__AsyncQueue.push( pNewData );
-							}
-						}
-					}
-
-					delete pData;
-					pData = 0;
-				}
-			}
-
-			boost::this_thread::sleep_for( boost::chrono::milliseconds( 1 ) );
-		}
-
-		//绾跨▼閫€鍑�
-		__IsExited = true;
-	}
-
-	void CDBConnPool::__StopAsyncThrd()
-	{
-		if ( !__Running )
-		{
-			return;
-		}
-
-		//绛夊緟寮傛�鎵ц�绾跨▼閫€鍑�
-		__Running = false;
-
-		while ( !__IsExited )
-		{
-			boost::this_thread::sleep_for( boost::chrono::milliseconds( 1 ) );
-		}
-
-		//鎶婂紓姝ユ墽琛屾棤閿侀槦鍒椾腑姣忎釜鍏冪礌閲婃斁
-		_ASYNC_SQL_* pData = 0;
-		while ( __AsyncQueue.pop( pData ) )
-		{
-			if (pData)
-			{
-				delete pData;
-				pData = 0;
-			}
-		}
-	}
-
-	void CDBConnPool::__StartAsyncThrd()
-	{
-		boost::thread thrd( boost::bind( &CDBConnPool::_AsyncThreadFunc, this, this ) );
-		thrd.detach();
-	}
-
-	void CDBConnPool::__CreateAsyncThrdConn()
-	{
-		std::string ConnErr;
-
-		_DB_CONN_SETTING_ ConnSetting = static_cast< _DB_CONN_SETTING_ >(__Setting);
-		CDBConnect* pConn = new CDBConnect();
-		if ( !pConn->Connect( ConnSetting, ConnErr ) )
-		{
-			delete pConn;
-			pConn = 0;
-			return;
-		}
-
-		__pAsyncDBConn = pConn;
-	}
-
-	void CDBConnPool::__DestroyAsyncThrdConn()
-	{
-		if ( __pAsyncDBConn )
-		{
-			__pAsyncDBConn->Close();
-			delete __pAsyncDBConn;
-			__pAsyncDBConn = 0;
-		}
-	}
-
-	bool CDBConnPool::PushAsync( const std::string& strSQL )
-	{
-		_ASYNC_SQL_* pData = new _ASYNC_SQL_;
-		if ( !pData )
-		{
-			return false;
-		}
-
-		pData->SQL = strSQL;
-		return __AsyncQueue.push( pData );
-	}
-
-	bool CDBConnPool::Query( const char *szSql, CDBResultSet& DBRes, std::string& Error )
-	{
-		CDBConnect *pConn = GetDBConnect( Error );
-		if ( 0 == pConn )
-		{
-			return false;
-		}
-
-		MYSQL_RES* pRes = pConn->Query( szSql, Error );
-		GiveBack( pConn );
-		return DBRes.Bind( pRes, Error );
-	}
-
-	MYSQL_RES* CDBConnPool::Query( const char *szSql, std::string& Error )
-	{
-		CDBConnect *pConn = GetDBConnect( Error );
-		if ( 0 == pConn )
-		{
-			return false;
-		}
-
-		MYSQL_RES* pRes = pConn->Query( szSql, Error );
-		GiveBack( pConn );
-		return pRes;
-	}
-
-	my_ulonglong CDBConnPool::ExecuteSql( const char *szSql, std::string& Error )
-	{
-		CDBConnect *pConn = GetDBConnect( Error );
-		if ( 0 == pConn )
-		{
-			return -1;
-		}
-
-		my_ulonglong nRet = pConn->ExecuteSql( szSql, Error );
-		GiveBack( pConn );
-		return nRet;
-	}
-
-	my_ulonglong CDBConnPool::ExecuteSqlID( const char * szSql, std::string & Error )
-	{
-		CDBConnect *pConn = GetDBConnect( Error );
-		if ( 0 == pConn )
-		{
-			return -1;
-		}
-
-		my_ulonglong nRet = pConn->ExecuteSqlID( szSql, Error );
-
-		GiveBack( pConn );
-		return nRet;
-	}
-}
-=======
 #include "CDBConnPool.h"
 #include <boost/bind.hpp>
+#include "log.h"
 
 namespace YADB
 {
-	boost::lockfree::queue<_ASYNC_SQL_*, boost::lockfree::capacity<MAX_ASYNC_QUEQUE_CAPACITY>> __AsyncQueue;//异步执行无锁队列
+	boost::lockfree::queue<_ASYNC_SQL_*, boost::lockfree::capacity<MAX_ASYNC_QUEQUE_CAPACITY>> __AsyncQueue;//寮傛�鎵ц�鏃犻攣闃熷垪
 
 	CDBConnPool::CDBConnPool()
 	{
+		std_info("create pool...");
 		__pAsyncDBConn = 0;
 	}
 
@@ -405,7 +30,7 @@ namespace YADB
 			return 0;
 		}
 
-		//如果设置了预处理SQL要准备预处理
+		//濡傛灉璁剧疆浜嗛�澶勭悊SQL瑕佸噯澶囬�澶勭悊
 		if ( !ConnSetting.stmtSQL.empty() )
 		{
 			if ( !pConn->Preparestmt( ConnSetting.stmtSQL.c_str(), ConnErr ) )
@@ -422,6 +47,7 @@ namespace YADB
 
 	bool CDBConnPool::Create( const _DB_POOL_SETTING_& Setting, std::string& szError )
 	{
+		std_info(".Create...%s  %s %s %s..%d",Setting.Host.c_str(),Setting.User.c_str(),Setting.DBName.c_str(),Setting.CharSet.c_str(),Setting.PoolSize);
 		return Create(Setting,true,szError);
 	}
 
@@ -431,7 +57,7 @@ namespace YADB
 
 		if ( Setting.PoolSize < DCC_MIN_COUNT )
 		{
-			szError = "PoolSize is too small!";
+			szError = "CrCrxxxxxxxxxxxxeateeatCreateexxxxxxPoolSize is too small!";
 			return false;
 		}
 
@@ -442,7 +68,7 @@ namespace YADB
 		}
 
 		__Setting = Setting;
-		//检查连接池中是否已有连接数量
+		//妫€鏌ヨ繛鎺ユ睜涓�槸鍚﹀凡鏈夎繛鎺ユ暟閲�
 		if ((int)__IdleConnList.size() < __Setting.PoolSize)
 		{
 			for ( int i = 0; i < __Setting.PoolSize; i++ )
@@ -454,13 +80,13 @@ namespace YADB
 				}
 			}	
 		}
-		//是否已创建异步线程
+		//鏄�惁宸插垱寤哄紓姝ョ嚎绋�
 		if (bAsync || !__Running)
 		{
-			//创建异步执行线程
+			//鍒涘缓寮傛�鎵ц�绾跨▼
 			__CreateAsyncThrdConn();
 
-			//启动异步执行线程
+			//鍚�姩寮傛�鎵ц�绾跨▼
 			__StartAsyncThrd();
 		}		
 		return true;
@@ -470,13 +96,13 @@ namespace YADB
 	{
 		std::unique_lock<std::mutex> lock( __mtx );
 
-		//停止异步执行线程
+		//鍋滄�寮傛�鎵ц�绾跨▼
 		__StopAsyncThrd();
 
-		//??????????步执行线程连接
+		//??????????姝ユ墽琛岀嚎绋嬭繛鎺�
 		__DestroyAsyncThrdConn();
 
-		//把所有列表中的连接对象都关闭删除并清除列表
+		//鎶婃墍鏈夊垪琛ㄤ腑鐨勮繛鎺ュ�璞¢兘鍏抽棴鍒犻櫎骞舵竻闄ゅ垪琛�
 		CDBConnect* pConn = 0;
 		std::list<CDBConnect*>::iterator lit_conn;
 		for ( lit_conn = __BusyConnList.begin(); lit_conn != __BusyConnList.end(); lit_conn++ )
@@ -512,8 +138,8 @@ namespace YADB
 		}
 		else
 		{
-			//如果已经没有空闲连接,只要当前连接池数量没有超过最大连接数就创建一个临时连接
-			//这个判断无意义
+			//濡傛灉宸茬粡娌℃湁绌洪棽杩炴帴,鍙��褰撳墠杩炴帴姹犳暟閲忔病鏈夎秴杩囨渶澶ц繛鎺ユ暟灏卞垱寤轰竴涓�复鏃惰繛鎺�
+			//杩欎釜鍒ゆ柇鏃犳剰涔�
 			if ( __IdleConnList.size() < DCC_MAX_COUNT )
 			{
 				pConn = __CreateIdleConn( Error, true );
@@ -533,12 +159,12 @@ namespace YADB
 			}
 		}
 
-		//验证看数据库连接是否还有效
+		//楠岃瘉鐪嬫暟鎹�簱杩炴帴鏄�惁杩樻湁鏁�
 		if ( pConn )
 		{
 			if ( pConn->ConnctionTest( Error ) != 0 )
 			{
-				//重连一次
+				//閲嶈繛涓€娆�
 				_DB_CONN_SETTING_ ConnSetting = static_cast< _DB_CONN_SETTING_ >(__Setting);
 				pConn->Close();
 				int nRet = pConn->Connect( ConnSetting, Error );
@@ -565,7 +191,7 @@ namespace YADB
 
 		__BusyConnList.remove( pConn );
 
-		//如果是临时连接,直接删除不再放入到空闲连接列表中
+		//濡傛灉鏄�复鏃惰繛鎺�,鐩存帴鍒犻櫎涓嶅啀鏀惧叆鍒扮┖闂茶繛鎺ュ垪琛ㄤ腑
 		if ( pConn->IsTemp() )
 		{
 			delete pConn;
@@ -595,8 +221,8 @@ namespace YADB
 						if ( (my_ulonglong)-1 == llRes )
 						{
 							//Execute failed, write log...
-							printf( "Error,调用ExcuteRealSql失败,Err=%s\n", Error.c_str() );
-							//如果失败了看是不是数据库断开连接了,尝试重新连接一次
+							printf( "Error,璋冪敤ExcuteRealSql澶辫触,Err=%s\n", Error.c_str() );
+							//濡傛灉澶辫触浜嗙湅鏄�笉鏄�暟鎹�簱鏂�紑杩炴帴浜嗭紝灏濊瘯閲嶆柊杩炴帴涓€娆�
 							if ( __pAsyncDBConn->ConnctionTest( Error ) != 0 )
 							{
 								_DB_CONN_SETTING_ ConnSetting = static_cast< _DB_CONN_SETTING_ >(__Setting);
@@ -607,12 +233,12 @@ namespace YADB
 									Error = "Error,failed connect to database!";
 									//Connect failed, write log...
 									printf( "Error,failed connect to database,Err=%s\n", Error.c_str() );
-									//如果连接失败了休息一下
+									//濡傛灉杩炴帴澶辫触浜嗕紤鎭�竴涓�
 									boost::this_thread::sleep( boost::posix_time::milliseconds( 100 ) );
 								}
 							}
 
-							//如果执行失败,失败次数加一,失败次数小于最大失败次数放到队尾下次再执行
+							//濡傛灉鎵ц�澶辫触锛屽け璐ユ�鏁板姞涓€锛屽け璐ユ�鏁板皬浜庢渶澶уけ璐ユ�鏁版斁鍒伴槦灏句笅娆″啀鎵ц�
 							pData->FailedCount++;
 							if ( pData->FailedCount < MAX_ASYNC_EXEC_FAILED_COUNT )
 							{
@@ -632,7 +258,7 @@ namespace YADB
 			boost::this_thread::sleep_for( boost::chrono::milliseconds( 1 ) );
 		}
 
-		//线程退出
+		//绾跨▼閫€鍑�
 		__IsExited = true;
 	}
 
@@ -643,7 +269,7 @@ namespace YADB
 			return;
 		}
 
-		//等待异步执行线程退出
+		//绛夊緟寮傛�鎵ц�绾跨▼閫€鍑�
 		__Running = false;
 
 		while ( !__IsExited )
@@ -651,7 +277,7 @@ namespace YADB
 			boost::this_thread::sleep(boost::posix_time::millisec(1));
 		}
 
-		//把异步执行无锁队列中每个元素释放
+		//鎶婂紓姝ユ墽琛屾棤閿侀槦鍒椾腑姣忎釜鍏冪礌閲婃斁
 		_ASYNC_SQL_* pData = 0;
 		while ( __AsyncQueue.pop( pData ) )
 		{
@@ -673,7 +299,7 @@ namespace YADB
 	void CDBConnPool::__CreateAsyncThrdConn()
 	{
 		std::string ConnErr;
-		//先断开之前的连接
+		//鍏堟柇寮€涔嬪墠鐨勮繛鎺�
 		this->__DestroyAsyncThrdConn();
 
 		_DB_CONN_SETTING_ ConnSetting = static_cast< _DB_CONN_SETTING_ >(__Setting);
@@ -761,5 +387,3 @@ namespace YADB
 		return nRet;
 	}
 }
-
->>>>>>> 10da641ebe4222984b0724854edeb8088ac7c5a7

+ 74 - 76
db/db_api/CDBConnPool.h

@@ -4,19 +4,19 @@
 
 /**
 * @brief
-Êý¾Ý¿âÁ¬½Ó³ØÀà
+数据库连接池类
 
 * @version
 V 1.0.0
 
 * @author
-ÍõÒæ¿¡
+王益俊
 
 * @date
-´´½¨Ê±¼ä:  2018-04-17\n
+创建时间:  2018-04-17\n
 
 * @note
-2018-04-17  ´´½¨Àà¡£\n
+2018-04-17  创建类。\n
 
 * @warning
 
@@ -42,25 +42,24 @@ namespace YADB
 	class CDBConnPool
 	{
 	private:
-		std::list<CDBConnect*> __BusyConnList;//ÕýÔÚʹÓõÄÊý¾Ý¿âÁ¬½ÓÁбí
-		std::list<CDBConnect*> __IdleConnList;//ûÓÐʹÓõÄÊý¾Ý¿âÁ¬½ÓÁбí
-		_DB_POOL_SETTING_ __Setting;//Êý¾Ý¿âÁ¬½Ó³ØÉèÖÃ
-		std::mutex __mtx;//»¥³âÁ¿
-		boost::atomic<bool> __Running{ true };//Ïß³ÌÊÇ·ñÔËÐеıêʶ		
-		boost::atomic<bool> __IsExited{ false };//Ïß³ÌÊÇ·ñÒÑÍ˳öµÄ±êʶ
-		CDBConnect* __pAsyncDBConn;//Òì²½Ö´ÐÐÏß³ÌÓõÄÊý¾Ý¿âÁ¬½Ó
+		std::list<CDBConnect*> __BusyConnList;//正在使用的数据库连接列表
+		std::list<CDBConnect*> __IdleConnList;//没有使用的数据库连接列表
+		_DB_POOL_SETTING_ __Setting;//数据库连接池设置
+		std::mutex __mtx;//互斥量
+		boost::atomic<bool> __Running{ true };//线程是否运行的标识		
+		boost::atomic<bool> __IsExited{ false };//线程是否已退出的标识
+		CDBConnect* __pAsyncDBConn;//异步执行线程用的数据库连接
 	private:
 		/**
 
 		* @brief
-		´´½¨Ò»¸ö¿ÕÏÐÁ¬½Óº¯Êý¡£
-		* @param  [out] std::string& Error  ´íÎóÐÅÏ¢\n
-		* @param  [in] bool IsTemp  ´´½¨µÄÁ¬½ÓÊÇ·ñÊÇÁÙʱµÄ\n
-
-		* @return ·µ»Ø´´½¨µÄÁ¬½Ó
-		* @return  >0   ³É¹¦\n
-		* @return  ==0  ʧ°Ü\n
+		创建一个空闲连接函数。
+		* @param  [out] std::string& Error  错误信息\n
+		* @param  [in] bool IsTemp  创建的连接是否是临时的\n
 
+		* @return 返回创建的连接
+		* @return  >0   成功\n
+		* @return  ==0  失败\n
 		* @note
 
 		* @warning
@@ -70,11 +69,11 @@ namespace YADB
 		CDBConnect* __CreateIdleConn( std::string& Error, bool IsTemp = false );
 		/**
 		* @brief
-		´´½¨Òì²½Ö´ÐÐÏß³ÌËùÓÃÁ¬½Óº¯Êý¡£
+		创建异步执行线程所用连接函数。
 
-		* @param  ÎÞ\n
+		* @param  \n
 
-		* @return ÎÞ\n
+		* @return \n
 
 		* @note
 
@@ -85,11 +84,11 @@ namespace YADB
 		void __CreateAsyncThrdConn();
 		/**
 		* @brief
-		??????´´½¨Òì²½Ö´ÐÐÏß³ÌËùÓÃÁ¬½Óº¯Êý¡£
+		创建异步执行线程所用连接函数。
 
-		* @param  ÎÞ\n
+		* @param  \n
 
-		* @return ÎÞ\n
+		* @return \n
 
 		* @note
 
@@ -101,11 +100,11 @@ namespace YADB
 		void __DestroyAsyncThrdConn();
 		/**
 		* @brief
-		Æô¶¯Òì²½Ö´ÐÐÏ̺߳¯Êý¡£
+		启动异步执行线程函数。
 
-		* @param  ÎÞ\n
+		* @param  \n
 
-		* @return ÎÞ
+		* @return 
 
 		* @note
 
@@ -117,11 +116,11 @@ namespace YADB
 		void __StartAsyncThrd();
 		/**
 		* @brief
-		Í£Ö¹Òì²½Ö´ÐÐÏ̺߳¯Êý¡£
+		停止异步执行线程函数。
 
-		* @param  ÎÞ\n
+		* @param  \n
 
-		* @return ÎÞ
+		* @return 
 
 		* @note
 
@@ -134,11 +133,11 @@ namespace YADB
 	protected:
 		/**
 		* @brief
-		Òì²½Ö´ÐÐÏ̺߳¯Êý¡£
+		异步执行线程函数。
 
-		* @param  [in] CDBConnPool* pOwner  Ïß³ÌËùÊô¶ÔÏó\n
+		* @param  [in] CDBConnPool* pOwner  线程所属对象\n
 
-		* @return ÎÞ\n
+		* @return \n
 
 		* @note
 
@@ -147,20 +146,20 @@ namespace YADB
 		* @bug
 
 		*/
-		void _AsyncThreadFunc( CDBConnPool* pOwner );//Ï̺߳¯Êý
+		void _AsyncThreadFunc( CDBConnPool* pOwner );//线程函数
 	public:
 		CDBConnPool();
 		~CDBConnPool();
 		/**
 		* @brief
-		´´½¨Êý¾Ý¿âÁ¬½Ó³Øº¯Êý¡£
+		创建数据库连接池函数。
 
-		* @param  [in] const _DB_POOL_SETTING_& Setting  Êý¾Ý¿âÁ¬½Ó³ØÉèÖÃ\n
-		* @param  [out] std::string& Error  ´íÎóÐÅÏ¢\n
+		* @param  [in] const _DB_POOL_SETTING_& Setting  数据库连接池设置\n
+		* @param  [out] std::string& Error  错误信息\n
 
-		* @return ·µ»Ø´´½¨Êý¾Ý¿âÁ¬½Ó³ØÊÇ·ñ³É¹¦
-		* @return  true   ³É¹¦
-		* @return  false  ʧ°Ü
+		* @return 返回创建数据库连接池是否成功
+		* @return  true   成功
+		* @return  false  失败
 
 		* @note
 
@@ -173,11 +172,11 @@ namespace YADB
 		bool Create( const _DB_POOL_SETTING_& Setting,bool bAsync, std::string& szError );
 		/**
 		* @brief
-		¹Ø±ÕÏ̳߳غ¯Êý¡£
+		关闭线程池函数。
 
-		* @param  ÎÞ\n
+		* @param  \n
 
-		* @return  ÎÞ\n
+		* @return  \n
 
 		* @note
 
@@ -189,13 +188,13 @@ namespace YADB
 		void Close();
 		/**
 		* @brief
-		´ÓÁ¬½Ó³ØÖлñµÃÒ»¸öÊý¾Ý¿âÁ¬½Óº¯Êý¡£
+		从连接池中获得一个数据库连接函数。
 
-		* @param  [out] std::string& Error  ´íÎóÐÅÏ¢\n
+		* @param  [out] std::string& Error  错误信息\n
 
-		* @return ·µ»Ø»ñµÃÒ»¸öÊý¾Ý¿âÁ¬½ÓÊÇ·ñ³É¹¦
-		* @return  0 ʧ°Ü\n
-		* @return  !=0 »ñµÃµÄÊý¾Ý¿âÁ¬½Ó\n
+		* @return 返回获得一个数据库连接是否成功
+		* @return  0 失败\n
+		* @return  !=0 获得的数据库连接\n
 
 		* @note
 
@@ -207,11 +206,11 @@ namespace YADB
 		CDBConnect* GetDBConnect( std::string& Error );
 		/**
 		* @brief
-		¹é»¹Ò»¸öÊý¾Ý¿âÁ¬½Óµ½Á¬½Ó³ØÖк¯Êý¡£
+		归还一个数据库连接到连接池中函数。
 
-		* @param  [in] CDBConnect* pConn  Êý¾Ý¿âÁ¬½Ó\n
+		* @param  [in] CDBConnect* pConn  数据库连接\n
 
-		* @return  ÎÞ\n
+		* @return  \n
 
 		* @note
 
@@ -223,14 +222,13 @@ namespace YADB
 		void GiveBack( CDBConnect* pConn );
 		/**
 		* @brief
-		°ÑSQLÓï¾ä¼ÓÈëÒì²½Ö´ÐжÓÁк¯Êý¡£
-
-		* @param  [in] const std::string& strSQL  ÒªÖ´ÐеÄSQLÓï¾ä\n
+		把SQL语句加入异步执行队列函数。
 
-		* @return  ¼ÓÈëÒì²½Ö´ÐжÓÁÐÊÇ·ñ³É¹¦\n
-		* @return  true³É¹¦\n
-		* @return  falseʧ°Ü\n
+		* @param  [in] const std::string& strSQL  要执行的SQL语句\n
 
+		* @return  加入异步执行队列是否成功
+		* @return  true成功
+		* @return  false失败
 		* @note
 
 		* @warning
@@ -241,15 +239,15 @@ namespace YADB
 		bool PushAsync( const std::string& strSQL );
 		/**
 		* @brief
-		Ö´ÐÐSQLÓï¾ä·µ»Ø½á¹û¼¯º¯Êý¡£
+		执行SQL语句返回结果集函数。
 
-		* @param [in] const char *szSql  SQLÓï¾ä\n
-		* @param [out] CDBResultSet& DBRes  ½á¹û¼¯\n
-		* @param [out] std::string& Error  ´íÎóÐÅÏ¢\n
+		* @param [in] const char *szSql  SQL语句
+		* @param [out] CDBResultSet& DBRes  结果集
+		* @param [out] std::string& Error  错误信息
 
-		* @return ·µ»Ø²éѯÊÇ·ñ³É¹¦
-		* @return  true  ³É¹¦\n
-		* @return  false  ʧ°Ü\n
+		* @return 返回查询是否成功
+		* @return  true  成功
+		* @return  false  失败
 
 		* @note
 
@@ -262,14 +260,14 @@ namespace YADB
 		MYSQL_RES* Query( const char *szSql, std::string& Error );
 		/**
 		* @brief
-		Ö´ÐÐSQLÓï¾äº¯Êý¡£
+		执行SQL语句函数。
 
-		* @param [in] const char *szSql  SQLÓï¾ä\n
-		* @param [out] std::string& Error  ´íÎóÐÅÏ¢\n
+		* @param [in] const char *szSql  SQL语句
+		* @param [out] std::string& Error  错误信息
 
-		* @return ·µ»ØÓ°Ïìµ½µÄ¼Ç¼ÊýÁ¿
-		* @return  -1  ʧ°Ü\n
-		* @return  >=0  ³É¹¦\n
+		* @return 返回影响到的记录数量
+		* @return  -1  失败
+		* @return  >=0  成功
 
 		* @note
 
@@ -281,14 +279,14 @@ namespace YADB
 		my_ulonglong ExecuteSql( const char *szSql, std::string& Error );
 		/**
 		* @brief
-		Ö´ÐÐSQLÓï¾ä²¢»ñµÃIDµÄº¯Êý¡£
+		执行SQL语句并获得ID的函数。
 
-		* @param [in] const char *szSql  SQLÓï¾ä\n
-		* @param [out] std::string& Error  ´íÎóÐÅÏ¢\n
+		* @param [in] const char *szSql  SQL语句
+		* @param [out] std::string& Error  错误信息
 
-		* @return ·µ»Ø»ñµÃµÄID
-		* @return  <=0  ʧ°Ü\n
-		* @return  >0   ³É¹¦\n
+		* @return 返回获得的ID
+		* @return  <=0  失败
+		* @return  >0   成功
 
 		* @note
 

+ 5 - 5
db/db_api/CDBConnect.cpp

@@ -18,10 +18,10 @@ namespace YADB
 
 	bool CDBConnect::Connect( const _DB_CONN_SETTING_ & DBSetting, std::string & Error )
 	{
-		//创建
+		//鍒涘缓
 		__pConn = mysql_init( NULL );
 
-		//超时设置
+		//瓒呮椂璁剧疆
 		if ( mysql_options( __pConn, MYSQL_OPT_CONNECT_TIMEOUT, &(DBSetting.TimeOut) ) != 0 )
 		{
 			Error = "Failed to call mysql_options,";
@@ -30,7 +30,7 @@ namespace YADB
 			return false;
 		}
 
-		//设置字符集
+		//璁剧疆瀛楃�闆�
 		if ( mysql_set_character_set( __pConn, DBSetting.CharSet.c_str() ) != 0 )
 		{
 			Error = "Failed to call mysql_set_character_set,";
@@ -39,7 +39,7 @@ namespace YADB
 			return false;
 		}
 
-		//连接数据库
+		//杩炴帴鏁版嵁搴�
 		if ( !mysql_real_connect( __pConn, DBSetting.Host.c_str(), DBSetting.User.c_str(), DBSetting.PWD.c_str(), DBSetting.DBName.c_str(), 0, NULL, 0 ) )
 		{
 			Error = "Failed to connect database,";
@@ -47,7 +47,7 @@ namespace YADB
 			Error += GetLastError();
 			return false;
 		}
-		//依靠 mysql_ping 无法做到重连
+		//渚濋潬 mysql_ping 鏃犳硶鍋氬埌閲嶈繛
 		char value = 1;
 		mysql_options(__pConn, MYSQL_OPT_RECONNECT, &value);
 

+ 95 - 95
db/db_api/CDBConnect.h

@@ -1,18 +1,18 @@
 /**
 * @brief
-数据库连接类
+鏁版嵁搴撹繛鎺ョ被
 
 * @version
 V 1.0.0
 
 * @author
-王益俊
+鐜嬬泭淇�
 
 * @date
-创建时间:  2018-04-17\n
+鍒涘缓鏃堕棿:  2018-04-17\n
 
 * @note
-2018-04-17  创建类。\n
+2018-04-17  鍒涘缓绫汇€俓n
 
 * @warning
 
@@ -32,23 +32,23 @@ namespace YADB
 	class CDBConnect
 	{
 	private:
-		MYSQL * __pConn;//数据库连接
-		CDBResultSet __RessultSet;//结果集
-		bool __IsTemp;//是否是临时的(如果是临时使用的,归还到连接池中时会自动删除,以保持总体连接数不变)
-		MYSQL_STMT *__pstmt;//预处理
+		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
+		* @param  [in] const _DB_POOL_SETTING_& Setting  鏁版嵁搴撹繛鎺ヨ�缃甛n
+		* @param  [out] std::string& Error  閿欒�淇℃伅\n
 
-		* @return 返回连接数据库是否成功
-		* @return  true   成功\n
-		* @return  false  失败\n
+		* @return 杩斿洖杩炴帴鏁版嵁搴撴槸鍚︽垚鍔�
+		* @return  true   鎴愬姛\n
+		* @return  false  澶辫触\n
 
 		* @note
 
@@ -60,11 +60,11 @@ namespace YADB
 		bool Connect( const _DB_CONN_SETTING_& DBSetting, std::string& Error );
 		/**
 		* @brief
-		关闭连接函数。
+		鍏抽棴杩炴帴鍑芥暟銆�
 
-		* @param  无\n
+		* @param  鏃燶n
 
-		* @return  无\n
+		* @return  鏃燶n
 
 		* @note
 
@@ -76,13 +76,13 @@ namespace YADB
 		void Close();
 		/**
 		* @brief
-		测试连接函数。
+		娴嬭瘯杩炴帴鍑芥暟銆�
 
-		* @param [out] std::string& Error 错误信息\n
+		* @param [out] std::string& Error 閿欒�淇℃伅\n
 
-		* @return 返回测试连接是否成功
-		* @return  0  连接测试成功\n
-		* @return  !=0  连接测试失败\n
+		* @return 杩斿洖娴嬭瘯杩炴帴鏄�惁鎴愬姛
+		* @return  0  杩炴帴娴嬭瘯鎴愬姛\n
+		* @return  !=0  杩炴帴娴嬭瘯澶辫触\n
 
 		* @note
 
@@ -94,14 +94,14 @@ namespace YADB
 		int ConnctionTest( std::string& Error );
 		/**
 		* @brief
-		设置自动提交的函数。
+		璁剧疆鑷�姩鎻愪氦鐨勫嚱鏁般€�
 
-		* @param [in] bool Mode 是否是否自动提交\n
-		* @param [out] std::string& Error 错误信息\n
+		* @param [in] bool Mode 鏄�惁鏄�惁鑷�姩鎻愪氦\n
+		* @param [out] std::string& Error 閿欒�淇℃伅\n
 
-		* @return 返回设置自动提交是否成功
-		* @return  0  成功\n
-		* @return  !=0  失败\n
+		* @return 杩斿洖璁剧疆鑷�姩鎻愪氦鏄�惁鎴愬姛
+		* @return  0  鎴愬姛\n
+		* @return  !=0  澶辫触\n
 
 		* @note
 
@@ -113,13 +113,13 @@ namespace YADB
 		int AutoCommit( bool Mode, std::string& Error );
 		/**
 		* @brief
-		提交函数。
+		鎻愪氦鍑芥暟銆�
 
-		* @param [out] std::string& Error 错误信息\n
+		* @param [out] std::string& Error 閿欒�淇℃伅\n
 
-		* @return 返回提交是否成功
-		* @return  0  成功\n
-		* @return  !=0  失败\n
+		* @return 杩斿洖鎻愪氦鏄�惁鎴愬姛
+		* @return  0  鎴愬姛\n
+		* @return  !=0  澶辫触\n
 
 		* @note
 
@@ -131,13 +131,13 @@ namespace YADB
 		int Commit( std::string& Error  );
 		/**
 		* @brief
-		回滚函数。
+		鍥炴粴鍑芥暟銆�
 
-		* @param [out] std::string& Error  错误信息\n
+		* @param [out] std::string& Error  閿欒�淇℃伅\n
 
-		* @return 返回回滚是否成功
-		* @return  0  成功\n
-		* @return  !=0  失败\n
+		* @return 杩斿洖鍥炴粴鏄�惁鎴愬姛
+		* @return  0  鎴愬姛\n
+		* @return  !=0  澶辫触\n
 
 		* @note
 
@@ -149,14 +149,14 @@ namespace YADB
 		int RollBack( std::string& Error );
 		/**
 		* @brief
-		执行SQL语句返回结果集函数。
+		鎵ц�SQL璇�彞杩斿洖缁撴灉闆嗗嚱鏁般€�
 
-		* @param [in] const char *szSql  SQL语句\n
-		* @param [out] std::string& Error  错误信息\n
+		* @param [in] const char *szSql  SQL璇�彞\n
+		* @param [out] std::string& Error  閿欒�淇℃伅\n
 
-		* @return 返回结果集
-		* @return  0  失败\n
-		* @return  !=0  成功\n
+		* @return 杩斿洖缁撴灉闆�
+		* @return  0  澶辫触\n
+		* @return  !=0  鎴愬姛\n
 
 		* @note
 
@@ -168,14 +168,14 @@ namespace YADB
 		CDBResultSet* ExecuteQuery( const char *szSql, std::string& Error );
 		/**
 		* @brief
-		执行SQL语句返回mysql原始结果集函数。
+		鎵ц�SQL璇�彞杩斿洖mysql鍘熷�缁撴灉闆嗗嚱鏁般€�
 
-		* @param [in] const char *szSql  SQL语句\n
-		* @param [out] std::string& Error  错误信息\n
+		* @param [in] const char *szSql  SQL璇�彞\n
+		* @param [out] std::string& Error  閿欒�淇℃伅\n
 
-		* @return 返回的mysql原始结果集
-		* @return  ==0  失败\n
-		* @return  !=0  成功\n
+		* @return 杩斿洖鐨刴ysql鍘熷�缁撴灉闆�
+		* @return  ==0  澶辫触\n
+		* @return  !=0  鎴愬姛\n
 
 		* @note
 
@@ -187,14 +187,14 @@ namespace YADB
 		MYSQL_RES* Query( const char *szSql, std::string& Error );
 		/**
 		* @brief
-		执行SQL语句函数。
+		鎵ц�SQL璇�彞鍑芥暟銆�
 
-		* @param [in] const char *szSql  SQL语句\n
-		* @param [out] std::string& Error  错误信息\n
+		* @param [in] const char *szSql  SQL璇�彞\n
+		* @param [out] std::string& Error  閿欒�淇℃伅\n
 
-		* @return 返回影响到的记录数量
-		* @return  -1  失败\n
-		* @return  >=0  成功\n
+		* @return 杩斿洖褰卞搷鍒扮殑璁板綍鏁伴噺
+		* @return  -1  澶辫触\n
+		* @return  >=0  鎴愬姛\n
 
 		* @note
 
@@ -206,14 +206,14 @@ namespace YADB
 		my_ulonglong ExecuteSql( const char *szSql, std::string& Error );
 		/**
 		* @brief
-		执行SQL语句函数。
+		鎵ц�SQL璇�彞鍑芥暟銆�
 
-		* @param [in] const char *szSql  SQL语句\n
-		* @param [out] std::string& Error  错误信息\n
+		* @param [in] const char *szSql  SQL璇�彞\n
+		* @param [out] std::string& Error  閿欒�淇℃伅\n
 
-		* @return 返回影响到的记录数量
-		* @return  -1  失败\n
-		* @return  >=0  成功\n
+		* @return 杩斿洖褰卞搷鍒扮殑璁板綍鏁伴噺
+		* @return  -1  澶辫触\n
+		* @return  >=0  鎴愬姛\n
 
 		* @note
 
@@ -225,11 +225,11 @@ namespace YADB
 		my_ulonglong ExecuteRealSql( const char *szSql, std::string& Error );
 		/**
 		* @brief
-		获得最后一次错误信息函数。
+		鑾峰緱鏈€鍚庝竴娆¢敊璇�俊鎭�嚱鏁般€�
 
-		* @param 无\n
+		* @param 鏃燶n
 
-		* @return 返回最后一次错误
+		* @return 杩斿洖鏈€鍚庝竴娆¢敊璇�
 
 		* @note
 
@@ -241,13 +241,13 @@ namespace YADB
 		const char* GetLastError();
 		/**
 		* @brief
-		获得最后一次插入的ID函数。
+		鑾峰緱鏈€鍚庝竴娆℃彃鍏ョ殑ID鍑芥暟銆�
 
-		* @param [out] std::string& Error  错误信息\n
+		* @param [out] std::string& Error  閿欒�淇℃伅\n
 
-		* @return 返回最后一次插入的ID
-		* @return  -1  失败\n
-		* @return  >=0  成功\n
+		* @return 杩斿洖鏈€鍚庝竴娆℃彃鍏ョ殑ID
+		* @return  -1  澶辫触\n
+		* @return  >=0  鎴愬姛\n
 
 		* @note
 
@@ -259,11 +259,11 @@ namespace YADB
 		my_ulonglong GetLastInsertID( std::string& Error );
 		/**
 		* @brief
-		获得是否是临时的连接函数。
+		鑾峰緱鏄�惁鏄�复鏃剁殑杩炴帴鍑芥暟銆�
 
-		* @param 无\n
+		* @param 鏃燶n
 
-		* @return 返回是否是临时的
+		* @return 杩斿洖鏄�惁鏄�复鏃剁殑
 
 		* @note
 
@@ -275,14 +275,14 @@ namespace YADB
 		bool IsTemp();
 		/**
 		* @brief
-		准备stmt函数。
+		鍑嗗�stmt鍑芥暟銆�
 
-		* @param const char *szSql 预处理SQL语句\n
-		* @param [out] std::string& Error  错误信息\n
+		* @param const char *szSql 棰勫�鐞哠QL璇�彞\n
+		* @param [out] std::string& Error  閿欒�淇℃伅\n
 
-		* @return 返回准备stmt是否成功
-		* @return  false  失败\n
-		* @return  true  成功\n
+		* @return 杩斿洖鍑嗗�stmt鏄�惁鎴愬姛
+		* @return  false  澶辫触\n
+		* @return  true  鎴愬姛\n
 
 		* @note
 
@@ -294,15 +294,15 @@ namespace YADB
 		bool Preparestmt( const char *szSql, std::string& Error );
 		/**
 		* @brief
-		执行stmt函数。
+		鎵ц�stmt鍑芥暟銆�
 
-		* @param [in] MYSQL_BIND *stBinds  要执行的BIND\n
-		* @param [in] uint64_t *piId  执行后获得的ID\n
-		* @param [out] std::string& Error  错误信息\n
+		* @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
+		* @return 杩斿洖鎵ц�stmt鎴愬姛杩樻槸澶辫触
+		* @return  false  澶辫触\n
+		* @return  true  鎴愬姛\n
 
 		* @note
 
@@ -314,11 +314,11 @@ namespace YADB
 		bool stmtExcute( MYSQL_BIND *stBinds, uint64_t *piId, std::string& Error );
 		/**
 		* @brief
-		关闭stmt函数。
+		鍏抽棴stmt鍑芥暟銆�
 
-		* @param 无\n
+		* @param 鏃燶n
 
-		* @return 无\n
+		* @return 鏃燶n
 
 		* @note
 
@@ -330,14 +330,14 @@ namespace YADB
 		void stmtClose();
 		/**
 		* @brief
-		执行SQL语句并获得自动生成的ID函数。
+		鎵ц�SQL璇�彞骞惰幏寰楄嚜鍔ㄧ敓鎴愮殑ID鍑芥暟銆�
 
-		* @param [in] const char *szSql  SQL语句\n
-		* @param [out] std::string& Error  错误信息\n
+		* @param [in] const char *szSql  SQL璇�彞\n
+		* @param [out] std::string& Error  閿欒�淇℃伅\n
 
-		* @return 返回自动生成的ID
-		* @return  <1  失败\n
-		* @return  >=1  成功\n
+		* @return 杩斿洖鑷�姩鐢熸垚鐨処D
+		* @return  <1  澶辫触\n
+		* @return  >=1  鎴愬姛\n
 
 		* @note
 

+ 5 - 51
db/db_tool.cpp

@@ -26,7 +26,8 @@ namespace db_tool
 		return std::string(sql);
 	}
 
-    void save_attendance(const std::shared_ptr<card_location_base>& card_ptr)
+    void save_attendance(const std::shared_ptr<card_location_base>& card_ptr,
+                         const std::shared_ptr<area_hover>& area_hover_ptr)
     {
         char sql[LENGTH_SQL] = {0};
 
@@ -48,56 +49,9 @@ namespace db_tool
         std::string start_str = tool_time::to_str(start);
         std::string end_str = tool_time::to_str(end);
 
-        int landmarkid = 0;
-        int landmarkdirect=0;
-        double landmarkdist=0;
-        auto area_hover_ptr = card_ptr->get_area_hover();
-        if(area_hover_ptr)
-        {
-            landmarkid = area_hover_ptr->landmark_id;
-            landmarkdirect = area_hover_ptr->landmark_dir;
-            landmarkdist = area_hover_ptr->landmark_dis;
-        }
-
-        sprintf(sql, "CALL %s(%s, %d, '%s', '%s', %d, %d, %.3f);", call.c_str(),
-               type_id_to_str(card_ptr->m_type,card_ptr->m_id).c_str(),
-                card_ptr->m_id, start_str.c_str(), end_str.c_str(),
-                landmarkid, landmarkdirect, landmarkdist);
-
-        PushAsync(sql);
-    }
-
-    void save_attendance(const std::shared_ptr<card_location_base>& card_ptr,
-                         bool is_attendance, std::chrono::system_clock::time_point& attendance_start_time)
-    {
-        char sql[LENGTH_SQL] = {0};
-
-        std::string call("add_att_staff");
-        if(card_ptr->is_vehicle())//车卡
-        {
-            call="add_att_vehicle";
-        }
-
-        auto start = attendance_start_time;
-        auto end = attendance_start_time;
-        if(!is_attendance)//考勤结束时间
-        {
-            end = std::chrono::system_clock::now();
-        }
-
-        std::string start_str = tool_time::to_str(start);
-        std::string end_str = tool_time::to_str(end);
-
-        int landmarkid = 0;
-        int landmarkdirect=0;
-        double landmarkdist=0;
-        auto area_hover_ptr = card_ptr->get_area_hover();
-        if(area_hover_ptr)
-        {
-            landmarkid = area_hover_ptr->landmark_id;
-            landmarkdirect = area_hover_ptr->landmark_dir;
-            landmarkdist = area_hover_ptr->landmark_dis;
-        }
+        int landmarkid = area_hover_ptr->landmark_id;
+        int landmarkdirect=area_hover_ptr->landmark_dir;
+        double landmarkdist=area_hover_ptr->landmark_dis;
 
         sprintf(sql, "CALL %s(%s, %d, '%s', '%s', %d, %d, %.3f);", call.c_str(),
                type_id_to_str(card_ptr->m_type,card_ptr->m_id).c_str(),

+ 2 - 2
db/db_tool.h

@@ -4,12 +4,12 @@
 #include <memory>
 #include<chrono>
 struct card_location_base;
+struct area_hover;
 namespace db_tool
 {
     void PushAsync(const char* sql);
-    void save_attendance(const std::shared_ptr<card_location_base>& card_ptr);
     void save_attendance(const std::shared_ptr<card_location_base>& card_ptr,
-                         bool is_attendance, std::chrono::system_clock::time_point& attendance_start_time);
+                                        const std::shared_ptr<area_hover>& area_hover_ptr);
 }
 
 #endif

+ 2 - 1
main.cpp

@@ -46,7 +46,7 @@ struct Init_Setting
         DBSetting.TimeOut = config.get("db.conn_timeout",5);
         DBSetting.PoolSize = config.get("db.pool_size",30);
         _mysql_init(DBSetting);
-
+		std_info("....%s  %s %s %s..%d",DBSetting.Host.c_str(),DBSetting.User.c_str(),DBSetting.DBName.c_str(),DBSetting.CharSet.c_str(),DBSetting.PoolSize);
 		CYaSetting::Init_sys_setting();
 
         sit_list::instance()->load_from_db();
@@ -93,6 +93,7 @@ struct Init_Setting
     void _mysql_init(YADB::_DB_POOL_SETTING_ &dps)
     {
         std::string szError = "";
+		std_info("....%s  %s %s %s..%d",dps.Host.c_str(),dps.User.c_str(),dps.DBName.c_str(),dps.CharSet.c_str(),dps.PoolSize);
         //创建连接池
         if ( !sDBConnPool.Create( dps, szError ) )
         {

+ 3 - 3
module_service/area_business_car_attendance.cpp

@@ -44,7 +44,7 @@ void area_business_car_attendance::on_enter(const std::shared_ptr<area_hover>&ar
     //考勤结束
     mine_tool_ptr->m_is_attendance=false;
     //作为一条结束考勤记录保存到数据库
-    db_tool::save_attendance(card_ptr);
+    db_tool::save_attendance(card_ptr, area_hover_ptr);
 
     //save_attendance(card_ptr, area_hover_ptr);
 
@@ -63,7 +63,7 @@ void area_business_car_attendance::on_hover(const std::shared_ptr<area_hover>&a,
 
 }
 //记录离开考勤区域信息,开始考勤
-void area_business_car_attendance::on_leave(const std::shared_ptr<area_hover>&a,
+void area_business_car_attendance::on_leave(const std::shared_ptr<area_hover>&area_hover_ptr,
                                             const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data> ptr)
 {
     if(!card_ptr->is_vehicle())
@@ -80,7 +80,7 @@ void area_business_car_attendance::on_leave(const std::shared_ptr<area_hover>&a,
         mine_tool_ptr->m_attendance_start_time=std::chrono::system_clock::now();
 
         //作为一条开始考勤记录保存到数据库
-        db_tool::save_attendance(card_ptr);
+        db_tool::save_attendance(card_ptr, area_hover_ptr);
 
         //                log_info("车卡考勤开始:卡id=%d,卡type=%d,区域id=%d, stat_attendance=%d",
         //                         card_ptr->m_id, card_ptr->m_type,

+ 4 - 4
module_service/area_business_person_attendance.cpp

@@ -31,7 +31,7 @@ area_business_person_attendance::area_business_person_attendance()
 
 
 //记录进入时间等信息,结束考勤,根据离开的时间和距离,判断是否记录一条新的考勤记录
-void area_business_person_attendance::on_enter(const std::shared_ptr<area_hover>&a,
+void area_business_person_attendance::on_enter(const std::shared_ptr<area_hover>&area_hover_ptr,
                                                const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data>&ptr)
 {
     if(!card_ptr->is_person())
@@ -47,7 +47,7 @@ void area_business_person_attendance::on_enter(const std::shared_ptr<area_hover>
         mine_tool_ptr->m_attendance_start_time=std::chrono::system_clock::now();
 
         //作为一条开始考勤记录保存到数据库
-        db_tool::save_attendance(card_ptr);
+        db_tool::save_attendance(card_ptr, area_hover_ptr);
 
         //        log_info("人卡考勤开始:卡id=%d,卡type=%d,分站id=%d,分站reader_type_id=%d,stat_attendance=%d",
         //                 card_ptr->m_id, card_ptr->m_type,
@@ -69,7 +69,7 @@ void area_business_person_attendance::on_hover(const std::shared_ptr<area_hover>
 
 }
 //记录离开考勤区域信息,开始考勤
-void area_business_person_attendance::on_leave(const std::shared_ptr<area_hover>&a,
+void area_business_person_attendance::on_leave(const std::shared_ptr<area_hover>&area_hover_ptr,
                                                const std::shared_ptr<card_location_base>&card_ptr,std::shared_ptr<business_data> ptr)
 {
     if(!card_ptr->is_person())
@@ -87,7 +87,7 @@ void area_business_person_attendance::on_leave(const std::shared_ptr<area_hover>
     mine_tool_ptr->m_is_attendance=false;
 
     //作为一条结束考勤记录保存到数据库
-    db_tool::save_attendance(card_ptr);
+    db_tool::save_attendance(card_ptr, area_hover_ptr);
 
     rapidjson::Document doc(rapidjson::kObjectType);
     rapidjson::Value datas(rapidjson::kArrayType);

+ 32 - 3
module_service/module_web.cpp

@@ -5,6 +5,7 @@
 #include"area_business_person_attendance.h"
 #include"module_meta_date_changed.h"
 #include"common_tool.h"
+#include"event.h"
 
 #include"log.h"
 
@@ -77,7 +78,7 @@ void module_web::response_login()
 
     //所有告警
     std::vector<std::shared_ptr<ya_event>> arr;
-    get_all_events(arr);
+    _get_all_events(arr);
     if(!arr.empty())
     {
         tool_json::push_back(nodes, event_list::evs_to_json(arr), allocator);
@@ -96,11 +97,11 @@ void module_web::response_login()
 void module_web::run()
 {
     std::vector<std::shared_ptr<ya_event>> arr;
-    get_all_events(arr);
+    _get_all_events(arr);
 
     if(!arr.empty())//发送给web端
     {
-        delete_end(arr);
+        _delete_end(arr);
 
         swsClientMgr.send(JSON_CMD_VALUE_PUSH, event_list::evs_to_json(arr));
     }
@@ -112,6 +113,34 @@ void module_web::run()
     }
 }
 
+void module_web::_get_all_events(std::vector<std::shared_ptr<ya_event>>& arr)
+{
+    auto _map = event_list::instance()->m_map;
+    auto it_map = _map.begin();
+    for(;it_map!=_map.end();++it_map)
+    {
+        arr.push_back(it_map->second);
+    }
+}
+
+///在全局列表中删除已经处理或结束了的告警
+void module_web::_delete_end(std::vector<std::shared_ptr<ya_event>>& arr)
+{
+    std::vector<uint64_t> todelete;
+    auto arr_iter = arr.begin();
+    for(;arr_iter!=arr.end();++arr_iter)
+    {
+        if((*arr_iter)->is_end())//删除掉已经处理的
+        {
+            todelete.push_back((*arr_iter)->get_list_id());
+        }
+    }
+
+    if(todelete.size())
+    {
+        event_list::instance()->remove(todelete);
+    }
+}
 
 
 

+ 5 - 27
module_service/module_web.h

@@ -14,11 +14,13 @@
 #include "rapidjson/document.h"
 
 #include"config_file.h"
-#include"event.h"
+
 #include"module_singleton_base.h"
 #include"module_i_thread.h"
 #include "websocket/wsClientMgr.h"
 
+struct ya_event;
+
 class module_web : public i_thread, public singleton_base<module_web>
 {
 private:
@@ -66,34 +68,10 @@ private:
     void run();
 
     ///获取所有的告警事件
-    void get_all_events(std::vector<std::shared_ptr<ya_event>>& arr)
-    {
-        auto _map = event_list::instance()->m_map;
-        auto it_map = _map.begin();
-        for(;it_map!=_map.end();++it_map)
-        {
-            arr.push_back(it_map->second);
-        }
-    }
+    void _get_all_events(std::vector<std::shared_ptr<ya_event>>& arr);
 
     ///在全局列表中删除已经处理或结束了的告警
-    void delete_end(std::vector<std::shared_ptr<ya_event>>& arr)
-    {
-        std::vector<uint64_t> todelete;
-        auto arr_iter = arr.begin();
-        for(;arr_iter!=arr.end();++arr_iter)
-        {
-            if((*arr_iter)->is_end())//删除掉已经处理的
-            {
-                todelete.push_back((*arr_iter)->get_list_id());
-            }
-        }
-
-        if(todelete.size())
-        {
-            event_list::instance()->remove(todelete);
-        }
-    }
+    void _delete_end(std::vector<std::shared_ptr<ya_event>>& arr);
 };
 
 

TEMPAT SAMPAH
path


+ 0 - 338
ya_event.h

@@ -1,338 +0,0 @@
-#ifndef YA_EVENT_H
-#define YA_EVENT_H
-
-/**
- * @brief 告警事件类型
- * @author 戴月腾
- * @date 2018-09-24
- */
-
-#include<map>
-#include<chrono>
-#include<memory>
-#include"write-copy.h"
-#include"log.h"
-#include "db_api/CDBSingletonDefine.h"
-#include "card.h"
-#include"common_tool.h"
-#include "tool_time.h"
-#include "db_tool.h"
-#include <area.h>
-#include "ant.h"
-
-/**
- * @brief 事件状态
- */
-enum EVENT_STATUS
-{
-    ///事件开始
-    ES_START = 0,
-    ///呼救已处理状态
-    ES_DEAL_HELP = 1,
-    ///事件结束
-    ES_END = 100
-};
-
-enum EVENT_TYPE{ // 事件类型
-    ET_UNKNOWN = 0,
-	ET_OVER_COUNT_PERSON = 1, // 井下人员超员pit_module/CPicardmanager
-	ET_OVER_COUNT_VEHICLE = 2,    // 井下车辆超员pit_module/CPicardmanager
-
-    ET_AREA_OVER_COUNT_PERSON = 3,	// 区域人员超员
-    ET_AREA_OVER_COUNT_VEHICLE = 4,	// 区域车辆超员
-	ET_READER_ERROR = 6,
-    ET_CARD_LOW_POWER_SERIOUS = 12, // 电量极低
-
-    ET_CARD_OVER_TIME_PERSON = 13, // 人员井下超时pit_module/CPicardmanager
-	ET_CARD_OVER_TIME_VEHICLE = 14, // 车辆井下超时pit_module/CPicardmanager
-
-    ET_CARD_AREA_OVER_TIME_PERSON = 15, // 人员区域超时
-    ET_CARD_AREA_OVER_TIME_VEHICLE = 16, // 车辆区域超时
-    ET_CARD_AREA_LIMIT_PERSON = 17, // 人员进入限制区域
-    ET_CARD_AREA_LIMIT_VEHICLE = 18, // 车辆进入限制区域
-    ET_CARD_AREA_FORBIDDEN_PERSON = 19,  // 人员进入禁止区域
-    ET_CARD_AREA_FORBIDDEN_VEHICLE = 20, // 车辆进入禁止区域
-    ET_CARD_OVER_SPEED = 21, // 车辆超速
-    ET_CARD_HELP = 24, // 人员呼救
-
-    CARD_EVENT_COUNT_MAX,
-};
-
-/**
- * @brief 对象类型
- */
-enum OBJECT_TYPE
-{
-    ///矿井
-    OT_MINE = 1,
-    ///区域
-    OT_AREA = 2,
-    ///分站
-    OT_DEVICE_READER = 4,
-    ///标识卡,包括人员、车辆、自组网等
-    OT_CARD = 9,
-};
-
-/**
- * @brief 告警事件
- */
-struct ya_event
-{
-private:
-    uint64_t m_ev_id;
-public:
-    ya_event(uint64_t e_id):m_cur_time(std::chrono::system_clock::now())
-    {
-        m_ev_id = e_id;
-
-        m_obj_id = "";
-        m_map_id = 0;
-        m_area_id = 0;
-        x = 0;
-        y = 0;
-        m_limit_value = 0;
-        m_cur_value = 0;
-        m_desc = "";
-        m_landmarkid = 0;
-        m_landmarkdirect = 0;
-        m_landmarkdist = 0;
-
-        m_status=ES_START;
-        m_is_display=true;
-    }
-    ~ya_event(){}
-public:
-    ///告警状态,开始、结束
-    EVENT_STATUS m_status;
-
-    ///告警类型
-    EVENT_TYPE m_ev_type;
-    ///告警对象类型
-    OBJECT_TYPE m_obj_type;
-    /// 告警对象编号,与告警对象类型对应,如告警对象类型为分站,此字段为分站编号
-    std::string m_obj_id;
-    ///当前时间,为告警事件的触发时间,如果状态为开始,则表示开始时间,否则为结束时间
-    std::chrono::system_clock::time_point m_cur_time;
-
-    ///告警所在地图
-    int m_map_id;
-    ///告警所在区域
-    int m_area_id;
-    ///位置
-    double x;
-    ///位置
-    double y;
-    ///告警阈值
-    double m_limit_value;
-    ///当前值
-    double m_cur_value;
-    ///描述
-    std::string m_desc;
-
-    /// 地标信息
-    int m_landmarkid;
-    /// 与地标的距离
-    double m_landmarkdist;
-    /// 所处地标的方向
-    int m_landmarkdirect;
-
-    bool m_is_display;
-
-    bool is_end()
-    {
-        return ES_END == m_status;
-    }
-
-    ///作为事件map列表的id,方便查找;(obj_type<<32| obj_id)
-    uint64_t get_list_id();
-
-    uint64_t get_id(){return m_ev_id;}
-};
-typedef std::shared_ptr<ya_event> event_ptr;
-typedef std::map<uint64_t, std::shared_ptr<ya_event>> event_map;
-typedef std::shared_ptr<event_map> event_map_ptr;
-
-
-struct event_list:single_base<event_list,uint64_t,std::shared_ptr<ya_event>>
-{
-public:
-    ///作为事件map列表的id,方便查找;(ev_type<<48 | obj_type<<40 |  obj_id_type<<32 | obj_id)
-    static uint64_t to_list_id(EVENT_TYPE ev_type, OBJECT_TYPE obj_type, int obj_id_type, uint32_t obj_id)
-    {
-        return (static_cast<uint64_t>(ev_type)<<48)|(static_cast<uint64_t>(obj_type)<<40)
-                |(static_cast<uint64_t>(obj_id_type)<<32)|static_cast<uint64_t>(obj_id);
-    }
-    ///创建井下警告
-    static event_ptr create_event_mine(int objid, EVENT_TYPE ev_type)
-    {
-        return create_event(OT_MINE, objid, 0, ev_type);
-    } 
-    ///创建区域警告
-    static event_ptr create_event_area(int area_id, EVENT_TYPE ev_type)
-    {
-        return create_event(OT_AREA, area_id, 0, ev_type);
-    }
-
-    static event_ptr create_event_reader(int reader_id, EVENT_TYPE ev_type)
-    {
-        return create_event(OT_DEVICE_READER, reader_id, 0, ev_type);
-    }
-    ///创建与卡有关的警告,需要卡类型
-    static event_ptr create_event_card(uint32_t card_id, int32_t card_type, EVENT_TYPE ev_type)
-    {
-        return create_event(OT_CARD, static_cast<int32_t>(card_id), card_type, ev_type);
-    }
-
-    static void copy_event(const std::shared_ptr<card_location_base> card_ptr, event_ptr ev_ptr)
-    {
-        ev_ptr->x = card_ptr->x;
-        ev_ptr->y = card_ptr->y;
-        ev_ptr->m_cur_time = std::chrono::system_clock::now();
-        ev_ptr->m_is_display = card_ptr->m_display;
-
-        auto hover = card_ptr->get_area_hover();
-        if(nullptr!=hover)
-        {
-            ev_ptr->m_area_id =  hover->m_area->id();
-            ev_ptr->m_map_id = hover->m_area->mapid();
-
-            ev_ptr->m_landmarkid = hover->landmark_dir;
-            ev_ptr->m_landmarkdist = hover->landmark_dis;
-            ev_ptr->m_landmarkdirect = hover->landmark_dir;
-        }
-    }
-
-    static void copy_event(const std::shared_ptr<area> area_ptr, event_ptr ev_ptr)
-    {
-        ev_ptr->m_cur_time = std::chrono::system_clock::now();
-        ev_ptr->m_is_display = true;
-
-        ev_ptr->m_area_id =  area_ptr->id();
-        ev_ptr->m_map_id = area_ptr->mapid();
-    }
-    static void copy_event(const std::shared_ptr<site> site_ptr, event_ptr ev_ptr)
-    {
-        ev_ptr->m_cur_time = std::chrono::system_clock::now();
-        ev_ptr->m_is_display = true;
-
-        ev_ptr->m_area_id =  site_ptr->m_area_id;
-        ev_ptr->m_map_id = site_ptr->m_map_id;
-        ev_ptr->x = site_ptr->x;
-        ev_ptr->y = site_ptr->y;
-    }
-
-
-    std::shared_ptr<ya_event> get_event_card(uint32_t card_id, int card_type, EVENT_TYPE ev_type)
-    {
-        return base::get(to_list_id(ev_type, OT_CARD, card_type, card_id));
-    }
-
-    std::shared_ptr<ya_event> get_event_area(int32_t area_id, EVENT_TYPE ev_type)
-    {
-        return base::get(to_list_id(ev_type, OT_AREA, 0, static_cast<uint32_t>(area_id)));
-    }
-
-    std::shared_ptr<ya_event> get_event_reader(int32_t reader_id, EVENT_TYPE ev_type)
-    {
-        return base::get(to_list_id(ev_type,OT_DEVICE_READER, 0, static_cast<uint32_t>(reader_id)));
-    }
-    void load_his_data_from_db();
-
-    static void save_event(const event_ptr ev_ptr)
-    {
-        char sql[LENGTH_SQL] = {'\0'};
-
-        std::string _time = tool_time::to_str_ex(ev_ptr->m_cur_time);
-
-        sprintf(sql,
-                "INSERT IGNORE INTO his_event_data(event_id, stat, event_type_id, obj_type_id, obj_id, \
-                map_id, area_id, limit_value, cur_value, x, y, cur_time, description, \
-                landmark_id, landmark_dist,direction_mapper_id )\
-                VALUES(%ld, %d, %d, %d, %s, %d, %d, %.2f, %.2f, %f, %f, '%s', '%s', %d, %10.3f, %d);",
-        ev_ptr->get_id(), ev_ptr->m_status, ev_ptr->m_ev_type, ev_ptr->m_obj_type, ev_ptr->m_obj_id.c_str(),
-                ev_ptr->m_map_id, ev_ptr->m_area_id, ev_ptr->m_limit_value, ev_ptr->m_cur_value, ev_ptr->x, ev_ptr->y,
-                _time.c_str(), ev_ptr->m_desc.c_str(),
-                ev_ptr->m_landmarkid, ev_ptr->m_landmarkdist, ev_ptr->m_landmarkdirect);
-
-        db_tool::PushAsync(sql);
-    }
-
-    ~event_list(){}
-
-    static std::string ev_to_json(std::shared_ptr<ya_event> ev_ptr)
-    {
-        std::vector<std::shared_ptr<ya_event>> evs;
-        evs.push_back(ev_ptr);
-        return evs_to_json(evs);
-    }
-
-    static std::string evs_to_json(std::vector<std::shared_ptr<ya_event>> arr)
-    {
-        rapidjson::Document doc(rapidjson::kObjectType);
-        rapidjson::Value data(rapidjson::kArrayType);
-        rapidjson::Document::AllocatorType& allocator=doc.GetAllocator();
-
-        auto it=arr.begin();
-        for(;it!=arr.end();++it)
-        {
-            if((*it)->m_is_display)
-            {
-                ev_to_node(*it, allocator, data);
-            }
-        }
-
-        doc.AddMember(JSON_ROOT_KEY_CMD,JSON_CMD_VALUE_EVENT, allocator);
-        doc.AddMember(JSON_ROOT_KEY_VERSION,INTERFACE_VERSION, allocator);
-        doc.AddMember(JSON_ROOT_KEY_DATA,data, allocator);
-
-        rapidjson::StringBuffer sb;
-        rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb);
-        doc.Accept(writer);
-
-        return sb.GetString();
-    }
-
-private:
-    static void ev_to_node(std::shared_ptr<ya_event> ev_ptr,
-                           rapidjson::Document::AllocatorType& allocator,
-                           rapidjson::Value& out_data)
-    {
-        rapidjson::Value ev(rapidjson::kObjectType);
-
-        ev.AddMember(JSON_KEY_EVENT_EVENT_ID,ev_ptr->get_id(), allocator);
-        ev.AddMember(JSON_KEY_EVENT_STATUS,ev_ptr->m_status, allocator);
-
-        ev.AddMember(JSON_KEY_EVENT_TYPE_ID,ev_ptr->m_ev_type, allocator);
-        ev.AddMember(JSON_KEY_EVENT_OBJ_TYPE_ID,ev_ptr->m_obj_type, allocator);
-
-        tool_json::add_member(ev, JSON_KEY_EVENT_OBJ_ID, ev_ptr->m_obj_id, allocator);
-        ev.AddMember(JSON_KEY_EVENT_MAP_ID,ev_ptr->m_map_id, allocator);
-        ev.AddMember(JSON_KEY_EVENT_AREA_ID,ev_ptr->m_area_id, allocator);
-        ev.AddMember(JSON_KEY_EVENT_X,ev_ptr->x, allocator);
-        ev.AddMember(JSON_KEY_EVENT_Y,ev_ptr->y, allocator);
-
-        ev.AddMember(JSON_KEY_EVENT_LIMIT_VALUE,ev_ptr->m_limit_value, allocator);
-        ev.AddMember(JSON_KEY_EVENT_CUR_VALUE,ev_ptr->m_cur_value, allocator);
-        ev.AddMember(JSON_KEY_EVENT_CUR_TIME,tool_time::to_ms(ev_ptr->m_cur_time), allocator);
-
-        ev.AddMember(JSON_KEY_EVENT_LANDMARK_ID,ev_ptr->m_landmarkid, allocator);
-        ev.AddMember(JSON_KEY_EVENT_LANDMARK_DIRECTION,ev_ptr->m_landmarkdirect, allocator);
-        ev.AddMember(JSON_KEY_EVENT_LANDMARK_DISTANCE,ev_ptr->m_landmarkdist, allocator);
-
-        out_data.PushBack(ev, allocator);
-    }
-
-private:
-    static event_ptr create_event(OBJECT_TYPE obj_type, int obj_id, int type, EVENT_TYPE ev_type)
-    {
-        auto ev_ptr = std::make_shared<ya_event>(tool_time::now_to_us());
-
-        ev_ptr->m_ev_type = ev_type;
-        ev_ptr->m_obj_type = obj_type;
-        ev_ptr->m_obj_id = tool_other::type_id_to_str(type, obj_id);
-
-        return ev_ptr;
-    }
-};
-
-#endif // YA_EVENT_H