Einfache Datenbank

www.HeikoGorski.de

Eine Frage, die in den Kursen immer wieder auftaucht ist die nach einer einfach zu verwendenden Datenbank.
“Kann so schwierig nicht sein...” war der erste Gedanke dazu - in der Open Source gibt es reichlich Implementationen, die dies leisten.
Das ist auch richtig, allerdings bieten die meisten Lösungen nur eine geringe Bandbreite an unterstützten Systemen, verwenden ODBC (Open DataBase Connectivity) oder setzen auf Datenbanksystemen auf, deren Vorhandensein vorausgesetzt wird.
Die meisten dieser Datenbanksysteme sind weder leichtgewichtig noch einfach zu installieren, benötigen häufig Administratorrechte usw.
Also weit entfernt vom Interesse der Teilnehmer, die etwas einfaches und portables suchen, welches nicht erst umständlich auf einem Rechner installiert werden muss.

Schließlich stieß ich bei den Recherchen auf DataReel, ein einfaches relationales Datenbanksystem in der Tradition von DBase - Open Source, übersichtlich, objektorientiert, reichliches Beispielmaterial, umfangreiche Dokumentation (Englisch),  nutzbar mit mehreren Compilern (MSVC, GCC, HPUX) und auf verschiedenen Plattformen (u.a. Windows und Linux).
Der Vorbereitungsaufwand zur Verwendung ist gering und außer den mitgelieferten Klassensystemen wird nichts weiter benötigt - also einfach perfekt.

Die folgende Anleitung zeigt die ersten Schritte und wie man DataReel mit Code::Blocks zum Laufen bekommt.

Erster Schritt Download des DataReel Zip Files aus dem Downloadbereich der DataReel Homepage.
Das zip File enthält alle Quellen und Informationen die benötigt werden, jede Menge Beispiele und eine vollständige Dokumentation.
Die in Code::Blocks benötigten Dateien sind in den Ordnern src (cpp Quellcode-Dateien) und include (header-Dateien) enthalten.
Will man das Datenbanksystem nutzen, dann kann man diese Dateien in den Projektordner kopieren, in das Projekt mit aufnehmen, mit übersetzen und das war es dann auch schon - die DataReel Datenbank ist bereit.
Hinweis: der Übersetzungsvorgang unter Code::Blocks wirft einige Warnings, die aber zunächst ignoriert werden können.
Wenn es einem nichts ausmacht eine ziemlich große Anzahl von Dateien (84 Quellcode-Dateien und 104 Header) in das Projekt einzubinden muss man nichts weiter tun.

Eleganter ist es aber die cpp-Dateien zu einer statischen Library zusammenzufügen, so dass man statt der 84 Quelldateien nur eine Library hinzulinken muss, und den Include-Pfad zu erweitern. Danach hat man eine 1,2 MB Datei mit dem Datenbanksystem und die Header können einmal an zentraler Stelle vorgehalten werden.

Um eine statische Library zu erzeugen geht man wie folgt vor:

Schritt 1 -  Projekt für eine statische Library in Code::Blocks anlegen
Code::Blocks
starten und im Menü “File -> New -> Project...” aufrufen. In der Auswahlliste nach unten scrollen und den Eintrag “Static library” auswählen  und mit Doppelklick oder dem Button “Go” bestätigen.

CodeBlockDB1

Man wird nun vom “static library wizard” begrüßt. Also gleich die Gelegenheit nutzen und die Checkbox “Skip this page next time” anhaken, damit man beim nächsten Projekt dieses Typs von weiteren Begrüßungen verschont bleibt.
In der nächsten Maske einen sinnvollen Projektnamen eingenben (z.B. DBDataReel) und mit “Next >” bestätigen.

CodeBlockDB2

Auf der Folgeseite die Vorbelegung einfach mit “Finish” bestätigen, die Daten sind sinnvoll vorbelegt.
Der Compiler erzeugt jetzt die notwendigen Daten und Voreinstellungen für das Projekt, sowie eine erste, aber überflüssige Datei mit dem Namen “main.c”. Diese Datei einfach aus dem Projekt löschen, sie dient nur als Beispiel und wird nicht benötigt.

CodeBlockDB3

Schritt 2 -  Quelldateien hinzufügen
Nun gilt es dem Projekt die benötigten Dateien hinzuzufügen.
Das ist im Fall von DataReel denkbar einfach.
Zunächst entpackt man das Download-Archiv an die Stelle, an der man die Dokumentation , Codes und Beispiele aufheben möchte.
Nach dem Entpacken fügt man den Inhalt des DataReel Unterverzeichnisses “src” - also alle Dateien in diesem Verzeichnis dem Projekt hinzu (in der Version 4.64 sind das 84 cpp-Quellcodedateien).
 

CodeBlockDB6

Den Vorschlag, die Dateien für den Debug- und Releasebuild hinzuzufügen, beantwortet man sinnvollerweise mit “ok”.

CodeBlockDB4

Code::Blocks fügt jetzt die Dateireferenzen dem Projekt hinzu.
Nun könnte man glauben übersetzen zu können, wer es versucht wird aber merken, dass der Compiler sofort mit einer  Fehlermeldungen reagiert, die besagt, dass Headerdateien nicht gefunden werden können.
Ursache ist, dass in den CPP-Dateien, die eben in das Projekt aufgenommen wurden, natürlich auch Headerdateien angesprochen werden, die jetzt weder im Projektpfad selbst noch im allgemeinen Pfad aller Headerdateien liegen.

Schritt 3 -  Headerdateien verfügbar machen
Um dieses Problem zu lösen nimmt man das DataReel Unterverzeichnis “include” entweder in den projektspezifischen Includepfad oder den allgemeinen Includepfad auf (letzteres ist nur zu empfehlen wenn man DataReel in sehr vielen Projekten benötigt).
Den projektspezifischen Includepfad findet man im Menü unter ”Project -> Build Options...” und im sich dann öffnenden Dialog unter der Unterseite “Search directories”.

CodeBlockDB7

Den allgemeinen Includepfad findet man im Menü unter “Settings -> Compiler and debugger” und dort wiederum in der Unterseite “Search directories”

Schritt 4 -  Die statische Library erzeugen
Nun steht der Übersetzung nichts mehr im Wege. Am Ende entstehen zwar noch eine handvoll Warnings, diese kann man aber ignorieren.
Nach der Übersetzung ist in Projektverzeichnis eine Datei mit der Endung .a entstanden. Wenn das Projekt mit DBDataReel benannt wurde, heißt die Datei “libDBDataReel.a”.
Diese Datei ist die erzeugte statische Library.

Schritt 5 -  Die statische Library nutzen
Nach der Erzeugung bleibt noch die Frage, wie man die statische Library nutzt.
Der Test ist einfach.
Man erzeugt ein neues Konsolenprojekt und fügt aus dem DataReel Unterverzeichnis “example.db\simple\” die Datei “testprog.cpp” hinzu. Diese ersetzt das erzeugte von Code::Blocks Mainfile, das aus dem Projekt entfernt werden kann.
Wenn nötig jetzt noch den Includepfad des Projektes erweitern (siehe Schritt 3).
Übersetzt man jetzt das Projekt, stolpert der Compiler zunächst über “iostream.h”. Das liegt daran, dass der Code für mehrere Compiler geschrieben wurde, auch solche, die die aktuelle ANSI Version noch nicht unterstützen. Für die Umschaltung benötigt der Compiler die entsprechende Information. Ein Blick auf den Code enthüllt, dass die Codezeile

#if defined (__USE_ANSI_CPP__)

für die Umschaltung sorgt.
Der Compiler kennt aber das Symbol __USE_ANSI_CPP__ nicht. Um es in allen CPPs bekannt zu machen, stellt man es projektspezifisch im Menü unter ”Project -> Build Options...” und im sich dann öffnenden Dialog unter der Unterseite “Compiler settings” in der Unter-Unterseite “#defines” ein. Global geht das natürlich übergreifen unter “Settings” auch.

CodeBlockDB8

Jetzt ergibt erneute die Übersetzung eine ganze Reihe von Linker-Fehlern, nach dem Schema

undefined reference to <Funktions oder Methodenname>

Ursache ist, dass dem Linker noch die Information fehlt, dass er die zuvor erstellte statische Library zum Projekt hinzulinken soll, die ja all diese Funktionen und Methoden enthält.
Also begibt man sich erneut im Menü in die projektspezifischen Einstellungen, diesmal unter ”Project -> Build Options...” und man wählt im sich dann öffnenden Dialog die Unterseite “Linker settings”.
Hier fügt man den Pfad auf die statische Library ein. Auch dieses kann man unter “Settings” als globale Vorbelegung für alle Projekte machen - empfiehlt sich aber nicht wirklich, da man sonst bei kleinen Testprojekten viel Ballast mit herumschleppt.

CodeBlockDB9

Jetzt sollte der Compile-Vorgang ohne Fehler abgeschlossen werden können.
Die entstehende EXE-Datei ist problemlos lauffähig.

Startseite   VHS Hamburg   Kurse   Downloads   Compiler & Code   Impressum 
website design software
email