Die Programmbibliothek für Dokumentenmethoden, die für den Prototyp realisiert wurde, stellt fünf verschiedene Pakete (s. auch Kap. 4.7) zur Verfügung. Es handelt sich dabei um Pakete
Eine komplette Aufstellung der Inhalte der Pakete findet sich in Anhang C. Auf das Paket Netz wird an dieser Stelle nicht näher eingegangen, da das Paket nicht zwingend notwendig zum Betrieb des Speichersystems ist.
Das Einbinden der Pakete in Python erfolgt mittels einer import-Anweisung folgender Art:
from p_<paketname> import [*|c_<klasse1>,c_<klasse2>,...] |
Dabei beginnen alle Paketnamen mit p_ und alle Klassennamen mit c_.
Die Pakete p_bitstream, p_sgml, p_system und p_maintenance werden im folgenden genauer erläutert, sofern dies nicht bereits in Kapitel 4.7 geschehen ist. Diese Pakete stellen die Funktionalitäten bereit, die zur Speicherung und den Zugriff auf die Dokumente notwendig sind. Die vollständige Klassenhierarchie der Pakete ist in Anhang B gegeben.
Bei der Implementierung der Pakete ist zu beachten, daß bei Zugriffen auf die Datenbank oder die Bitstromschnittstelle, so wenige Datensätze bzw. Dateien wie möglich zur Bearbeitung gesperrt werden. Ist das nicht der Fall, so kann es unter Umständen zu langen Wartezeiten bei der Ausführung von Methoden kommen, weil die Daten durch einen anderen Speicher bzw. durch die Ausführung einer anderen Dokumentenmethode gesperrt sind.
Die Klasse c_store wird von der Basisklasse c_bsio abgeleitet und bietet Methoden, um ein Dokument als Bitstrom im Speichersystem abzulegen. Diese Klasse besitzt jeweils zwei open- und zwei close-Methoden. Davon wird ein Paar benutzt, um auf die zuvor von der Ablaufumgebung erstellten temporären Kopie des Dokuments zuzugreifen, das zweite Paar öffnet und schließt den neuen Bitstrom im Speichersystem. Zu bemerken ist, daß sowohl die Zuordnung des neuen Bitstroms zum Dokument, als auch die Bereitstellung des Dokumenteninhalts als temporäre Datei transparent erfolgen und vom Entwickler der Dokumentenmethode nicht berücksichtigt werden muß.
Hinzu kommen, eine Methode um von der temporären Kopie des Dokuments zu lesen, eine Methode um Daten in den Bitstromspeicher zu schreiben und eine Methode (register_store), um den Vorgang der Bitstromspeicherung in den im Speichersystem aufbewahrten Metainformationen des Dokuments zu registrieren. Weiterhin stehen Methoden zur Positionierung der Lese-/Schreibmarke beider Bitströme zur Verfügung Abbildung 5.11 zeigt die Definition der Klasse.
Die Klasse c_glimp_search realisiert eine Schnittstelle zur Volltextsuche. Das Basisprodukt Glimpse wird über die Shell-Schnittstelle aufgerufen, dazu wird ein Kommandozeileninterpreter (shell) gestartet, dem ein entsprechender Programmaufruf übergeben wird.
Bei der Instanziierung eines Objekts der Klasse c_glimp_search ist es möglich Parameter für die Glimpse-Aufrufe dieses Objekts festzulegen. Damit steht die gesamte Funktionalität von Glimpse zur Verfügung.
Abbildung 5.12 zeigt den Quellcode der Methode der c_glimpse_search-Klasse, die den Aufruf von Glimpse realisiert.
Die Methode glimp_search realisiert eine Suche nach mehreren und/oder- verknüpften Zeichenketten. Da Glimpse in der vorliegenden Version lediglich nach oder-verknüpften Zeichenketten suchen kann, übernimmt die Methode die und-Verknüpfung der einzelnen Terme. Zu beachten ist, daß der Suchstring in konjunktiver Normalform angegeben werden muß. Dabei wird eine Konjunktion durch ein & und eine Disjunktion durch ein ; angegeben. Beispielsweise wird durch Angabe von „verteilte&systeme;bibliotheken“ nach allen Dokumenten gesucht, die das Wort „verteilte“ und entweder das Wort „system“ oder „bibliotheken“ enthalten. Diese Klasse soll als Beispiel dafür angeführt werden, daß man mit geringem Aufwand andere Basisprodukte zur Benutzung aus den Dokumentenmethoden einbinden kann.
Die vierte Klasse des Pakets (c_search) stellt Methoden zur Suche in einem bekannten Dokument bereit. Unter Angabe der Dokumenten-ID kann man mit dieser Klasse gezielt nach Begriffen innerhalb des benannten Dokuments suchen. Die Funktionalität und Benutzung der Methoden ist analog zu denen der Klasse c_glimp_search definiert.
Die benötigten Methoden zum Speichern von SGML-Dokumenten wurden, ebenso wie die Vorgehensweise beim Zugriff auf SGML-Dokumente bereits in Kapitel 4.7 detailiert beschrieben.
Die Basisklasse c_sgmlread und die abgeleitete Klasse c_sgmlstore stellen die dort definierten Methoden zu Speicherung von SGML-Dokumenten bereit.
Zum Zugriff auf die in der Datenbank gespeicherten SGML-Dokumente wurden die Klassen c_sgmlquery und c_sgmlsearch implementiert.
Die Instanziierung eines Objekts der Klasse c_sgmlquery erfolgt unter Angabe einer Dokumenten-ID. Diese Klasse dient dem Zugriff auf ein bestimmtes Dokument. Es werden hier Methoden bereitgestellt, um auf das ganze Dokument oder nur auf den Strukturbaum (sgmlquery_structure) zuzugreifen.
Zur Abfrage bestimmter Strukturmerkmale werden die Methoden sgmlquery_tagcontents, zur Abfrage des Inhalts eines Tags und sgmlquery_tag, zur Abfrage des Tags bereitgestellt. Beide Methoden erwarten als Parameter den Namen eines Tags und eine Zahl, die angibt das wievielte Tag dieser Art aus dem Dokument abgefragt werden soll. Die Anzahl der Vorkommen eines bestimmten Tags im Dokument kann mittels der Methode sgmlquery_tagcount festgestellt werden. Weiterhin steht zur Vearbeitung von abgefragten Tags eine Methode zur Vefügung, um ein Tag in seinen Namen und seine Attribute aufzuteilen (sgmlquery_splittag).
Die Klasse c_sgmlsearch realisiert sechs Methoden zum Durchsuchen der Datenbank nach Begriffen bzw. Zeichenketten. Die Methode sgmlsearch_tag durchsucht die vollständige Tagklasse, die Methode sgmlsearch_text die gesamte Textklasse und die Methode sgmlsearch_doc beide Klassen nach einer gegebenen Zeichenfolge.
Zusätzlich wurde eine virtuelle Methode (sgmlsearch_bin) definiert, die zum Durchsuchen von Binärdaten in der Datenbank vorgesehen ist. Diese Methode muß von der Dokumentenmethode in einer abgeleiteten Klasse überschrieben werden.
Um auch in Abhängigkeit einer bestimmten DTD, Dokumente auffinden zu können, wurden die Methoden sgmlsearch_dtddocs und sgmlsearch_dtdandtag realisiert. Die Methode sgmlsearch_dtddocs verlangt als Parameter die Public- oder System-ID einer DTD. Als Ergebnis wird eine Liste der Dokumenten-ID aller Dokumente, die dieser DTD entsprechen zurückgegeben. Die Methode sgmlsearch_dtdandtag verlangt zusätzlich einen Parameter, der ein Tag angibt. Sie ermittelt, die Dokumenten-ID‘s aller Dokumente, die der übergebenen DTD entsprechen und solche Tags beinhalten.
Das Paket beinhaltet drei Klassen. Eine Klasse dient dazu, als Bitstrom vorliegende Metadokumente auszulesen (c_metadoc), eine Klasse, um die Metainformationen eines Dokuments aus der Datenbank auszulesen (c_metaquery) und eine Klasse, um alle in der Datenbank vorliegenden Metainformationen zu durchsuchen (c_metasearch).
Wird dem Speicher zusammen mit einem PUT-Kommando ein Metadokument übermittelt, werden die unter Kapitel 2.4.2 beschriebenen Informationen (Autor, Eigentümer, Titel, u.s.w.) in der Datenbank gespeichert. Zu diesem Zweck stellt die Klasse c_metadoc Methoden zum Auslesen des Autors, des Eigentümers, des Titels und der DTD bereit.
Analog dazu stellt die Klasse c_metaquery Funktionalitäten bereit, um diese Informationen unter Angabe einer Dokumenten-ID aus der Datenbank abzufragen. Die Klassendefinition beider Klassen ist in Abbildung 5.13 angegeben.
Das „Zugriffs-Dokument“ benutzt die Klasse c_metasearch zum Durchsuchen aller in der Datenbank gespeicherten Metainformationen. Alle Methoden dieser Klasse durchsuchen die Datenbank nach einer übergebenen Zeichenkette, ohne Unterscheidung von Groß- und Kleinschreibung (case-insensitive). Dabei wird der SQL-LIKE-Operator verwendet. Auf diese Weise werden auch ähnliche Zeichenketten erkannt. Die Klasse sieht Methoden zum Auffinden von Dokumenten-ID, Autor, Eigentümer und Titel vor.
Die Klasse c_glimp_index ermöglicht das Löschen und Erzeugen von Indizes mittels glimpse. Dazu wurden die Methoden build_index und remove_index implementiert.
Zur Reorganisation der Indizes ist es ausreichend die Methode build_index aufzurufen. Zu bemerken ist, daß die Reorganisation auch während des Betriebs des Speichersystems durchgeführt werden kann. Das System muß dazu nicht angehalten werden.
In der Klasse c_maintenance finden sich Methoden zur Reorganisation der Datenbank und zum Löschen eines Dokuments. Eine SQL-Schnittstelle zur Datenbank ist ebenfalls vorgesehen, diese kann benutzt werden, um beispielsweise statistische Daten (Anzahl der gespeicherten Dokumente, usw.) abzufragen oder andere administrative Vorgänge durchzuführen. Diese Methode liefert eine Ergebnistabelle im ASCII-Format zurück.