#include "Datenbank.h" #include // Inhalt der LSDatenbank Klasse aus Datenbank.h // Konstruktor NSDatenbank::NSDatenbank( InitDatei *zIni ) { datenbank = new Datenbank( zIni->zWert( "DBBenutzer" )->getText(), zIni->zWert( "DBPasswort" )->getText(), zIni->zWert( "DBName" )->getText(), zIni->zWert( "DBIP" )->getText(), (unsigned short)TextZuInt( zIni->zWert( "DBPort" )->getText(), 10 ) ); if( !datenbank->istOk() ) { std::cout << "NS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet."; exit( 1 ); } InitializeCriticalSection( &cs ); ref = 1; Text befehl = "SELECT port, admin_port FROM server WHERE id = "; befehl += zIni->zWert( "ServerId" )->getText(); lock(); datenbank->befehl( befehl ); Result res = datenbank->getResult(); unlock(); if( res.zeilenAnzahl == 1 ) { zIni->addWert( "ServerPort", res.values[ 0 ] ); zIni->addWert( "AdminServerPort", res.values[ 1 ] ); } res.destroy(); } // Destruktor NSDatenbank::~NSDatenbank() { datenbank->release(); DeleteCriticalSection( &cs ); } // nicht constant void NSDatenbank::lock() { EnterCriticalSection( &cs ); } void NSDatenbank::unlock() { LeaveCriticalSection( &cs ); } int NSDatenbank::istAdministrator( const char *name, const char *passwort ) { Text *befehl = new Text( "SELECT id FROM benutzer WHERE name = '" ); Text n( name ); n.ersetzen( "'", "''" ); befehl->append( (char*)n ); befehl->append( "' AND passwort = md5( '" ); Text p( passwort ); p.ersetzen( "'", "''" ); befehl->append( (char*)p ); befehl->append( "' )" ); lock(); datenbank->befehl( befehl->getText() ); Result res = datenbank->getResult(); unlock(); befehl->release(); int ret = 0; if( res.zeilenAnzahl > 0 ) ret = TextZuInt( res.values[ 0 ].getText(), 10 ); res.destroy(); return ret; } bool NSDatenbank::adminHatRecht( int id, int recht ) { Text *befehl = new Text( "SELECT * FROM benutzer_rechte WHERE benutzer_id = " ); befehl->append( id ); befehl->append( " AND rechte_id = " ); befehl->append( recht ); lock(); datenbank->befehl( befehl->getText() ); int ret = datenbank->getZeilenAnzahl(); unlock(); befehl->release(); return ret != 0; } bool NSDatenbank::proveKlient( int num, int sNum ) { Text *befehl = new Text( "SELECT * FROM server_client WHERE server_id = " ); befehl->append( sNum ); befehl->append( " AND client_id = " ); befehl->append( num ); lock(); datenbank->befehl( befehl->getText() ); Result res = datenbank->getResult(); unlock(); befehl->release(); bool ret = 0; if( res.zeilenAnzahl == 1 ) ret = 1; res.destroy(); return ret; } Text *NSDatenbank::getKlientKey( int cId ) { lock(); if( !datenbank->befehl( Text( "SELECT schluessel FROM client WHERE id = " ) += cId ) ) { unlock(); return 0; } Result res = datenbank->getResult(); unlock(); if( !res.zeilenAnzahl ) { res.destroy(); return 0; } Text *ret = new Text( res.values[ 0 ].getText() ); res.destroy(); return ret; } void NSDatenbank::unregisterKlient( int num, int sNum ) { Text *befehl = new Text( "DELETE FROM server_client WHERE client_id = " ); befehl->append( num ); befehl->append( " AND server_id = " ); befehl->append( sNum ); lock(); datenbank->befehl( befehl->getText() ); int za = datenbank->getZeilenAnzahl(); unlock(); if( za == 1 ) { befehl->setText( "UPDATE server SET tasks = tasks - 1 WHERE id = " ); befehl->append( sNum ); lock(); datenbank->befehl( befehl->getText() ); unlock(); } befehl->release(); } bool NSDatenbank::setServerStatus( int id, int status ) { Text *befehl = new Text( "UPDATE server SET server_status_id = " ); *befehl += status; *befehl += "WHERE id = "; *befehl += id; lock(); if( !datenbank->befehl( befehl->getText() ) ) { unlock(); befehl->release(); return 0; } bool ret = datenbank->getZeilenAnzahl() != 0; unlock(); befehl->release(); return ret; } bool NSDatenbank::setMaxClients( int id, int maxC ) { Text *befehl = new Text( "UPDATE server SET max_tasks = " ); befehl->append( maxC ); befehl->append( " WHERE id = " ); befehl->append( id ); lock(); if( !datenbank->befehl( befehl->getText() ) ) { unlock(); befehl->release(); return 0; } bool ret = datenbank->getZeilenAnzahl() > 0; unlock(); befehl->release(); return ret; } bool NSDatenbank::serverIstNichtPausiert( int id ) { Text *befehl = new Text( "SELECT server_status_id FROM server WHERE id = " ); befehl->append( id ); lock(); if( !datenbank->befehl( befehl->getText() ) ) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); if( !res.zeilenAnzahl ) { res.destroy(); return 0; } bool ret = (int)res.values[ 0 ] == 3; res.destroy(); return ret; } // constant Text *NSDatenbank::getLetzterFehler() const { return datenbank->getLetzterFehler(); } // Reference Counting NSDatenbank *NSDatenbank::getThis() { ref++; return this; } NSDatenbank *NSDatenbank::release() { ref--; if( !ref ) delete this; return 0; }