prev up next

C++-Einbettung

Zur Einbindung von objektorientierten Datenbanksystemen in eine Programmiersprache gibt es drei Ansätze:


C++-Einbindung

Die von der ODMG gewählte Einbindung entspricht dem dritten Ansatz. Ihre Realisierung ist in Abbildung 16.15 dargestellt. Der Benutzer erstellt die Klassendeklarationen und den Quellcode der Anwendung. Die Klassendeklarationen werden mit Hilfe eines Präprozessors in die Datenbank eingetragen. Zusätzlich werden Header-Dateien in Standard-C++ erzeugt, die durch einen handelsüblichen C++-Compiler übersetzt werden können. Der Quellcode enthält die Realisierungen der den Objekttypen zugeordneten Operationen. Der übersetzte Quellcode wird mit dem Laufzeitsystem gebunden. Das Laufzeitsystem sorgt in der fertigen Anwendung für die Kommunikation mit der Datenbank.

Zur Formulierung von Beziehungen zwischen persistenten Objekten bietet die C++-Einbettung die Typen d_Rel_Ref und d_Rel_Set an:


const char _liest[]      = "liest";
const char _gelesenVon[] = "gelesenVon";

class Vorlesungen : public d_Object {
  d_String Titel;
  d_Short  SWS;
  ...
  d_Rel_ref <Professoren, _liest> gelesenVon;
}

class Professoren : public Angestellte {
  d_Long PersNr;
  ...
  d_Rel_Set <Vorlesungen, _gelesenVon> liest;
}

Es wurden hier zwei Klassen definiert. Vorlesungen ist direkt vom Typ d_Object abgeleitet, Professoren ist über d_Object und dann über Angestellte (nicht gezeigt) abgeleitet. Der Typ d_object sorgt dafür, daß von Vorlesungen und Professoren nicht nur transiente, sondern auch persistente Instanzen gebildet werden können. Die Typen d_String, d_Short und d_Long sind die C++-Versionen der ODL-Typen string, short und long.

In der Klasse Vorlesungen referenziert das Attribut gelesenVon durch d_Rel_Ref ein Objekt vom Typ Professoren. Als zweites Argument in der Winkelklammer wird die entsprechende inverse Abbildung liest angegeben. In der Klasse Professoren referenziert das Attribut liest durch d_Rel_Set eine Menge von Objekten vom Typ Vorlesungen. Als zweites Argument in der Winkelklammer wird die entsprechende inverse Abbildung gelesenVon angegeben.

Zum Erzeugen eines persistenten Objekts verwendet man den Operator new:


d_Ref <Professoren> Russel =
  new(UniDB,"Professoren") Professoren (2126,"Russel","C4", ...);
Hierbei ist Russel eine Variable vom Typ d_Ref bezogen auf Professoren, die auf das neue Objekt verweist (im Gegensatz zu d_Rel_Ref ohne inverse Referenz). Als zweites Argument wird der Name des erzeugten Objekttypen als Zeichenkette angegeben.

Als Beispiel einer Anfrage wollen wir alle Schüler eines bestimmten Professors ermitteln:

d_Bag <Studenten> Schüler;
char * profname = ...;
d_OQL_Query anfrage (ßelect s
                      from s in v.Hörer,
                      v in p.liest,
                      p in AlleProfessoren
                      where p.Name = $1");
anfrage << profname;
d_oql_execute(anfrage, Schüler);
Zunächst wird ein Objekt vom Typ d_OQL_Query erzeugt mit der Anfrage als Argument in Form eines Strings. Hierbei können Platzhalter für Anfrageparameter stehen; an Stelle von $1 wird der erste übergebene Parameter eingesetzt. Dies geschieht mit dem <<-Operator der Klasse d_OQL_Query. Die Anfrage wird mit der Funktion d_oql_execute ausgeführt und das Ergebnis in der Kollektionsvariablen vom Typ d_Bag (Multimenge mit Duplikaten) zurückgeliefert.


prev up next