PR DBS II 08
Aus DBIS
Inhaltsverzeichnis
|
Praktikum Implementierung von Datenbanken
Organisatorisches
Offizielle Homepage zum Praktikum / Link zu den Praktikumsfolien: http://www.dbis.informatik.hu-berlin.de/lehre/semesteruebersicht/sommersemester-2008/praktikum-implementierung-von-datenbanken-dbs-ii.html
Fragen zu den Aufgaben
- zu Aufgabe: Kurzvortrag: Was wollen wir implementieren?
- zu Aufgabe: Kurzvortrag: Wie wollen wir es implementieren?
- zu Aufgabe: HubDB
Software
Entwicklungsumgebung
- Eclipse: http://www.eclipse.org
- CDT (Eclipse-Plugin für C/C++): http://www.eclipse.org/cdt
Zugang zum Linux-Pool (für Windows)
- X-Server Xming: http://www.straightrunning.com/XmingNotes/
- SSH-Client Putty: http://www.chiark.greenend.org.uk/~sgtatham/putty/
HubDB
Einführung
HubDB ist ein minimales relationales Datenbank-Management-System (RDBMS). Es soll dazu dienen die einzelnen Komponenten besser zu verstehen.
- Was kann HubDB?
- Client-Server-Umgebung
- Server ist Multi-Threading fähig
- D. h. mehrere Client können gleichzeitig mit dem Datenbanksystem (DBS) arbeiten
- Verwaltung mehrere Datenbanken
- Erzeugen und Löschen von Relationen
- Beschränkung auf maximal 10 Attribute pro Relation
- als Datentypen sind INTEGER, DOUBLE und VARCHAR der Länge 30 vorhanden
- Einfügen und Löschen von Tupeln
- IMPORT und EXPORT von Relation
- Einfache SPJ-Anfragen
- Beschränkung auf Equi-Join mit 2 Relationen
- Verwendung von verschieden Indizes
- Verwendung verschiedener Pufferersetzungsstrategien ohne neues Kompilieren
- Verwendung verschiedener Anfrageausführungsstrategien ohne neues Kompilieren
- Was kann HubDB nicht?
- Keine Nutzer- und Rechteverwaltung
- Kein feines Locking
- Kein Transaktionskonzept oder Scheduling
- ...
Klassendiagramm zu HubDB
Verzeichnisstruktur
Hauptverzeichnis ist "HubDB". Darunter liegen die Verzeichnisse:
- DBApp - Quellen für Applikationen (hubDBClient, hubDBServer)
- DBLib - Quellen für die Bibliothek hubDB
- include/hubDB - Headerfiles für HubDB
- include/log4cxx - Headerfiles für LOG4CXX
- tools - Werkzeuge zum Bauen von LOG4CXX
- bin - Binärdateien der Applikationen (hubDBClient, hubDBServer)
- lib - Sharedlibraries (libhubDB, liblog4cxx)
Im Hauptverzeichnis liegen auch die Konfigurationsdateien für LOG4CXX, daher sollten die Programme auch von dort aus gestartet werden.
Dynamisches Laden von Klassen
C++ bietet keine Standardmethode, um Klassen anhand ihres Namens zu laden. Daher existierten in HubDB zwei Funktionen "setClassForName" und "getClassForName", die diese Funktionalität implementieren.
setClassForName(name, function) - ordnet dem Klassennamen "name" den Konstruktor "function" zu
getClassForName(name, nArgs, ...) - ruft die mit setClassForName gesetzte Funktion für die Klasse mit Namen "name"
auf und übergibt den Argumentenzähler "argc" sowie die Argumentenliste
Jede Klasse, die dynamisch geladen werden soll, muss zwei Funktionen implementieren.
registerClass() - diese Funktion ruft setClassForName auf
createFunction(nArgs, ...) - diese Funktion kreiert eine neue Instanz der Klasse mittels New-Operator
Beispielimplementationen liegen in DBRandomBufferMgr, DBSeqIndex und DBSimpleQueryMgr.
LOG4CXX
- LOG4CXX Dokumentation: http://logging.apache.org/log4cxx/apidocs/index.html
In HubDB wird LOG4CXX als Logging-Mechanismus verwendet. LOG4CXX ist eine C++-Implementierung bzw. Portierung von log4j.
Alle Klassen haben ihren eigenen privaten Logger. Ausnahmen sind die Klassen unter HubDB::DBType::, sie verwenden alle den globalen Logger von DBType.
Die Konfiguration findet über die Dateien log4c++.hubDB.properties.{client|server} statt.
MAKROS
Die folgenden Makros können verwendet werden:
LOG4CXX_DEBUG(logger, message) - Ausgabe von Debug-Informationen LOG4CXX_INFO(logger, message) - Ausgabe von allgemeinen Informationen LOG4CXX_WARN(logger, message) - Ausgabe von Warnungen LOG4CXX_ERROR(logger, message) - Ausgabe von Fehlern
Fehlerbehandlung
Zur Fehlerbehandlung wird try{}catch{} verwendet. Es sollten nur Instanzen der Klasse DBException oder von ihr abgeleiteten Klassen geworfen werden. In DBException.h sind allgemeine Klassen definiert, es kann aber auch jede Klasse ihre eigenen Exception von DBException ableiten (Achtung: Namespace beachten).
Make
Zum Erstellen der Binaries verwenden wir "make".
Make-Ziele
make [all] -- erzeugt die Bibliothek und die Programme
make clean -- löscht alle Objektdateien, sowie Ziele die in CLEAN_TARGETS definiert wurden
make distclean -- wie clean, aber es werden auch die Bibliothek und die Programme gelöscht
make package -- packt das Verzeichnis HubDB in ein tar.gz Archiv
Um eine neue Quelldatei in die Bibliothek einzubinden, muss der Dateiname in das Makefile unter DBLib an die Variable libhubDB_SRCS angehangen werden. Abhängigkeiten müssen nicht definiert werden, sie werden automatisch erstellt. Um ein zusätzliches Programm zu erzeugen, muss das Makefile in DBApp geändert werden. Dabei wird in der Variablen BIN_TARGETS das Ziel definiert (z. B. $(BINDIR)/hubDBFOO) und die beiden Variablen hubDBFOO_SRCS bzw. hubDBFOO_LIBS geben die Bibliotheken und Quelldateien an.
Kommandoparameter
hubDBServer
hubDBServer [-p <portNum>] [-m] [-d] [-b <bufferMgrName>] [-q <queryMgrName>]
-p <portNum> -- bestimmt das Port auf dem der Server auf Verbindungen wartet
-m -- aktiviert die Monitoringkomponente
-d -- schaltet das Threading des Servers aus
-b <bufferMgrName> -- gibt den Klassennamen für den zu ladenden BufferMgr an
-q <queryMgrName> -- gibt den Klassennamen für den zu ladenden QueryMgr an
Der Server wird mit CTRL-C oder SIGINT beendet. Er wartet allerdings noch bis alle Clients geschlossen wurden. Wenn der Server nicht ordnungsgemäß beendet wird kann es zu Datenverlust kommen!!!
hubDBClient
hubDBClient [-p <portNum>] [-s <serverName>]
-p <portNum> -- bestimmt das Port auf dem die Verbindungen hergestellt werden soll
-s <serverName> -- bestimmt den Namen / IP-Adresse des Servers
HubDBSQL-Anfragesprache
- Jedes Kommando wird mit einem Semikolon beendet.
Kommandos ohne Connection
CREATE DATABASE <dbname> - Erzeugt die DB <dbname>
DROP DATABASE <dbname> - Löscht die DB <dbname>
CONNECT TO <dbname> - Verbindet den Client mit der DB <dbname>
DISCONNECT - Löst die aktuelle Verbindung
PRINT STATISTICS - Liefert die aktuellen Monitordaten, falls Monitoring aktiviert wurde
PRINT CLASSES - Liefert die Namen der Klassen die Dynamisch geladen werden können
HELP - Gibt eine kurze Syntaxbeschreibung aus
QUIT - Beendet das Clientprogramm
Kommandos, die eine Verbindung benötigen
LIST TABLES - Listet alle Relationen der DB auf
GET SCHEMA FOR TABLE <tabname> - Liefert das Schema der Relation <tabname>
CREATE TABLE <tabname> AS (
<attrname> {INTEGER|DOUBLE|VARCHAR} [UNIQUE]
{,<attrname> {INTEGER|DOUBLE|VARCHAR} [UNIQUE]}*) - Erzeugt die Relation <tabname>
DROP TABLE <tabname> - Löscht die Relation <tabname>
CREATE INDEX <tabname>.<attrname> [TYPE <idxclassname>] - Erzeugt einen Index vom TYPE <idxclassname> auf <tabname>.<attrname>
DROP INDEX <tabname>.<attrname> - Löscht den Index auf <tabname>.<attrname>
INSERT INTO <tabname> VALUES (x, y, z, ...) - Fügt ein Tupel in die Relation <tabname> ein
DELETE FROM <tabname>
[WHERE <tabname>.<attrname> = value {AND <tabname>.<attrname> = value}*]
- Löscht die selektierten Tupel aus <tabname>
SELECT {*|<tabname>.<attrname>{,<tabname>.<attrname>}*}
FROM <tabname>
[JOIN <tabname> ON <tabname>.<attrname> = <tabname>.<attrname>]
[WHERE <tabname>.<attrname> = value {AND <tabname>.<attrname> = value}*]
- Selektiert Tupel aus der Datenbank
IMPORT FROM <filename> INTO <tabname> - Importiert Tupel aus <filename> in die Relation <tabname>
EXPORT <tabname> TO <filename> - Exportiert alle Tupel aus der Relation <tabname> nach <filename>
Hinweise zum Arbeiten mit HubDB
- Alle Scripte sind auf eine BASH-Shell ausgelegt, speziell setenvHubDB.sh
- Nach dem Auschecken der Quellen muss in der Datei Makefile.common die Zeile TOPDIR entsprechend angepasst werden. Um den richtigen Pfad zu bekommen, kann der Befehl "pwd" verwendet werden.
- Desweiteren muss das Script "build_log4cxx.sh" im Verzeichnis "tools" ausgeführt werden. Damit wird die Bibliothek "log4cxx" gebaut und die Header-Files an die richtige Stelle kopiert.
- Jetzt kann die HubDB mit "make" gebaut werden.
- Um die Programme starten zu können, müssen noch die Umgebungsvariablen "PATH" und "LD_LIBRARY_PATH" angepasst werden. Dazu kann das Skript setenvHubDB.sh verwendet werden. (Aufruf source setenvHubDB.sh oder . setenvHubDB.sh)

