added source folders

This commit is contained in:
purpleyouko committed 2025-08-11 11:09:09 -05:00
1 parent f23521f720
commit cfdc19df45
145 files changed
+54574

No files matched your search

+188
View File
@@ -0,0 +1,188 @@
#include "database.h"
#include "../log.h"
// constructor
CDatabase::CDatabase( char* server , char* username, char* password, char* database, unsigned int port , MYSQL* mysql)
{
Server = server;
Username = username;
Password = password;
Database = database;
Port = port;
Mysql = mysql;
LastPing = time( NULL );
SQLMutex = PTHREAD_MUTEX_INITIALIZER;
mysql_init( Mysql );
}
// deconstructor
CDatabase::~CDatabase( )
{
}
// disconnect from mysql
void CDatabase::Disconnect( )
{
mysql_close( Mysql );
}
int CDatabase::Connect( )
{
Log( MSG_INFO, "Connecting to MySQL" );
if(!mysql_real_connect( Mysql, Server, Username, Password, Database,Port, NULL, 0 ))
{
Log( MSG_FATALERROR, "Error connecting to MySQL server: %s\n", mysql_error( Mysql ) );
return -1;
}
// Get timeout so we know when to ping - Drakia
MYSQL_RES *myresult = QStore("SELECT @@wait_timeout");
MYSQL_ROW row = mysql_fetch_row( myresult );
Timeout = atoi(row[0]) - 60; // Set the timeout to 1 minute before the connection will timeout
QFree( );
Log( MSG_INFO, "MySQL Ping Timeout: %d seconds", Timeout );
return 0;
}
// reconnect to mysql
int CDatabase::Reconnect( )
{
Log( MSG_INFO, "Reconnecting to Mysql" );
if(!mysql_real_connect( Mysql, Server, Username, Password, Database,Port, NULL, 0 ))
{
Log( MSG_FATALERROR, "Error reconnecting to MySQL server: %s\n", mysql_error( Mysql ) );
return -1;
}
return 0;
}
// execute query
bool CDatabase::QExecute( const char *Format,... )
{
bool Qfail = true;
char query[80000];
va_list ap;
va_start( ap, Format );
vsprintf_s (query, Format, ap);
va_end ( ap );
Log( MSG_QUERY, query );
pthread_mutex_lock( &SQLMutex );
while(Qfail)
{
if(mysql_query( Mysql, query )!=0)
{
Log( MSG_FATALERROR, "Could not execute query: %s", mysql_error( Mysql ) );
if(Reconnect( )==-1)
{
Log( MSG_FATALERROR, "Could not execute query: %s", mysql_error( Mysql ) );
pthread_mutex_unlock( &SQLMutex );
return false;
}
else Qfail = false;
}
else Qfail = false;
}
pthread_mutex_unlock( &SQLMutex );
return true;
}
MYSQL_RES* CDatabase::QStore( const char *Format, ...)
{
bool Qfail = true;
char query[80000];
va_list ap;
va_start( ap, Format );
vsprintf_s( query, Format, ap );
va_end ( ap );
result = NULL;
Log( MSG_QUERY, query );
//Log( MSG_INFO, query );
//Log( MSG_INFO, "Locking pthread mutex" );
pthread_mutex_lock( &SQLMutex );
//Log( MSG_INFO, "Locked pthread mutex" );
while(Qfail)
{
if(mysql_query( Mysql, query )!=0)
{
Log( MSG_FATALERROR, "Could not execute query: %s", mysql_error( Mysql ) );
if(Reconnect( )==-1)
{
Log( MSG_FATALERROR, "Could not execute query: %s", mysql_error( Mysql ) );
pthread_mutex_unlock( &SQLMutex );
return NULL;
}
else Qfail = false;
}
else Qfail = false;
// Log( MSG_INFO, "mysql answer: %s", mysql_error( Mysql ) );
}
//Log( MSG_INFO, "reading mysql result" );
result = mysql_store_result( Mysql );
//Log( MSG_INFO, "returning mysql result" );
return result;
}
MYSQL_RES* CDatabase::QUse( const char *Format, ...)
{
bool Qfail = true;
char query[1024];
va_list ap;
va_start( ap, Format );
vsprintf_s( query, Format, ap );
va_end ( ap );
result = NULL;
Log( MSG_QUERY, query );
pthread_mutex_lock( &SQLMutex );
while(Qfail)
{
if(mysql_query( Mysql, query )!=0)
{
Log( MSG_FATALERROR, "Could not execute query: %s", mysql_error( Mysql ) );
if(Reconnect( )==-1)
{
Log( MSG_FATALERROR, "Could not execute query: %s", mysql_error( Mysql ) );
pthread_mutex_unlock( &SQLMutex );
return NULL;
}
else Qfail = false;
}
else Qfail = false;
}
result = mysql_use_result( Mysql );
return result;
}
bool CDatabase::DoSQL(const char *Format, ...) {
int retval;
char Buffer[1024];
va_list ap; va_start( ap, Format );
vsprintf_s( Buffer, Format, ap );
va_end ( ap );
retval = mysql_query( Mysql, Buffer );
if( retval!=0 ) Log( MSG_ERROR, "MySQL Query Error '%s'", mysql_error( Mysql ) );
return (retval==0);
}
void CDatabase::QFree( )
{
mysql_free_result( result );
pthread_mutex_unlock( &SQLMutex );
}
bool CDatabase::Ping( )
{
if ( time( NULL ) > ( LastPing + Timeout ) ) {
Log(MSG_INFO, "MySql Ping");
LastPing = time( NULL );
MYSQL_RES *res = QStore("SELECT @@wait_timeout");
if (res == NULL) {
Log( MSG_ERROR, "MySQL Ping Failed, Attempting reconnect" );
QFree( );
return !Reconnect( );
}
MYSQL_ROW row = mysql_fetch_row(res);
Timeout = atoi(row[0]) - 60;
QFree( );
Log( MSG_INFO, "MySql Pong, new Timeout: %d seconds", Timeout);
}
return true;
}
+33
View File
@@ -0,0 +1,33 @@
#ifndef _ROSE_DATABASE_
#define _ROSE_DATABASE_
#include "../sockets.h"
class CDatabase
{
public:
CDatabase( char* , char*, char*, char*, unsigned int, MYSQL* );
~CDatabase( );
char* Server;
char* Username;
char* Password;
char* Database;
unsigned int Port;
unsigned int Timeout;
time_t LastPing;
int Connect( );
int Reconnect( );
void Disconnect( );
bool QExecute( const char *format,... );
MYSQL_RES* QUse( const char *format,... );
MYSQL_RES* QStore( const char *format,... );
bool DoSQL(const char *Format, ...);
void QFree( );
bool Ping( );
MYSQL* Mysql;
MYSQL_RES* result;
pthread_mutex_t SQLMutex;
};
#endif