30void GMysqlClient::Init(
const char * ip,
const int port,
const char * user,
const char * passwd,
const char * db,
const int h)
34 pthread_mutex_init(&cash_mutex,NULL);
35 pthread_mutex_lock(&mysql_mutex);
39 memset(this->ip,0x00,20u); size = strlen(ip);
if(size < 20u) memcpy(this->ip, ip, size);
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);
46 this->mysql_state = 0;
51 this->loginlog =
false;
52 memset(this->logoutshell,0x00,1024);
54 this->online_user.clear();
55 this->online_user.reserve(5000);
57 this->cash_user.clear();
58 this->cash_user.reserve(5000);
60 this->antibrut_user.clear();
61 this->antibrut_user.reserve(5000);
63 pthread_mutex_init(&mysql_mutex,NULL);
64 pthread_mutex_init(&online_mutex,NULL);
65 pthread_mutex_init(&antibrut_mutex,NULL);
67 pthread_mutex_unlock(&mysql_mutex);
81 int size = strlen(shell);
83 if(size > 1000)
return;
84 memcpy(this->logoutshell,shell,size);
97 pthread_mutex_lock(&mysql_mutex);
99 DBMysql = mysql_init(NULL);
102 if( !mysql_real_connect(DBMysql,ip,user,passwd,db,port,0,0) )
104 printf(
"GMysqlClient::OnAbortSession \n");
108 printf(
"GMysqlClient::OnAddSession \n");
111 pthread_mutex_unlock(&mysql_mutex);
121 pthread_mutex_lock(&mysql_mutex);
122 mysql_close(DBMysql);
125 printf(
"GMysqlClient::OnDelSession \n");
126 pthread_mutex_unlock(&mysql_mutex);
138 if(mysql_state < 2 || !ptr || !ptr[0] || !len || len > 1024 )
142 pthread_mutex_lock(&mysql_mutex);
143 while ( mysql_next_result(DBMysql) == 0 );
144 query_state = mysql_real_query(DBMysql,ptr,len);
147 std::cout << mysql_error(DBMysql) << std::endl;
150 pthread_mutex_unlock(&mysql_mutex);
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;
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] )
179 memcpy(AUTH,row[1],64);
181 mysql_free_result(result);
182 AddUser(uid,zoneid,login,ipaddr);
183 pthread_mutex_unlock(&mysql_mutex);
201 sprintf(QUERY,
"CALL clearonlinerecords(%d, %d)",zoneid, aid);
202 if ( !
MysqlQuery(QUERY,strlen(QUERY)) )
return false;
203 this->zoneid = zoneid;
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;
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] )
234 zoneid =
ATOI(row[0]);
235 zonelocalid =
ATOI(row[1]);
236 overwrite =
ATOI(row[2]);
238 mysql_free_result(result);
239 pthread_mutex_unlock(&mysql_mutex);
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;
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] )
269 zoneid =
ATOI(row[0]);
270 zonelocalid =
ATOI(row[1]);
271 overwrite =
ATOI(row[2]);
274 mysql_free_result(result);
275 pthread_mutex_unlock(&mysql_mutex);
289 sprintf(QUERY,
"SELECT UNIX_TIMESTAMP(creatime) FROM users WHERE ID=%d",uid);
290 if ( !
MysqlQuery(QUERY,strlen(QUERY)) )
return false;
292 pthread_mutex_lock(&mysql_mutex);
293 result = mysql_store_result(DBMysql);
294 row = mysql_fetch_row(result);
297 timestamp =
ATOI(row[0]);
299 mysql_free_result(result);
300 pthread_mutex_unlock(&mysql_mutex);
315 sprintf(QUERY,
"SELECT rid FROM auth WHERE userid=%d AND zoneid=%d",uid,zoneid);
316 if ( !
MysqlQuery(QUERY,strlen(QUERY)) )
return false;
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);
340 sprintf(QUERY,
"SELECT rid FROM auth WHERE userid=%d AND zoneid=%d",uid,zoneid);
341 if ( !
MysqlQuery(QUERY,strlen(QUERY)) )
return false;
343 pthread_mutex_lock(&mysql_mutex);
344 result = mysql_store_result(DBMysql);
345 while (( row = mysql_fetch_row(result)) != NULL)
347 gm_auth[count++] =
ATOI(row[0]);
349 mysql_free_result(result);
350 pthread_mutex_unlock(&mysql_mutex);
365 sprintf(QUERY,
"DELETE FROM usecashnow WHERE status=%d AND userid=%d AND creatime='%s'",status, uid, creatime);
381 sprintf(QUERY,
"SELECT * FROM usecashnow WHERE status=%d",status);
382 if ( !
MysqlQuery(QUERY,strlen(QUERY)) )
return false;
384 pthread_mutex_lock(&mysql_mutex);
386 result = mysql_store_result(DBMysql);
387 while (( row = mysql_fetch_row(result)) != NULL)
391 count = cash_user.size();
392 pthread_mutex_unlock(&mysql_mutex);
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);
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;
432 sprintf(QUERY,
"DELETE FROM usecashnow WHERE userid=%d AND sn=%d AND status=%d",uid, sn, status);
454 sprintf(QUERY,
"REPLACE INTO usecashlog VALUES (%d, %d, %d, %d, %d, %d, %d, '%s', NOW())",uid,zoneid,sn,aid,point,cash,status,creatime);
469 if(!lkmod || !loginlog)
474 if(!user)
return false;
476 sprintf(QUERY,
"REPLACE INTO login_log (data, ip, userid, login, action) VALUES (NOW(),'%s',%d,'%s',%d)", IP, uid , user->login, action);
491 if(!lkmod || !logoutshell || !logoutshell[0])
494 sprintf(QUERY,logoutshell,uid);
Основной класс для работы с 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 ×tamp)
Получение времени создания пользователя в 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 клиент для работы с базой данных игрового сервера
Основное пространство имен для сетевых компонентов системы.