| 
| 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 |  |   | Да |  |  |  |  |