/* * Original work: Copyright (c) 2014, Oculus VR, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * RakNet License.txt file in the licenses directory of this source tree. An additional grant * of patent rights can be found in the RakNet Patents.txt file in the same directory. * * * Modified work: Copyright (c) 2016-2017, SLikeSoft UG (haftungsbeschränkt) * * This source code was modified by SLikeSoft. Modifications are licensed under the MIT-style * license found in the license.txt file in the root directory of this source tree. */ #include "MySQLInterface.h" #include "slikenet/assert.h" #include "slikenet/BitStream.h" #include "slikenet/FormatString.h" #include "slikenet/LinuxStrings.h" #include "slikenet/linux_adapter.h" #include "slikenet/osx_adapter.h" #include #ifdef _WIN32 #elif defined(_PS3) || defined(__PS3__) || defined(SN_TARGET_PS3) #else #include //atoi #endif #ifdef _WIN32 #include #endif #include "mysql.h" MySQLInterface::MySQLInterface() { mySqlConnection=0; lastError[0]=0; } MySQLInterface::~MySQLInterface() { Disconnect(); } bool MySQLInterface::Connect(const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag) { if (IsConnected()) return false; _host=host; _user=user; _passwd=passwd; _db=db; _port=port; _unix_socket=unix_socket; _clientflag=clientflag; mySqlConnection = mysql_init(0); return mysql_real_connect (mySqlConnection, host, user, passwd, db, port, unix_socket, clientflag) != 0; } void MySQLInterface::Disconnect(void) { if (IsConnected()) { mysql_close(mySqlConnection); mySqlConnection = 0; } } bool MySQLInterface::IsConnected(void) const { return mySqlConnection != 0; } void MySQLInterface::Commit(void) { mysql_query (mySqlConnection, "COMMIT;"); } void MySQLInterface::Rollback(void) { mysql_query (mySqlConnection, "ROLLBACK"); } bool MySQLInterface::ExecuteBlockingCommand(const char *command) { int queryResult; if ((queryResult=mysql_query(mySqlConnection, command)) != 0) { strcpy (lastError, mysql_error (mySqlConnection)); return false; } return true; } bool MySQLInterface::ExecuteBlockingCommand(const char *command, MYSQL_RES **result, bool rollbackOnFailure) { if (!ExecuteBlockingCommand (command)) return false; *result = mysql_store_result (mySqlConnection); return *result != 0; } char *MySQLInterface::GetLocalTimestamp(void) { static char resultString[512]; MYSQL_RES *result; if (ExecuteBlockingCommand("SELECT LOCALTIMESTAMP", &result, false)) { MYSQL_ROW row = mysql_fetch_row (result); if (row [0]) sprintf_s(resultString,"%s\n", row [0]); else resultString[0]=0; mysql_free_result(result); } else resultString[0]=0; return (char*)resultString; } bool MySQLInterface::ExecuteQueryReadInt (const char * query, int *value) { MYSQL_RES * result=0; if (!ExecuteBlockingCommand(query, &result, false)) { mysql_free_result(result); return false; } MYSQL_ROW row = mysql_fetch_row (result); if (row == 0 || mysql_num_fields (result) != 1) { mysql_free_result(result); return false; } *value = atoi(row [0]); mysql_free_result(result); return true; } const char* MySQLInterface::GetLastError(void) const { return lastError; } SLNet::RakString MySQLInterface::GetEscapedString(const char *input) const { unsigned long len = (unsigned long) strlen(input); char *fn = new char [len*2+1]; mysql_real_escape_string(mySqlConnection, fn, input, len); SLNet::RakString output; // Use assignment so it doesn't parse printf escape strings output = fn; delete [] fn; return output; }