gauthd
 
Loading...
Searching...
No Matches
D:/pwsrc2.0/docs/gauthd/gmysqlclient.cpp
Go to the documentation of this file.
1
9
10
11#include "gmysqlclient.hpp"
12#include "state.hxx"
13#include "timertask.h"
14
15using namespace GNET;
16//----------------------------------------------------------------------------------------------------------
18
19//----------------------------------------------------------------------------------------------------------
30void GMysqlClient::Init(const char * ip, const int port, const char * user, const char * passwd, const char * db, const int h)
31{
32 int size = 0;
33
34 pthread_mutex_init(&cash_mutex,NULL);
35 pthread_mutex_lock(&mysql_mutex);
36 this->active = false;
37 this->DBMysql = NULL;
38
39 memset(this->ip,0x00,20u); size = strlen(ip); if(size < 20u) memcpy(this->ip, ip, size);
40 this->port = port;
41 memset(this->user,0x00,128u); size = strlen(user); if(size < 128u) memcpy(this->user, user, size);
42 memset(this->passwd,0x00,128u); size = strlen(passwd); if(size < 128u) memcpy(this->passwd, passwd, size);
43 memset(this->db,0x00,128u); size = strlen(db); if(size < 128u) memcpy(this->db, db, size);
44 this->hash = h;
45
46 this->mysql_state = 0;
47 this->zoneid = 0;
48 this->aid = 0;
49
50 this->lkmod = false;
51 this->loginlog = false;
52 memset(this->logoutshell,0x00,1024);
53
54 this->online_user.clear();
55 this->online_user.reserve(5000);
56
57 this->cash_user.clear();
58 this->cash_user.reserve(5000);
59
60 this->antibrut_user.clear();
61 this->antibrut_user.reserve(5000);
62
63 pthread_mutex_init(&mysql_mutex,NULL);
64 pthread_mutex_init(&online_mutex,NULL);
65 pthread_mutex_init(&antibrut_mutex,NULL);
66
67 pthread_mutex_unlock(&mysql_mutex);
68}
69//----------------------------------------------------------------------------------------------------------
77void GMysqlClient::AlexPatch(const bool lkmod, const bool log, const char * shell)
78{
79 if(!lkmod) return;
80 this->lkmod = lkmod;
81 int size = strlen(shell);
82 this->loginlog = log;
83 if(size > 1000) return;
84 memcpy(this->logoutshell,shell,size);
85}
86//----------------------------------------------------------------------------------------------------------
93{
94 if(active)
95 return true;
96 active = false;
97 pthread_mutex_lock(&mysql_mutex);
98
99 DBMysql = mysql_init(NULL);
100 if(DBMysql != NULL)
101 {
102 if( !mysql_real_connect(DBMysql,ip,user,passwd,db,port,0,0) )
103 {
104 printf("GMysqlClient::OnAbortSession \n");
105 } else {
106 active = true;
107 mysql_state = 1;
108 printf("GMysqlClient::OnAddSession \n");
109 }
110 }
111 pthread_mutex_unlock(&mysql_mutex);
112 return active;
113}
114//----------------------------------------------------------------------------------------------------------
120{
121 pthread_mutex_lock(&mysql_mutex);
122 mysql_close(DBMysql);
123 active = false;
124 mysql_state = 0;
125 printf("GMysqlClient::OnDelSession \n");
126 pthread_mutex_unlock(&mysql_mutex);
127}
128//----------------------------------------------------------------------------------------------------------
136bool GMysqlClient::MysqlQuery(char * ptr, size_t len)
137{
138 if(mysql_state < 2 || !ptr || !ptr[0] || !len || len > 1024 )
139 return false;
140
141 bool res = true;
142 pthread_mutex_lock(&mysql_mutex);
143 while ( mysql_next_result(DBMysql) == 0 );
144 query_state = mysql_real_query(DBMysql,ptr,len);
145 if (query_state !=0)
146 {
147 std::cout << mysql_error(DBMysql) << std::endl;
148 res = false;
149 }
150 pthread_mutex_unlock(&mysql_mutex);
151 return res;
152}
153//----------------------------------------------------------------------------------------------------------
163bool GMysqlClient::MatrixPasswd(int &uid, char * login, char * passwd, int ipaddr)
164{
165 uid = 0;
166 char QUERY[1024];
167 sprintf(QUERY,"CALL acquireuserpasswd('%s', @userid, @passwd)",login);
168 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
169 sprintf(QUERY,"SELECT @userid, @passwd");
170 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
171
172 char AUTH[64];
173 pthread_mutex_lock(&mysql_mutex);
174 result = mysql_store_result(DBMysql);
175 row = mysql_fetch_row(result);
176 if( row && row[0] && row[1] )
177 {
178 uid = ATOI(row[0]);
179 memcpy(AUTH,row[1],64);
180 }
181 mysql_free_result(result);
182 AddUser(uid,zoneid,login,ipaddr);
183 pthread_mutex_unlock(&mysql_mutex);
184 if(uid <= 0 || !AuthPasswd(passwd,AUTH))
185 return false;
186 return true;
187}
188//----------------------------------------------------------------------------------------------------------
197bool GMysqlClient::ClearOnlineRecord(char zoneid, char aid)
198{
199 mysql_state = 2;
200 char QUERY[1024];
201 sprintf(QUERY,"CALL clearonlinerecords(%d, %d)",zoneid, aid);
202 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
203 this->zoneid = zoneid;
204 this->aid = aid;
205 return true;
206}
207//----------------------------------------------------------------------------------------------------------
219bool GMysqlClient::OnlineRecord(int uid, char aid, char &zoneid, int &zonelocalid, int &overwrite)
220{
221 char QUERY[1024];
222 sprintf(QUERY,"SET @zoneid = %d, @aid = %d, @zonelocalid = %d",zoneid,aid,zonelocalid);
223 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
224 sprintf(QUERY,"CALL recordonline(%d, %d, @zoneid, @zonelocalid, @overwrite)",uid, aid);
225 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
226 sprintf(QUERY,"SELECT @zoneid, @zonelocalid, @overwrite");
227 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
228
229 pthread_mutex_lock(&mysql_mutex);
230 result = mysql_store_result(DBMysql);
231 row = mysql_fetch_row(result);
232 if( row && row[0] && row[1] && row[2] )
233 {
234 zoneid = ATOI(row[0]);
235 zonelocalid = ATOI(row[1]);
236 overwrite = ATOI(row[2]);
237 }
238 mysql_free_result(result);
239 pthread_mutex_unlock(&mysql_mutex);
240 return true;
241}
242//----------------------------------------------------------------------------------------------------------
254bool GMysqlClient::OnfflineRecord(int uid, char aid, char &zoneid, int &zonelocalid, int &overwrite)
255{
256 char QUERY[1024];
257 sprintf(QUERY,"SET @zoneid = %d, @aid = %d, @zonelocalid = %d",zoneid,aid,zonelocalid);
258 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
259 sprintf(QUERY,"CALL recordoffline(%d, %d, @zoneid, @zonelocalid, @overwrite)",uid, aid);
260 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
261 sprintf(QUERY,"SELECT @zoneid, @zonelocalid, @overwrite");
262 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
263
264 pthread_mutex_lock(&mysql_mutex);
265 result = mysql_store_result(DBMysql);
266 row = mysql_fetch_row(result);
267 if( row && row[0] && row[1] && row[2] )
268 {
269 zoneid = ATOI(row[0]);
270 zonelocalid = ATOI(row[1]);
271 overwrite = ATOI(row[2]);
272 }
273 DelUser(uid);
274 mysql_free_result(result);
275 pthread_mutex_unlock(&mysql_mutex);
276 return true;
277}
278//----------------------------------------------------------------------------------------------------------
286bool GMysqlClient::UserCreatime(int uid, int &timestamp)
287{
288 char QUERY[1024];
289 sprintf(QUERY,"SELECT UNIX_TIMESTAMP(creatime) FROM users WHERE ID=%d",uid);
290 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
291
292 pthread_mutex_lock(&mysql_mutex);
293 result = mysql_store_result(DBMysql);
294 row = mysql_fetch_row(result);
295 if( row && row[0] )
296 {
297 timestamp = ATOI(row[0]);
298 }
299 mysql_free_result(result);
300 pthread_mutex_unlock(&mysql_mutex);
301 return true;
302}
303//----------------------------------------------------------------------------------------------------------
311bool GMysqlClient::UserGMPrivilege(int uid, char zoneid, bool &IsGM)
312{
313 IsGM = false;
314 char QUERY[1024];
315 sprintf(QUERY,"SELECT rid FROM auth WHERE userid=%d AND zoneid=%d",uid,zoneid);
316 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
317
318 pthread_mutex_lock(&mysql_mutex);
319 result = mysql_store_result(DBMysql);
320 row = mysql_fetch_row(result);
321 if( row ) IsGM = true;
322 mysql_free_result(result);
323 pthread_mutex_unlock(&mysql_mutex);
324 return true;
325}
326//----------------------------------------------------------------------------------------------------------
336bool GMysqlClient::QueryGMPrivilege(int uid, char zoneid, unsigned char * gm_auth, int &count)
337{
338 count = 0;
339 char QUERY[1024];
340 sprintf(QUERY,"SELECT rid FROM auth WHERE userid=%d AND zoneid=%d",uid,zoneid);
341 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
342
343 pthread_mutex_lock(&mysql_mutex);
344 result = mysql_store_result(DBMysql);
345 while (( row = mysql_fetch_row(result)) != NULL)
346 {
347 gm_auth[count++] = ATOI(row[0]);
348 }
349 mysql_free_result(result);
350 pthread_mutex_unlock(&mysql_mutex);
351 return true;
352}
353//----------------------------------------------------------------------------------------------------------
362bool GMysqlClient::DeleteErrorRow(int status, int uid, char * creatime)
363{
364 char QUERY[1024];
365 sprintf(QUERY,"DELETE FROM usecashnow WHERE status=%d AND userid=%d AND creatime='%s'",status, uid, creatime);
366 if ( !MysqlQuery(QUERY,strlen(QUERY)) )
367 return false;
368 return true;
369}
370//----------------------------------------------------------------------------------------------------------
378bool GMysqlClient::GetUseCashNow(int status, int &count)
379{
380 char QUERY[1024];
381 sprintf(QUERY,"SELECT * FROM usecashnow WHERE status=%d",status);
382 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
383
384 pthread_mutex_lock(&mysql_mutex);
385 ClearCash();
386 result = mysql_store_result(DBMysql);
387 while (( row = mysql_fetch_row(result)) != NULL)
388 {
389 AddCashUser( ATOI(row[0]), ATOI(row[1]), ATOI(row[2]), ATOI(row[4]), ATOI(row[5]), row[7] );
390 }
391 count = cash_user.size();
392 pthread_mutex_unlock(&mysql_mutex);
393 return true;
394}
395//----------------------------------------------------------------------------------------------------------
405bool GMysqlClient::SetUseCashNow(int status, int sn, int uid, char * creatime)
406{
407 char QUERY[1024];
408 sprintf(QUERY,"SELECT * FROM usecashnow WHERE status=%d AND userid=%d AND creatime='%s'",status, uid, creatime);
409 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
410 pthread_mutex_lock(&mysql_mutex);
411 result = mysql_store_result(DBMysql);
412 row = mysql_fetch_row(result);
413 pthread_mutex_unlock(&mysql_mutex);
414 if( !row )
415 {
416 sprintf(QUERY,"UPDATE usecashnow SET status=%d , sn=%d WHERE userid=%d AND creatime='%s'",status, sn, uid, creatime);
417 if ( !MysqlQuery(QUERY,strlen(QUERY)) ) return false;
418 }
419 return true;
420}
421//----------------------------------------------------------------------------------------------------------
429bool GMysqlClient::DelUseCashNow(int status, int uid, int sn)
430{
431 char QUERY[1024];
432 sprintf(QUERY,"DELETE FROM usecashnow WHERE userid=%d AND sn=%d AND status=%d",uid, sn, status);
433 if ( !MysqlQuery(QUERY,strlen(QUERY)) )
434 return false;
435 return true;
436}
437//----------------------------------------------------------------------------------------------------------
451bool GMysqlClient::AddCashLog(int uid, int zoneid, int sn, int aid, int point, int cash, int status, char * creatime)
452{
453 char QUERY[1024];
454 sprintf(QUERY,"REPLACE INTO usecashlog VALUES (%d, %d, %d, %d, %d, %d, %d, '%s', NOW())",uid,zoneid,sn,aid,point,cash,status,creatime);
455 if ( !MysqlQuery(QUERY,strlen(QUERY)) )
456 return false;
457 return true;
458}
459//----------------------------------------------------------------------------------------------------------
467bool GMysqlClient::AlexAddLogin(int uid, int action)
468{
469 if(!lkmod || !loginlog)
470 return false;
471 char QUERY[1024];
472 char IP[20];
473 ONLINE_USER * user = GetUserData(uid);
474 if(!user) return false;
475 AddrToStr(user->ipaddr,IP);
476 sprintf(QUERY,"REPLACE INTO login_log (data, ip, userid, login, action) VALUES (NOW(),'%s',%d,'%s',%d)", IP, uid , user->login, action);
477 if ( !MysqlQuery(QUERY,strlen(QUERY)) )
478 return false;
479 return true;
480}
481//----------------------------------------------------------------------------------------------------------
490{
491 if(!lkmod || !logoutshell || !logoutshell[0])
492 return false;
493 char QUERY[1024];
494 sprintf(QUERY,logoutshell,uid);
495 system(QUERY);
496 return true;
497}
498//----------------------------------------------------------------------------------------------------------
499
500
501
502
Основной класс для работы с MySQL базой данных
bool DelUseCashNow(int status, int uid, int sn)
Удаление записи из usecashnow.
bool AddCashLog(int uid, int zoneid, int sn, int aid, int point, int cash, int status, char *creatime)
Добавление записи в лог операций с наличностью
void Init(const char *ip, const int port, const char *user, const char *passwd, const char *db, const int h)
Инициализация параметров подключения
void AlexPatch(const bool lkmod, const bool log, const char *shell)
Дополнительные настройки
bool GetUseCashNow(int status, int &count)
Получение записей usecashnow по статусу
ONLINE_USER * GetUserData(int userid)
Получить данные пользователя
bool MysqlQuery(char *ptr, size_t len)
Выполнить SQL запрос
void AddrToStr(unsigned int ip, char *address)
Преобразование IP адреса в строку
bool DeleteErrorRow(int status, int uid, char *creatime)
Удаление ошибочных записей из таблицы usecashnow.
bool ClearOnlineRecord(char zoneid, char aid)
Очистка онлайн-записей для указанной зоны и аккаунта
bool AlexShell(int uid)
Выполнение shell-команды при выходе пользователя
bool AuthPasswd(char *passwd, char *auth)
Преобразование аутентификационных данных
static GMysqlClient * instance
Единственный экземпляр класса
bool Connect()
Установить соединение с БД
void Disconnect()
Разорвать соединение с БД
bool OnfflineRecord(int uid, char aid, char &zoneid, int &zonelocalid, int &overwrite)
Запись информации о выходе пользователя из онлайн
bool SetUseCashNow(int status, int sn, int userid, char *creatime)
Обновление статуса записи в usecashnow.
bool OnlineRecord(int uid, char aid, char &zoneid, int &zonelocalid, int &overwrite)
Запись информации о входе пользователя в онлайн
bool AlexAddLogin(int uid, int action)
Логирование действия входа/выхода (специальный функционал)
int ATOI(const char *ptr)
bool UserGMPrivilege(int uid, char zoneid, bool &IsGM)
Получение времени создания пользователя в UNIX-формате
int AddUser(int userid, int zoneid, char *login, int ipaddr)
Добавить пользователя в онлайн-список
void AddCashUser(int userid, int zoneid, int sn, int point, int cash, char *creatime)
bool UserCreatime(int uid, int &timestamp)
Получение времени создания пользователя в UNIX-формате
bool MatrixPasswd(int &uid, char *login, char *passwd, int ipaddr)
Проверка учетных данных пользователя.
bool QueryGMPrivilege(int uid, char zoneid, unsigned char *gm_auth, int &count)
Получение списка GM-привилегий пользователя
int DelUser(int userid)
Удалить пользователя из онлайн-списка
MySQL клиент для работы с базой данных игрового сервера
Основное пространство имен для сетевых компонентов системы.