Die Abbildung eines Datenbankschemas auf die Datenstrukturen eines Anwendungsprogramm ist einfach, wenn auf beiden Seiten das gleiche Datenmodell verwendet wird. Insofern können objekt-orientierte Datenbanksysteme leicht in Anwendungsprogramme eingebunden werden. Die zugehörigen Programmierschnittstellen ermöglichen transparenten Zugriff auf Datenbankobjekte und deren Methoden.
O
[O
-94] ist ein objekt-orientiertes Datenbankmanagementsystem, das
aus einem Datenbankkern und einer Entwicklungsumgebung besteht. Die
Entwicklungsumgebung beinhaltet eine Applikationsprogrammschnittstelle
(O
API) und Schnittstellen zu C, C++ und anderen Programmiersprachen.
Außerdem kann man Anfragen in OQL (Object Query Language) formulieren und
Objekte und Methoden mit der Datenbanksprache O
C definieren. Diese Umgebung ist
Grundlage für weitere Werkzeuge (O
Look, O
Graph),
die das Erstellen von GUI-basierten Applikationen ermöglichen.
Die C++-Programmierschnittstelle ermöglicht die Speicherung von Objekten aus
Applikationsprogrammen. Das O
System
spielt dabei die Rolle eines virtuellen Objektmanagers für eine
Applikation, d.h. zur Laufzeit ist ein Zugriff auf die Objekte möglich, die sich schon im
Speicher der Applikation befinden, andere Objekte müssen zunächst durch
das Datenbanksystem geladen werden, bevor darauf zugegriffen werden kann.
O
erweitert dafür Standard-C++-Programme um folgende Features:
New_Employees (definiert in O Set<Ref<Employee>> new_emps("New_Employees");.
Persistente Zeiger werden durch C++-Templates definiert: der C++-Typ Ref<X>
steht für eine Referenz (oder Zeiger) auf ein Element der Klasse X.
Objekte des Typs Ref<X>
können in C++ genauso benutzt werden wie Zeiger. Auch Felder, Listen und Mengen werden
mit Template-Klassen implementiert: Set<Ref<X>> steht für eine Menge von Objekten
der Klasse X.
Die Klasse Employee hat ein Attribut name und ein Attribut dept, das ein Feld von Departments enthält.class Employee { char *name; Varray<Ref<Department>> dept; Ref<Department> find_dept(char* n); };Die Methode
find_deptsucht eine Abteilung mit bestimmten Namen in der Menge der Abteilungen eines Angestellten.Ref<Department> Employee::find_dept(char *n) { int i; Ref<Department> d; for (i=0; i < dept.size; i++) { d=dept.item[i]; if(d.name == n) return d; } return (Department*) 0; // Null, wenn kein Department // gefunden wurde }
Besonders interessant ist die Möglichkeit, Datenbankobjekte entweder durch C++-Klassen oder mit der
Datenbanksprache O
C zu deklarieren. Damit können bereits existierende C++-Programme
leicht in O
integriert werden.
O
verfügt dafür über ein Hilfsprogramm (o2import),
das die Header-Dateien mit den Klassendefinitionen in C++ einliest und daraus
dann Klassen für das Datenbanksystem und zusätzlichen C++-Code für den Zugriff
auf die Datenbankobjekte generiert.
Andererseits kann man mit o2export aus Klassen des Datenbanksystems
C++-Klassen erstellen, womit die Applikation auf die Objekte der Datenbank zugreifen
und deren Methoden aufrufen kann.
Abbildung 3.6: Erstellung eines C++-Programms mit O
Gegeben sei folgende Definition der Klasse Employee in O:
class Employee type tuple ( name: string, dept: list(Department)) public method add_department(d: Department) end;
add_departmentsei hier in OC als Methode für Datenbankobjekte implementiert. o2export erstellt daraus automatisch die folgende C++-Klasse, die C++-Funktion
add_departmentruft dabei nur die entsprechende O-Methode auf.
class Employee : public virtual Persistent_Object { public: char *name; Varray<Ref<Department>> dept; void add_department(Ref<Department>); };
Die einzelnen Schritte und Komponenten, mit denen eine auf O
basierende C++-Applikation
erstellt werden kann, sind in Abbildung 3.6 dargestellt. Neben den generierten
C++-Klassen können auch applikationsspezifische Quellcode-Dateien in anderen
Programmiersprachen zu einem Programm zusammengebunden werden.
Christoph Quix