#include "Datenbank.h" #include // Inhalt der LSDatenbank Klasse aus Datenbank.h // Konstruktor NSDatenbank::NSDatenbank(InitDatei* zIni) : ReferenceCounter() { 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); 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(n); befehl->append("' AND passwort = md5( '"); Text p(passwort); p.ersetzen("'", "''"); befehl->append(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(); }