PR DBS II 08

Aus DBIS

Wechseln zu: Navigation, Suche

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

Software

Entwicklungsumgebung

Zugang zum Linux-Pool (für Windows)

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

Bild:Classdia.png

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

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)
Persönliche Werkzeuge