Persistenter VRML Inhalt  -  Datenbanken und VRML

 
 
 
 

Seminararbeit

von

Alexander Selzer

aus

Aspach
 
 
 
 
 
 

vorgelegt am

Lehrstuhl für Praktische Informatik IV

Prof. Dr. Effelsberg

Fakultät für Mathematik und Informatik

Universität Mannheim
 
 
 
 
 

Januar 1999



 

 

Inhaltsverzeichnis


1. Einleitung

2. Die Verwendung von Datenbanken

3. Embedded SQL und Server Side Includes

3.1 Embedded SQL
3.1.1 VRML Syntax

3.1.2 SQL Syntax

3.1.3 Beispiel

3.2 Server Side Includes
3.2.1 Syntax

3.2.2 Beispiel

4. Weiterführende Gedanken

5. Vorhandene Implementierungen

Anhang A  Tabelle der Fehlercodes

Anhang B  Links und Quellen
 



 

1. Einleitung

Die  Virtual Reality Modeling Language (VRML) ist eine Skriptsprache zur Gestaltung dreidimensionaler Szenen im World Wide Web (WWW). Dies stellt eine wesentliche Erweiterung zu gewöhnlichen HTML-Seiten dar. Der Betrachter kann sich in der dreidimensionalen Szene bewegen und die Informationen "begehen". Dem Entwickler steht somit eine weitere Möglichkeit zur Verfügung, seine Informationen zu präsentieren und die interaktive Komponente des WWW  stärker zu betonen.
Die Darstellung einer VRML-Szene erfolgt mit Hilfe eines PlugIns (z.B. "CosmoPlayer" von "Silicon Graphics") durch den Internet-Browser. Für eine ausführliche Beschreibung der VRML siehe Seminar 1 und Seminar 2.

Als mögliche Anwendungen kann man sich die Darstellung von chemischen Molekülen oder des Belegungsplans einer Messehalle vorstellen. Diese Beispiele machen auch deutlich, daß der Datenhaltung bei der Gestaltung von komplexen dreidimensionalen Szenen eine zentrale Rolle zukommt. Deshalb werden in dieser Arbeit die Mechanismen der VRML zum Datenbankzugriff beschrieben.

Um in einer VRML-Anwendung auf eine Datenbank zugreifen zu können, existieren zwei Vorschläge der Database Working Group: Embedded SQL (auch SQL-Scripting genannt) und Server Side Includes (auch ServerRedirect genannt). Beide werden in Kapitel 3 ausführlich beschrieben.
Davon ausgehend stellt sich die Frage, wie man aus den Informationen, die in der Datenbank gespeichert sind, eine VRML-Szene generieren kann. Dazu wird ein Vorschlag in Kapitel 4 gemacht.
 

zurück zum Inhaltsverzeichnis



 

2. Die Verwendung von Datenbanken

Um die VRML ebenso universell wie andere Programmiertechniken einsetzen zu können, muß die Möglichkeit bestehen, Daten persistent zu machen. Kommerzielle Anwendungen müssen große Datenmengen verarbeiten können. Außerdem soll eine Szene, die auf persistente Daten zugreift, immer den aktuellen Stand der Datenbasis repräsentieren. Das doppelte Erfassen von Daten soll vermieden werden, um einen konsistenten Zustand der Datenbasis im gesamten Unternehmen zu gewährleisten. Dafür ist der Einsatz einer Datenbank unumgänglich. Auf die allgemeinen Vorteile des Einsatzes von Datenbanken, wie zum Beispiel einfaches Recovery, im Vergleich zu anderen Formen der Datenhaltung, soll an dieser Stelle nicht weiter eingegangen werden.

Die Datenbank erfüllt in Verbindung mit VRML vor allem die drei folgenden Funktionen:

Erstens verwaltet sie die Anwendungsdaten wie dies auch in normalen Datenbankanwendungen geschieht.

Zweitens speichert sie die Bestandteile einer Szene, die nicht innerhalb der Szenenbeschreibung beschrieben werden können (z.B. Grafiken oder Audiodateien).

Drittens können mit Hilfe der Datenbank Teilszenen gespeichert werden, die häufiger verwendet werden.
 

Zwei unterschiedliche Architekturen einer Datenbankanwendung sind möglich. Bei der zweischichtigen Architektur greift der VRML-Browser direkt auf die Datenbank zu. Diese Architektur ist vor allem für den Einsatz in einem Intranet geeignet, wenn Sicherheitsaspekte keine so große Rolle spielen. Bei der dreischichtigen Architektur wird über einen Web-Server auf die Datenbank zugegriffen. Bei Internet-Anwendungen wird dadurch der Einsatz einer Firewall ermöglicht, um die Sicherheit der Datenbank garantieren zu können. Mit der Embedded SQL Technik, kann sowohl eine zwei- als auch dreischichtige Architektur implementiert werden. Der Einsatz des ServerRedirect Knotens ist nur in Verbindung mit einem Web Server möglich, der diese Technik unterstützt.
 

Abbildung 1 zeigt das Modell einer dreischichtigen Datenbankanwendung.

Die oberste Schicht bildet der Browser mit VRML-PlugIn. Darauf läuft die Anwendung, mit der der Anwender auf die Datenbank zugreift.

Die zweite Schicht bildet der Web Server. Diese Schicht regelt den Zugriff auf die Datenbank.

Die unterste Schicht bildet die Datenbank. Die Anwendung kann auf die Daten nur über die SQL-Ebene zugreifen.
 
 


Abbildung 1: Modell einer Datenbankanwendung






zurück zum Inhaltsverzeichnis



 

3. Embedded SQL und Server Side Includes

Die Ausführungen in diesem Abschnitt basieren auf dem Database Working Group Proposal: "Recommended Practices for SQL Database Access". Bei der Erstellung des Propsals wurden folgende Anforderungen berücksichtigt:

3.1 Embedded SQL

Bei Embedded SQL wird ein SQL Script Knoten, also ein spezieller Script Knoten, verwendet, um SQL-Befehle auszuführen. Ein Script Knoten dient dazu, ein Script, das in Java oder in Javascript geschrieben ist, in eine VRML Szene einzubinden. In diesem Script können dann zum Beispiel komplexe Berechnungen durchgeführt werden, die in VRML nicht möglich sind.
 

3.1.1 VRML Syntax

Es folgt die Beschreibung der Sytax des SQL Script Knoten:

 Script {
    field SFString sql ""
    eventIn SFString set_sql
    eventOut SFString sql_changed
    eventIn SFBool execute
    eventOut SFInt32 result
    eventOut SFString errorMessage
    url "execsql.class"
    # And any number of
    field fieldType input_parameter_name initialValue
    eventIn eventType input_parameter_name
    eventOut eventType output_parameter_name
    }

Das Feld sql enthält einen SQL Ausdruck, wie er im nächsten Abschnitt beschrieben wird.

Der SQL Script Knoten reagiert auf das  Ereignis set_sql. Es wird verwendet, um den Inhalt des sql Feldes zu verändern.

Das Ereignis sql_changed wird ausgelöst, wenn sich der Inhalt des sql Feldes ändert.

Als Reaktion auf das Ereignis execute wird die zugehörige sql Anweisung ausgeführt. Der Kontrollfluß kehrt aber unmittelbar zum Browser zurück.Wenn mehrere Ereignisse gleichzeitig (mit dem gleichen Zeitstempel versehen) eingehen, wird das execute Ereignis als letztes ausgeführt.

Die Ereignisse result und errorMessage werden ausgelöst, wenn eine SQL Anweisung beendet ist. Wenn die Anweisung erfolgreich ausgeführt wurde, ist
result = 0 und errorMessage enthält einen leeren String, andernfalls enthält result eine Fehlernummer und errorMessage die entsprechende Fehlermeldung (Siehe Anhang A). Es ist sichergestellt, daß diese beiden Ereignisse immer ausgelöst werden, wenn ein SQL Script ausgeführt wird.

Das Feld url referenziert eine Java Klasse, die ein SQL-Script implementiert. Es kann eine Liste von mehreren Klassen angegeben werden. Der Browser lädt dann die erste Klasse, auf die er Zugriff hat.

input_parameter_name dienen als Variablen, deren Wert unmittelbar vor der Ausführung der SQL-Anweisung bestimmt wird. Der Wert kann durch ein Feld oder ein eingehendes Ereignis desselben Names definiert werden. Wenn der Parameter verwendet wird, muß dem Namen ein Doppelpunkt vorangestellt werden.

output_parameter_name dienen entsprechend den Input Parametern zur Aufnahme von Ausgabewerten des SQL-Scripts. Sie werden im INTO Teil der SQL-Anweisung verwendet.

Die folgenden VRML Datentypen können in SQL Datentypen gemappt werden:

SFBool nach BIT
SFInt32 nach INTEGER
SFFloat nach REAL
SFString nach VARCHAR oder LONGVARCHAR
Andere VRML Datentypen werden nicht unterstützt. Ihre Verwendung führt zu einem Fehler.

Umgekeht werden

CHAR, VARCHAR, LONGVARCHAR, BINARY, VARBINARY, LONGVARBINARY, DATE, TIME und TIMESTAMP nach MFString
NUMERIC, REAL, FLOAT und DOUBLE nach MFFloat
DECIMAL, BIT, TINYINT, SMALLINT, INTEGER und BIGINT nach MFInt32
gemappt.
 
 

3.1.2 SQL Sytax

Alle Implementierungen sollten als Mindestanforderung den ANSI SQL 92 Standard unterstützen. Die folgende Funktionalität sollte zusätzlich zur Verfügung gestellt werden:

CONNECT/DISCONNECT
Diese Befehle werden verwendet, um eine Verbindung zum Datenbank-Server herzustellen bzw. aufzulösen, auf dem die SQL-Befehle ausgeführt werden sollen.

CALL
Der Call-Befehl ermöglicht es, eine auf dem Server gespeicherte Procedure oder Funktion auszuführen.

NEXT <n>
Dieser Befehl wird in Verbindung mit der select- und for-Anweisung verwendet. Er wiederholt die letzte select-Anweisung und liefert die mit <n> spezifizierte Anzahl an Reihen als Ergebnis.

SET
Mit Set können die Werte der beiden Variablen TRANSACTION und AUTOCOMMIT gesetzt werden. Mögliche Werte für AUTOCOMMIT sind TRUE und FALSE. Für TRANSACTION können die Werte READ_COMMITTED, READ_UNCOMMITTED, REPEATABLE_READ, SERIALIZABLE spezifiziert werden. Zu deren Bedeutung sei auf die einschlägige Datenbankliteratur verwiesen.

COMMIT
Mit diesem Befehl werden die Änderungen der Transaktion in der Datenbasis festgeschrieben.

ROLLBACK
Wenn AUTOCOMMIT auf FALSE gesetzt ist, kann mit diesem Befehl eine Transaktion rückgängig gemacht werden.

INTO
Mit INTO wird ein Output Parameter spezifiziert der das Ergebnis einer Spalte der Anfrage aufnehmen kann.

FOR <n>
Mit <n> kann die Anzahl der Ergebnisreihen angegeben werden, die von einer SELECT-Anweisung zurückgegeben werden sollen.

AT
Mit AT kann man eine bestimmte Datenbankverbindung auswählen, die vorher mit CONNECT hergestellt wurde.Wenn keine AT-Klausel angegeben wird, wird die Default-Verbindung verwendet.

{} pass-through clause
In {} eingeschlossener Text wird direkt an die Datenbank "durchgereicht". Es findet keine Interpretation durch den SQL-Script-Mechanismus statt.
 
 

3.1.3 Beispiel

Script {
    eventIn SFBool execute
    eventOut MFString name
    eventOut MFString einkommen
    field SFString sql "FOR ALL SELECT NAME, EINKOMMEN INTO :name, :einkommen FROM ANGESTELLTE"
    url "execsql.class"
    }

Erklärung:
name und einkommen sind die Variablen, in denen das Ergebnis der Anfrage zur Verfügung steht. FOR ALL gibt an, daß alle Ergebnisreihen geliefert werden sollen. NAME und EINKOMMEN sind Spaltennamen der Tabelle ANGESTELLTE. Die url "execsql.class" gibt die Javaklasse an, die die herstellerspezifische Anbindung der Datenbank ermöglicht. In diesem Beispiel befindet sie sich im selben Verzeichnis wie die VRML-Datei.

zurück zum Inhaltsverzeichnis
 
 

3.2 Server Side Includes

Bei diesem Mechanismus wird der ServerRedirect Knoten benutzt. Er ermöglicht es, Server Side Includes Logik in einer VRML-Datei auszuführen. Die VRML-Datei, die den ServerRedirect Knoten enthält, muß auf einem Server liegen, der die ServerRedirect Syntax unterstützt. Die Felder, die der Knoten spezifiziert, werden vor dem Verschicken der VRML-Datei an den Client (also den Browser) durch die Abarbeitung der Anweisung dynamisch gefüllt. Der ServerRedirect Knoten kann nicht nur in Verbindung mit SQL, sondern auch mit Perl, Java usw. verwendet werden. Der ServerRedirect Knoten wird vom Client ignoriert.
 
 

3.2.1 Syntax

Es folgt die Beschreibung der Syntax des ServerRedirect Knoten:

PROTO ServerRedirect [
    field MFString nodeName []
    field MFString fieldName []
    field MFString url []
    field MFNode children [] ]
  { Group {
      children IS children
      }
  }

Das Feld nodeName referenziert einen oder mehrere Knoten, die in der VRML-Datei definiert sind.

Das Feld fieldName referenziert Felder der mit nodeName spezifizierten Knoten. Die Felder werden mit dem generierten Inhalt gefüllt.

Das url Feld definiert die Sprache und die Anweisung, die ausgeführt werden soll.

Das Feld children kann jede Art von VRML Geometrie-Objekten spezifizieren. Wenn der ServerRedirect Knoten ein children Feld definiert, dann können nur die dort angegebenen Variablen das Ergebnis der Anfrage aufnehmen.
 
 

3.2.2 Beispiel

ServerRedirect {
  nodeName [ "barName" ]
  fieldName [ "string" ]
  url [ "sql: select dname from dept where deptno=1" ]
  children [
    Shape {
      appearance DEF white Appearance {
        material Material {
          diffuseColor 1 1 1
        }
      }
      geometry DEF barName Text {
        string ""
        fontStyle FontStyle {
          size 1
          justify "MIDDLE"
          style "BOLD"
        }
      }
    }
  ]
}
 

Erklärung:
Wenn die Datei, die obigen Code enthält, vom Server abgerufen wird, wird die im url Feld angegebene Anfrage ausgeführt. Das Ergebnis füllt den string des Textknoten barName. Dann wird die Datei zum Browser übertragen und dort ausgeführt, das heißt der Text wird ausgegeben.
 

zurück zum Inhaltsverzeichnis



 

4. Weiterführende Gedanken

Mit den oben beschriebenen Konzepten ist es jetzt möglich auf Datenbanken zuzugreifen. Die Realisierung von VRML-Anwendungen, die die Datenbank dazu nutzen, dem Anwender eine Textabfrage zu ermöglichen oder einen Datensatz in die Datenbank einzutragen, kann mit den Standard VRML-Programmiertechniken geschehen. Sollen jedoch auf eine Anfrage hin komplexe Welten generiert werden, muß man sich überlegen, wie diese Aufgabe effizient  umgesetzt werden kann. Die Lösung ist die Erstellung einer Klassenbibliothek, mit deren Hilfe der Anwendungsentwickler datenbankbasierende VRML-Szene erstellen kann.

Folgende Eingenschaften sollte die Klassenbibliothek mindestens aufweisen:


Die Verwendung einer Klassenbibliothek erleichtert die Entwicklung von Anwendungen dadurch, daß sie das Arbeiten auf einem höheren Abstraktionsniveau erlaubt. Mit den in der Bibliothek definierten Klassen und deren Methoden können VRML-Szenen erstellt und bearbeitet werden.
Der Entwickler legt zuerst das Aussehen der Datenbanktabellen fest. Dann schreibt er seine Anwendung unter Verwendung der Klassenbibliothek.

Dieses Kapitel ist nicht als Anleitung zur Erstellung einer Klassenbibliothek gedacht, sondern soll nur eine Anregung geben, wie die oben beschriebenen Mechanismen sinnvoll eingesetzt und gegebenenfalls erweitert werden können.
 

zurück zum Inhaltsverzeichnis



 

5. Vorhandene Implementierungen

Von Oracle gibt es für Embedded SQL und Server Side Includes eine frei zugängliche Implementierung. Allerdings liegen von den Javaklassen nur die Class-Dateien vor. Außerdem ist für den Oracle Web Application Server 3.0 eine sogenannte VRML-Cartridge erhältlich, die benötigt wird, um den Server Side Include Mechanismus nutzen zu können.
Eine Implementierung einer Klassenbibliothek liegt leider nur in Papierform vor.
Die Bezugsadressen sind im Anhang B zu finden.



 

Anhang A  Tabelle der Fehlercodes

 
Code Fehlernachricht
1 A parse error occurred
2 Error parsing INTO clause
3 Error parsing AT clause
4 Error parsing NEXT command
5 Error parsing substituting parameters
6 A database connection is not available
7 An eventIn has not been received for parameter
8 There is no field named parameter
9 There is no eventOut named parameter
10 Field parameter is not a supported type
11 EventOut parameter is not a supported type
12 No SQL field defined
13 No INTO clause was specified
14 A SELECT statement has not been executed
15 Unable to convert value
16 Variable is not a supported variable for the SET command
17 Variable must be set to TRUE or FALSE
18 Variable is an unsupported value for TRANSACTION
19 Out of memory error

zurück zum Inhaltsverzeichnis

 

Anhang B  Links und Quellen

VRML-Homepage

VRML-Recommended Practices for SQL Database Access

Oracle Implementierungen:

Server Side Includes

Embedded SQL

VRML Cartridge
 

Beispielanwendung mit ServerRedirect

Entwurf und Implementierung einer VRML-Bibliothek:
Risse, Thomas: Entwurf und Implementierung einer VRML-Bibliothek für ein objektrelationales Datenbanksystem auf der Basis des VRML-2.0-Standards, GMD-Forschungszentrum Informationstechnik GmbH 1997, ISBN: 3-88457-324-1

Kontakt zum Autor
 

zurück zum Inhaltsverzeichnis