#include "Datenbank.h" #include // Inhalt der LSDatenbank Klasse aus Datenbank.h // Konstruktor LSDatenbank::LSDatenbank(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 << "LS: 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 LSDatenbank::~LSDatenbank() { datenbank->release(); DeleteCriticalSection(&cs); } // nicht constant void LSDatenbank::lock() { EnterCriticalSection(&cs); } void LSDatenbank::unlock() { LeaveCriticalSection(&cs); } int LSDatenbank::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 LSDatenbank::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 LSDatenbank::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* LSDatenbank::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 LSDatenbank::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 LSDatenbank::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 LSDatenbank::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 LSDatenbank::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; } int LSDatenbank::getAccountId(char* name, char* pass) { Text* befehl = new Text("SELECT id FROM account WHERE name = '"); Text n(name); n.ersetzen("'", "''"); befehl->append(n); befehl->append("' AND passwort = md5( '"); Text p(pass); p.ersetzen("'", "''"); befehl->append(p); befehl->append("' )"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); if (res.zeilenAnzahl == 0) { res.destroy(); return 0; } int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } int LSDatenbank::loginKlient(int klientId, int accountId) { Text* befehl = new Text("SELECT login_client( "); befehl->append(klientId); befehl->append(", "); befehl->append(accountId); befehl->append(" )"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); if (res.zeilenAnzahl == 0) { res.destroy(); return 0; } int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } bool LSDatenbank::accountGeheim(int accountId, char* geheim) { Text* befehl = new Text("SELECT * FROM account WHERE id = "); befehl->append(accountId); befehl->append(" AND geheimnis = '"); Text g(geheim); g.ersetzen("'", "''"); befehl->append(g); befehl->append("'"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); if (res.zeilenAnzahl == 1) { res.destroy(); return 1; } res.destroy(); return 0; } int* LSDatenbank::kickKlient(int accountId) { Text* befehl = new Text("SELECT kick_client( "); befehl->append(accountId); befehl->append(" )"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); if (res.zeilenAnzahl == 0) { res.destroy(); return 0; } int* ret = new int[res.zeilenAnzahl]; for (int i = 0; i < res.zeilenAnzahl; i++) ret[i] = TextZuInt(res.values[i].getText(), 10); res.destroy(); return ret; } void LSDatenbank::accountOnline(int accountId, char* ip, unsigned char* locIp, char* pcName) { Text* befehl = new Text("INSERT INTO account_online( account_id, ip, loc_ip, pc_name ) VALUES ( "); befehl->append(accountId); befehl->append(", '"); befehl->append(ip); befehl->append("', '"); befehl->append((int)locIp[0]); befehl->append("."); befehl->append((int)locIp[1]); befehl->append("."); befehl->append((int)locIp[2]); befehl->append("."); befehl->append((int)locIp[3]); befehl->append("', '"); Text n(pcName); n.ersetzen("'", "''"); befehl->append(n); befehl->append("' )"); lock(); datenbank->befehl(befehl->getText()); unlock(); befehl->release(); } int LSDatenbank::logoutKlient(int klientId, Array< int >* ret) { Text* befehl = new Text("SELECT logout_client( "); befehl->append(klientId); befehl->append(" )"); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); befehl->release(); for (int i = 0; i < res.zeilenAnzahl; i++) ret->add(TextZuInt(res.values[i].getText(), 10)); int retVal = res.zeilenAnzahl; res.destroy(); return retVal; } Text** LSDatenbank::getChatServerIpPort(int id) { Text* befehl = new Text("SELECT ip, port FROM server WHERE id = "); befehl->append(id); lock(); datenbank->befehl(befehl->getText()); Result res = datenbank->getResult(); unlock(); if (!res.zeilenAnzahl) { res.destroy(); return 0; } Text** ret = new Text * [2]; ret[0] = new Text(res.values[0].getText()); ret[1] = new Text(res.values[1].getText()); res.destroy(); return ret; } bool LSDatenbank::getSpielServerPortIp(int spielErstelltId, unsigned short* port, Text* ip) { Text* befehl = new Text("SELECT a.port, a.ip FROM server a, spiel_erstellt b " "WHERE a.id = b.server_spiel_id AND b.id = "); befehl->append(spielErstelltId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); *port = (unsigned short)TextZuInt(res.values[0].getText(), 10); ip->setText(res.values[1].getText()); res.destroy(); return 1; } int LSDatenbank::getSpielerAusGruppe(int gruppeId, Array< int >* accountId) { Text* befehl = new Text("SELECT account_id FROM gruppe_spieler WHERE gruppe_id = "); befehl->append(gruppeId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); int ret = res.zeilenAnzahl; for (int i = 0; i < ret; i++) accountId->add(TextZuInt(res.values[i].getText(), 10)); return ret; } int LSDatenbank::kickSpielerAusGruppe(int gruppeId, int accountId) { Text* befehl = new Text("SELECT spieler_verlaesst_gruppe( "); befehl->append(accountId); befehl->append(", "); befehl->append(gruppeId); befehl->append(" )"); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } bool LSDatenbank::getChatServerPortIp(int accountId, unsigned short* port, Text* ip) { Text* befehl = new Text("SELECT a.port, a.ip FROM server a, server_client b, account_client c " "WHERE a.server_typ_name = 'chat' AND c.client_id = b.client_id AND a.id = b.server_id AND c.account_id = "); befehl->append(accountId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); *port = (unsigned short)TextZuInt(res.values[0].getText(), 10); ip->setText(res.values[1].getText()); res.destroy(); return 1; } int LSDatenbank::getGruppeAdmin(int gruppeId) { Text* befehl = new Text("SELECT admin_account_id FROM gruppe WHERE id = "); befehl->append(gruppeId); 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; } int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } int LSDatenbank::getSpielerAusChatroom(int chatroomId, Array< int >* accountId) { Text* befehl = new Text("SELECT account_id FROM chatroom_spieler WHERE chatroom_id = "); befehl->append(chatroomId); lock(); if (!datenbank->befehl(befehl->getText())) { unlock(); befehl->release(); return 0; } Result res = datenbank->getResult(); unlock(); befehl->release(); int ret = res.zeilenAnzahl; for (int i = 0; i < ret; i++) accountId->add(TextZuInt(res.values[i].getText(), 10)); return ret; } int LSDatenbank::getChatroomAdmin(int chatroomId) { Text* befehl = new Text("SELECT admin_account_id FROM chatroom WHERE id = "); befehl->append(chatroomId); 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; } int ret = TextZuInt(res.values[0].getText(), 10); res.destroy(); return ret; } // constant Text* LSDatenbank::getLetzterFehler() const { return datenbank->getLetzterFehler(); }