1+ #include " pch.h"
2+ #include " MemoryCache_DBUser.h"
3+ /* *******************************************************************
4+ // Created: 2025/01/17 10:09:09
5+ // File Name: D:\XEngine_MQService\XEngine_Source\MQCore_MemoryCache\MemoryCache_DBUser\MemoryCache_DBUser.cpp
6+ // File Path: D:\XEngine_MQService\XEngine_Source\MQCore_MemoryCache\MemoryCache_DBUser
7+ // File Base: MemoryCache_DBUser
8+ // File Ext: cpp
9+ // Project: XEngine(网络通信引擎)
10+ // Author: qyt
11+ // Purpose: 数据库高速缓存
12+ // History:
13+ *********************************************************************/
14+ CMemoryCache_DBUser::CMemoryCache_DBUser ()
15+ {
16+ }
17+ CMemoryCache_DBUser::~CMemoryCache_DBUser ()
18+ {
19+
20+ }
21+ // ////////////////////////////////////////////////////////////////////////
22+ // 公有函数
23+ // ////////////////////////////////////////////////////////////////////////
24+ /* *******************************************************************
25+ 函数名称:MemoryCache_DBUser_Init
26+ 函数功能:初始化高速缓存管理器
27+ 参数.一:nTimeLast
28+ In/Out:In
29+ 类型:整数型
30+ 可空:N
31+ 意思:允许的最后更新时间存在秒数
32+ 参数.二:nTimeStart
33+ In/Out:In
34+ 类型:整数型
35+ 可空:N
36+ 意思:允许的最大保留时间
37+ 返回值
38+ 类型:逻辑型
39+ 意思:是否成功
40+ 备注:
41+ *********************************************************************/
42+ bool CMemoryCache_DBUser::MemoryCache_DBUser_Init (int nTimeLast, int nTimeStart, CALLBACK_MESSAGEQUEUE_MODULE_DATABASE_CACHE fpCall_MemoryCache, XPVOID lParam /* = NULL */ )
43+ {
44+ MemoryCache_IsErrorOccur = false ;
45+
46+ bIsRun = true ;
47+
48+ m_nTimeLast = nTimeLast;
49+ m_nTimeStart = nTimeStart;
50+ m_lParam = lParam;
51+ lpCall_MemoryCache = fpCall_MemoryCache;
52+
53+ pSTDThread_Query = std::make_unique<std::thread>(DBModule_MQUser_TimeThread, this );
54+ if (NULL == pSTDThread_Query)
55+ {
56+ MemoryCache_IsErrorOccur = true ;
57+ MemoryCache_dwErrorCode = ERROR_XENGINE_MQCORE_MEMORYCACHE_DBDATA_THREAD;
58+ return false ;
59+ }
60+ return true ;
61+ }
62+ /* *******************************************************************
63+ 函数名称:MemoryCache_DBUser_SetHandle
64+ 函数功能:设置句柄
65+ 参数.一:xhDBSQL
66+ In/Out:In
67+ 类型:句柄
68+ 可空:N
69+ 意思:数据库句柄
70+ 返回值
71+ 类型:逻辑型
72+ 意思:是否成功
73+ 备注:
74+ *********************************************************************/
75+ bool CMemoryCache_DBUser::MemoryCache_DBUser_SetHandle (XNETHANDLE xhDBSQL)
76+ {
77+ MemoryCache_IsErrorOccur = false ;
78+
79+ m_xhDBSQL = xhDBSQL;
80+
81+ return true ;
82+ }
83+ /* *******************************************************************
84+ 函数名称:MemoryCache_DBUser_Destory
85+ 函数功能:销毁高速缓存管理器
86+ 返回值
87+ 类型:逻辑型
88+ 意思:是否成功
89+ 备注:
90+ *********************************************************************/
91+ bool CMemoryCache_DBUser::MemoryCache_DBUser_Destory ()
92+ {
93+ MemoryCache_IsErrorOccur = false ;
94+
95+ bIsRun = false ;
96+ if (NULL != pSTDThread_Query)
97+ {
98+ pSTDThread_Query->join ();
99+ }
100+ return true ;
101+ }
102+ /* *******************************************************************
103+ 函数名称:MemoryCache_DBUser_DataInsert
104+ 函数功能:插入一条数据到高速缓存
105+ 参数.一:pSt_DBUserInfo
106+ In/Out:In
107+ 类型:数据结构指针
108+ 可空:N
109+ 意思:输入要插入的信息
110+ 返回值
111+ 类型:逻辑型
112+ 意思:是否成功
113+ 备注:
114+ *********************************************************************/
115+ bool CMemoryCache_DBUser::MemoryCache_DBUser_DataInsert (XENGINE_PROTOCOL_USERINFO* pSt_DBUserInfo)
116+ {
117+ MemoryCache_IsErrorOccur = false ;
118+
119+ if (NULL == pSt_DBUserInfo)
120+ {
121+ MemoryCache_IsErrorOccur = true ;
122+ MemoryCache_dwErrorCode = ERROR_XENGINE_MQCORE_MEMORYCACHE_DBDATA_PARAMENT;
123+ return false ;
124+ }
125+
126+ st_LockerQuery.lock ();
127+ auto stl_MapIterator = stl_MapQuery.find (pSt_DBUserInfo->tszUserName );
128+ if (stl_MapIterator == stl_MapQuery.end ())
129+ {
130+ MEMORYCACHE_DBUSER st_DBInfo = {};
131+
132+ st_DBInfo.nTimeStart = time (NULL );
133+ st_DBInfo.st_DBUserInfo = *pSt_DBUserInfo;
134+ stl_MapQuery[pSt_DBUserInfo->tszUserName ] = st_DBInfo;
135+ }
136+ else
137+ {
138+ stl_MapIterator->second .st_DBUserInfo = *pSt_DBUserInfo;
139+ }
140+ st_LockerQuery.unlock ();
141+ return true ;
142+ }
143+ /* *******************************************************************
144+ 函数名称:MemoryCache_DBUser_DataQuery
145+ 函数功能:查询高速缓存
146+ 参数.一:pSt_DBUserInfo
147+ In/Out:In
148+ 类型:数据结构指针
149+ 可空:N
150+ 意思:输入要查询的信息
151+ 返回值
152+ 类型:逻辑型
153+ 意思:是否成功
154+ 备注:
155+ *********************************************************************/
156+ bool CMemoryCache_DBUser::MemoryCache_DBUser_DataQuery (XENGINE_PROTOCOL_USERINFO* pSt_DBUserInfo)
157+ {
158+ MemoryCache_IsErrorOccur = false ;
159+
160+ if (NULL == pSt_DBUserInfo)
161+ {
162+ MemoryCache_IsErrorOccur = true ;
163+ MemoryCache_dwErrorCode = ERROR_XENGINE_MQCORE_MEMORYCACHE_DBDATA_PARAMENT;
164+ return false ;
165+ }
166+
167+ st_LockerQuery.lock_shared ();
168+ auto stl_MapIterator = stl_MapQuery.find (pSt_DBUserInfo->tszUserName );
169+ if (stl_MapIterator == stl_MapQuery.end ())
170+ {
171+ MemoryCache_IsErrorOccur = true ;
172+ MemoryCache_dwErrorCode = ERROR_XENGINE_MQCORE_MEMORYCACHE_DBDATA_NOTFOUND;
173+ st_LockerQuery.unlock_shared ();
174+ return false ;
175+ }
176+ stl_MapIterator->second .nTimeLast = time (NULL );
177+ *pSt_DBUserInfo = stl_MapIterator->second .st_DBUserInfo ;
178+ st_LockerQuery.unlock_shared ();
179+ return true ;
180+ }
181+ /* *******************************************************************
182+ 函数名称:MemoryCache_DBUser_DataDelete
183+ 函数功能:删除高速缓存
184+ 参数.一:pSt_DBUserInfo
185+ In/Out:In
186+ 类型:数据结构指针
187+ 可空:N
188+ 意思:输入要操作的信息
189+ 返回值
190+ 类型:逻辑型
191+ 意思:是否成功
192+ 备注:
193+ *********************************************************************/
194+ bool CMemoryCache_DBUser::MemoryCache_DBUser_DataDelete (XENGINE_PROTOCOL_USERINFO* pSt_DBUserInfo)
195+ {
196+ MemoryCache_IsErrorOccur = false ;
197+
198+ if (NULL == pSt_DBUserInfo)
199+ {
200+ MemoryCache_IsErrorOccur = true ;
201+ MemoryCache_dwErrorCode = ERROR_XENGINE_MQCORE_MEMORYCACHE_DBDATA_PARAMENT;
202+ return false ;
203+ }
204+
205+ st_LockerQuery.lock ();
206+ auto stl_MapIterator = stl_MapQuery.find (pSt_DBUserInfo->tszUserName );
207+ if (stl_MapIterator != stl_MapQuery.end ())
208+ {
209+ stl_MapQuery.erase (stl_MapIterator);
210+ }
211+ st_LockerQuery.unlock ();
212+ return true ;
213+ }
214+ // ////////////////////////////////////////////////////////////////////////
215+ // 线程函数
216+ // ////////////////////////////////////////////////////////////////////////
217+ XHTHREAD CALLBACK CMemoryCache_DBUser::DBModule_MQUser_TimeThread (XPVOID lParam)
218+ {
219+ CMemoryCache_DBUser* pClass_This = (CMemoryCache_DBUser*)lParam;
220+
221+ std::list<XENGINE_PROTOCOL_USERINFO> stl_ListDelete;
222+ while (pClass_This->bIsRun )
223+ {
224+ time_t nTimeEnd = time (NULL );
225+ pClass_This->st_LockerQuery .lock_shared ();
226+ for (auto stl_MapIterator = pClass_This->stl_MapQuery .begin (); stl_MapIterator != pClass_This->stl_MapQuery .end (); stl_MapIterator++)
227+ {
228+ if (stl_MapIterator->second .nTimeLast > (nTimeEnd - pClass_This->m_nTimeLast ))
229+ {
230+ stl_ListDelete.push_back (stl_MapIterator->second .st_DBUserInfo );
231+ }
232+ else if (pClass_This->m_nTimeStart > 0 && (nTimeEnd - pClass_This->m_nTimeStart ))
233+ {
234+ stl_ListDelete.push_back (stl_MapIterator->second .st_DBUserInfo );
235+ }
236+ }
237+ pClass_This->st_LockerQuery .unlock_shared ();
238+
239+ for (auto stl_ListIterator = stl_ListDelete.begin (); stl_ListIterator != stl_ListDelete.end (); stl_ListIterator++)
240+ {
241+ XENGINE_PROTOCOL_USERINFO st_DBUser = *stl_ListIterator;
242+ if (pClass_This->MemoryCache_DBUser_DataDelete (&st_DBUser))
243+ {
244+ pClass_This->lpCall_MemoryCache (ENUM_MEMORYCACHE_CALLBACK_TYPE_USER_QUERY, true , pClass_This->stl_MapQuery .size (), (XPVOID)&st_DBUser, pClass_This->m_lParam );
245+ }
246+ else
247+ {
248+ pClass_This->lpCall_MemoryCache (ENUM_MEMORYCACHE_CALLBACK_TYPE_USER_QUERY, false , pClass_This->stl_MapQuery .size (), (XPVOID)&st_DBUser, pClass_This->m_lParam );
249+ }
250+ }
251+ std::this_thread::sleep_for (std::chrono::seconds (1 ));
252+ }
253+ return 0 ;
254+ }
0 commit comments