GreenBytes
|
Дата: Воскресенье, 05.07.2020, 10:56:46 | Сообщение # 1 |
|
Сообщений: 19
Репутация: 0 [ +/- ]
|
|
Добрый день, хотелось бы чтоб взглянули на код профессионалы, возможно я что-то делаю не так и происходит утечка памяти. Сервер работает, но бывают лаги такие что не спасает даже перезагрузка карты. Только ребут сервера.
Код //------------------------------------------------------------------------------------------------------- // function: LoadPlayer // Description: Загрузка данных с сервера о игроке //------------------------------------------------------------------------------------------------------- public void LoadPlayer(int client) { char szError[256], szQuery[256], szAuth[32], szName[64]; GetClientAuthString(client, szAuth, sizeof(szAuth)); GetClientName(client, szName, sizeof(szName)); Database hDatabase = SQL_Connect("source", false, szError, sizeof(szError)); if (hDatabase == INVALID_HANDLE) { SQL_GetError(hDatabase, szError, sizeof(szError)); PrintToServer("Error LoadPlayer [0] (%s)", szError); KickClient(client, "Невозможно подключиться к БД, попробуйте снова."); return; } FormatEx(szQuery, sizeof(szQuery), "SELECT * FROM db_fishing WHERE steam = '%s';", szAuth); DBResultSet hQuery = SQL_Query(hDatabase, szQuery, sizeof(szQuery)); if (hQuery == null) { SQL_GetError(hDatabase, szError, sizeof(szError)); PrintToServer("Error LoadPlayer [1] (%s)", szError); KickClient(client, "Невозможно выполнить команду БД, попробуйте снова."); }else{ if (hQuery.RowCount != 0) { hQuery.FetchRow(); // hQuery.FetchInt(2); HookPlayerLoad(client, hQuery); delete hQuery; delete hDatabase; return; } delete hQuery; } FormatEx(szQuery, sizeof(szQuery), "INSERT INTO db_fishing SET steam = '%s' , name = '%s' , bonus = '300' , catch = '0', fishing = '0';", szAuth, szName); hQuery = SQL_Query(hDatabase, szQuery, sizeof(szQuery)); if (hQuery == null) { SQL_GetError(hDatabase, szError, sizeof(szError)); PrintToServer("Error LoadPlayer [2] (%s)", szError); KickClient(client, "Невозможно создать табличку в БД, попробуйте снова."); }else{ delete hQuery; } FormatEx(szQuery, sizeof(szQuery), "SELECT * FROM db_fishing WHERE steam = '%s';", szAuth); hQuery = SQL_Query(hDatabase, szQuery, sizeof(szQuery)); if (hQuery == null) { SQL_GetError(hDatabase, szError, sizeof(szError)); PrintToServer("Error LoadPlayer [3] (%s)", szError); KickClient(client, "Невозможно выполнить команду БД, попробуйте снова."); }else{ delete hQuery; delete hDatabase; LoadPlayer(client); } delete hDatabase; }
//------------------------------------------------------------------------------------------------------- // function: UpdatePlayer // Description: Сохранение бонусов //------------------------------------------------------------------------------------------------------- public UpdatePlayer(int client) { if ( PlayerStructure[client][PlayerUserID] <= 0 ) return; char szError[256], szQuery[512], szAuth[32], szName[64]; GetClientAuthString(client, szAuth, sizeof(szAuth)); GetClientName(client, szName, sizeof(szName)); Database hDatabase = SQL_Connect("source", false, szError, sizeof(szError)); if (hDatabase == INVALID_HANDLE) { SQL_GetError(hDatabase, szError, sizeof(szError)); PrintToServer("Error UpdatePlayer [0] (%s)", szError); return; } FormatEx(szQuery, sizeof(szQuery), "UPDATE db_fishing SET name = '%s' , bonus = '%d' , money = '%d' , catch = '%d' , fishing = '%d' , prison = '%d' , skin = '%d' , score = '%d', deatch = '%d', vip = '%d' WHERE steam = '%s';", szName, PlayerStructure[client][PlayerBonus], PlayerStructure[client][PlayerMoney], PlayerStructure[client][PlayerCatch], PlayerStructure[client][PlayerFishing], PlayerStructure[client][PlayerPrison], PlayerStructure[client][PlayerSkin], PlayerStructure[client][PlayerScore], PlayerStructure[client][PlayerDeath], PlayerStructure[client][PlayerVIP], szAuth); DBResultSet hQuery = SQL_Query(hDatabase, szQuery, sizeof(szQuery)); if (hQuery == null) { SQL_GetError(hDatabase, szError, sizeof(szError)); PrintToServer("Error UpdatePlayer [1] (%s)", szError); }else delete hQuery; delete hDatabase; } Добавлено (05.07.2020, 10:58:07) --------------------------------------------- Пока что предполагаю что лаги из -за этого участка кода, да, когда игрок выходит и входит на сервер происходит микро глюк, но вроде это нормальная реакция, а когда на сервере только я и постоянные глюки это уже ненормально :(
|
|
| |
_wS_
|
Дата: Воскресенье, 05.07.2020, 14:21:31 | Сообщение # 2 |
|
1. Не хочешь лагов/зависаний, используй SQL_T.. функции.
2. Вряд ли хорошая идея делать connect к базе после каждого входа игрока, сделай 1 раз в OnPluginStart, а потом просто запросы + можешь ловить текст ошибок и по ним определять стоит ли делать reconnect. Обычно reconnect полезен при ошибках Lost connection to MySQL server during query и Access denied for user. Или хотя бы можно reconnect в OnMapEnd.
3. В самом низу ты делаешь 2 раза delete hDatabase; 4. Имя игрока избавь от опасных символов 5. Пока хватит
|
|
| |
GreenBytes
|
Дата: Воскресенье, 05.07.2020, 14:40:26 | Сообщение # 3 |
|
Сообщений: 19
Репутация: 0 [ +/- ]
|
|
_wS_, а как сделать дисконект от базы ? delete hDatabase; верная конструкция ?
|
|
| |
_wS_
|
Дата: Воскресенье, 05.07.2020, 16:03:09 | Сообщение # 4 |
|
Да
|
|
| |