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