% ------------------------------------------------------------------ %
%                                                                    %
% Datei:        zugriff1.tex                                         %
% Autor:        Oliver Nietsch                                       %
%                                                                    %
% Universitaet Hamburg                                               %
% Fachbereich Informatik                                             %
% Arbeitsbereich DBIS                                                %
%                                                                    %
% Thema: Studienarbeit: "Gateway zwischen dem StP-Repository         %
%                        und Tycoon"                                 %
%                                                                    %
% Inhalt: LaTeX-Dokument: Studienarbeit,                             %
%                         Kapitel 4: Zugriffsmoeglichkeiten auf      %
%                                    StP Repositoryobjekte, Teil1    %
%                                                                    %
% Version vom  19. 3.1996                                            %
% ------------------------------------------------------------------ %

\chapter{Zugriffsm"oglichkeiten auf StP Repositoryobjekte}
\label{Chap:Zugriff}

Das {\sf StP Object Management System} stellt dem Anwender neben dem {\sf StP Repository Browser} die werkzeugunabh"angigen Zugriffsm"oglichkeiten der {\sf StP Query and Reporting Language (QRL)} und des {\sf StP Application Program Interface (API)} zur Verf"ugung, um direkt auf Repositoryobjekte zugreifen zu k"onnen.

Im Rahmen der {\sf StP QRL} m"ussen vom Anwender {\sf QRL} Skripte erstellt werden, in welchen der Repositoryzugriff mit Hilfe der {\sf OMS Query Language} realisiert wird. Dahingegen werden die {\sf StP API} Funktionen in C-Programme integriert und zur Laufzeit des C-Programms ausgef"uhrt.

\section{StP Query and Reporting Language Skripte}
\label{Sec:QRLScrip}

{\sf StP QRL} Skripte sind als integraler Bestandteil des {\sf StP Query and Reporting Systems (QRS)} zu betrachten, welches dem Anwender erm"oglicht, werkzeugunabh"angig unter Verwendung von {\sf QRL} Skripten auf Repositoryobjekte zuzugreifen. Dabei werden mit Hilfe des {\sf StP Query and Reporting Processors (qrp)} die in einem {\sf QRL} Skript enthaltenen {\sf QRL} Befehle im Rahmen der Skriptinterpretation in {\sf OMS} Anfragen umgesetzt, um so den eigentlichen Zugriff auf die Repositoryobjekte "uber die Schnittstelle des {\sf StP Object Management Systems} zu erzielen. Eine Darstellung des {\sf QRS} ist in der Abbildung~\ref{Fig:QRSystem} wiedergegeben \cite{StPqrs94}.\\

{\bf {\sf Aufgaben des StP Query and Reporting Systems}}

Die Hauptaufgabe des {\sf StP Query and Reporting Systems} besteht darin, einen Mechanismus f"ur das Erstellen und das Ausf"uhren von {\sf QRL} Skripten und das Ausgeben ihrer Resultate bereitzustellen. Konkret leistet das {\sf QRS} die Skriptinterpretation, die Realisierung des Zugriffs auf Repositoryobjekte und die Ausgabe der Anfrageergebnisse in formatierter oder unformatierter Form.

\newpage

{\bf {\sf Komponenten des StP Query and Reporting Systems}}

Zu den wichtigsten Bestandteilen des {\sf Query and Reporting Systems} geh"oren unter anderem der {\sf StP Script Manager}, die {\sf StP Query and Reporting Language (QRL)} und der {\sf StP Query and Reporting Processor (qrp)}.

Der {\sf Script Manager} bildet die grafische Benutzeroberfl"ache f"ur die Handhabung des {\sf QRS}. Im Rahmen dieser Arbeit wird aber nicht weiter auf den {\sf Script Manager} eingegangen, da er im Hinblick auf die sp"atere Realisierung der {\sf StP} Bibliothek auf der Tycoon-Ebene nicht von Bedeutung sein wird. Alle Funktionen des {\sf Script Managers} k"onnen auch "uber die Kommandooberfl"ache initialisiert und durchgef"uhrt werden. N"ahere Informationen "uber f"ur diese Arbeit relevante Teilaspekte der {\sf QRL} sind im Abschnitt~\ref{SubSec:QRL} dargestellt. Hinweise zur Interpretation von {\sf QRL} Skripten und {\sf qrp} Optionen folgen ebenfalls im n"achsten Abschnitt.\\

\begin{figure}[hbt]
  \begin{center}
  \ 
  \epsfig{file=qrs.eps,width=12cm}
  \end{center}
\caption{\label{Fig:QRSystem} {\sf StP Query and Reporting System (QRS)}}
\end{figure}

\subsection{StP Query and Reporting Language (QRL)}
\label{SubSec:QRL}

Die Firma {\sf IDE} betrachtet ihre {\sf Query and Reporting Language} als eine \engl{"{}high-level, structured, C-like script language that includes familiar programming features such as types, parameterized function calls, and control constructs"{}} \cite{StPqrs94}.

Diese Arbeit befa"st sich nicht mit einer detaillierten Erl"auterung der Skriptsprache, sondern ihre Intention liegt darin, einzelne Aspekte soweit zu erkl"aren, wie sie zum weiteren Verst"andnis des im Abschnitt~\ref{SubSec:Select} aufgef"uhrten {\sf QRL} Skripts erforderlich sind.\\

{\bf {\sf Aufgabe der StP Query and Reporting Language}}

Mit Hilfe der {\sf StP Query and Reporting Language} k"onnen "`vollwertige"' Anwendungen erstellt werden. Die Betrachtung der M"achtigkeit der {\sf QRL} bezieht sich hier in erster Linie auf Sprachkonstrukte f"ur die Realisierung des Repositoryzugriffs. Die Skriptsprache enth"alt f"ur die Entwicklung von {\sf StP QRL} Applikationen \cite{StPqrs94}:

\begin{itemize}
  \item Variablen, Datentypen (primitive Typen, PDM-Typen, abstrakte Typen einschlie"slich Enumerations-, Listen- und Mengentypen)
  \item Operatoren (arithmetische, vergleichende, logische und Operatoren f"ur Typkonvertierungen)
  \item Kontrollflu"s (Schleifen und Verzweigungen)
  \item Funktionen (Typkonvertierung, \engl{Browsing, String Manipulation}, System Ein- und Ausgaben, Enumerations-, Listen- und Mengenoperationen und {\sf OMS} Schnittstellenoperationen) 
\end{itemize}

Um den in der Abbildung~\ref{Fig:Import} dargestellten Zugriff auf Repositoryobjekte zu konkretisieren, werden im folgenden die {\sf OMS} Schnittstellenfunktionen haupts"achlich betrachtet. In diesem Zusammenhang spielen die PDM-Typen, siehe Abschnitt~\ref{SubSec:PDM}, eine gewichtige Rolle.\\

\begin{figure}[hbt]
  \begin{center}
  \ 
  \epsfig{file=import.eps,width=14cm}
  \end{center}
\caption{\label{Fig:Import} {\sf StP Repository} Zugriff}
\end{figure}

\newpage

{\bf {\sf StP QRL Skripte}}

Das Erstellen von {\sf StP QRL} Skripten ist auf zwei Arten zu realisieren: Entweder benutzt man den {\sf Script Manager} oder einen konventionellen Texteditor zum Anlegen oder Editieren von Skriptdateien. Das Ausf"uhren der angelegten Dateien wird im Rahmen der Interpretation von {\sf StP QRL} Skripten behandelt. Prinzipiell m"ussen die folgenden Komponenten innerhalb eines {\sf QRL} Skripts enthalten sein: 

\begin{quote}
  \begin{verbatim}
void
main ()
{
   print_line("Ausfuehrungsteil des Skripts");
}
  \end{verbatim}
\end{quote}

\begin{itemize}
  \item Obligatorisch mu"s jedes {\sf QRL} Skript eine {\tt main}-Funktion enthalten, welche anzeigt, an welcher Stelle der Ausf"uhrungsteil des Skripts beginnt.
  \item Ebenfalls obligatorisch ist der R"uckgabetyp der {\tt main}-Funktion, in diesem Fall {\tt void}.
  \item Von geschweiften Klammern eingeschlossen folgt dann der eigentliche Ausf"uhrungsteil des Skripts, jeder einzelne {\sf QRL} Befehl wird durch ein Semikolon abgeschlossen.
  \item Verschachtelungen innerhalb der {\sf QRL} Befehle sind auf der Basis der {\sf StP QRL} Syntax m"oglich.
\end{itemize}

Auf der Kommandooberfl"ache wird ein {\sf QRL} Skript mit dem folgenden Befehl ausgef"uhrt bzw. zur Interpretation aufgerufen:

\begin{quote}
  \begin{verbatim}
qrp script_name [-o output_file] [-x ext_var_name ext_var_value]
                [-f formats_file] [-t target] [-I include_dir]
  \end{verbatim}
\end{quote}

In der Tabelle~\ref{Tab:qrp} sind alle m"oglichen {\sf qrp} Optionen wiedergegeben \cite{StPqrs94}.\\

\begin{table}[hbt]
\begin{center}
\begin{tabular}{|l|c|l|}
\hline
{\bf Option} & {\bf Argument} & {\bf Beschreibung}\\
\hline\hline
	 & {\tt $<$script\_name$>$} & auszuf"uhrendes Skript\\
\hline
{\tt -o} & {\tt $<$output\_file$>$} & Datei, in welche die Ausgabe erfolgen soll,\\
	 &                          & (stdout) ist \engl{default}.\\  
\hline
{\tt -x} & {\tt $<$ext\_var\_name$>$}  & Spezifiziert einen im Skript verwendeten\\
	 & {\tt $<$ext\_var\_value$>$} & externen Variablennamen und -wert.\\
\hline
{\tt -f} & {\tt $<$formats\_file$>$} & Spezifiziert die Datei, die die Information\\
	 &                           & zur Formatierung der Ausgabe enth"alt.\\
\hline
{\tt -t} & {\tt ascii$|$mif$|$leaf} & Spezifiziert das Format der Ausgabe,\\
	 &                          & ASCII (ascii) ist \engl{default},\\
	 &                          & FrameMaker (mif) oder Interleaf (leaf).\\
\hline
{\tt -I} & {\tt $<$include\_dir$>$}    & Spezifiziert andere als in {\tt ToolInfo}-Datei\\
	 &                             & angegebene \engl{Include}-Pfade.\\
\hline
\end{tabular}
\end{center}
\caption{{\sf qrp} Optionen}
\label{Tab:qrp}
\end{table}

{\bf {\sf StP PDM-Typen}}

Die Grundlage f"ur das Ablegen von Objekten im {\sf StP Repository} bildet das im Abschnitt~\ref{SubSec:PDM} dargestellte \engl{Persistent Data Model} (PDM). Die folgenden PDM-Typen werden von der {\sf StP Query and Reporting Language} zur Verf"ugung gestellt \cite{StPoms94}: {\tt cntx}, {\tt cntx\_ref}, {\tt file}, {\tt file\_hist}, {\tt file\_lock}, {\tt item}, {\tt link}, {\tt link\_ref}, {\tt node}, {\tt node\_ref}, {\tt note}, {\tt viewpoint}.

Alle Zugriffsoperationen auf Objekte innerhalb des Repositorys basieren auf diesen abstrakten Datentypen. Der Zugriff selbst erfolgt mit Hilfe der {\sf OMS} Schnittstellenfunktionen. Eine Interpretation der hier genannten Typen erfolgt an dieser Stelle nicht, da diese keine Voraussetzung f"ur die Umsetzung des eigentlichen Repositoryzugriffs darstellt.\\

{\bf {\sf StP OMS Schnittstellenfunktionen}}

Die {\sf StP Query and Reporting Language} stellt eine Reihe von Funktionen zur Verf"ugung, die eine Schnittstelle zwischen dem Anwender und dem {\sf StP Object Management System} definieren und somit, innerhalb eines {\sf QRL} Skripts aufgerufen, Information "uber Repositoryobjekte zur"uckgeben. Eine Auswahl der entsprechenden Funktionen ist in der Tabelle~\ref{Tab:oms} aufgef"uhrt \cite{StPqrs94}.

\begin{table}[hbt]
\begin{center}
\begin{tabular}{|l|c|l|}
\hline
{\bf Funktion} & {\bf R"uckgabetyp} & {\bf Beschreibung}\\
\hline\hline
{\tt for\_each\_in\_select(string}  & {\tt $<$PDM} & Zugriff auf Repository-\\
{\tt oms\_query,$<$PDM Typ$>$}      & {\tt Typ$>$} & objekte\\
{\tt query\_obj)}                   &              & \\
\hline
{\tt find\_by\_query(string}        & {\tt $<$PDM} & R"uckgabe des ersten,\\
{\tt oms\_query)}                   & {\tt Typ$>$} & gefundenen Objekts\\
				    &              & der Anfrage\\
\hline
{\tt selection\_count}              & {\tt int}    & R"uckgabe der Anzahl\\
{\tt (string oms\_query)}           &              & gefundener Anfrageobjekte\\
\hline
{\tt id\_list\_create(string oms\_query,} & {\tt void} & Erstellen einer ID-Liste\\
{\tt string id\_list\_name)}              &            & der ausgew"ahlten Objekte\\
\hline
{\tt id\_list\_free(string} & {\tt void} & L"oschen der\\
{\tt id\_list\_name)}       &            & angegebenen ID-Liste\\
\hline
{\tt list\_select(string} & {\tt list} & F"uhrt {\sf OMS} Anfrage aus\\
{\tt oms\_query)}         &            & und gibt Liste mit\\
 & & dem Resultat zur"uck.\\
\hline
\end{tabular}
\end{center}
\caption{{\sf OMS} Schnittstellenfunktionen}
\label{Tab:oms}
\end{table}

\subsection{Das StP QRL Skript Select.qrl}
\label{SubSec:Select}

Um den Zugriff auf Repositoryobjekte mit Hilfe eines {\sf StP QRL} Skripts exemplarisch darzustellen, wurde das im Anhang~\ref{Ann:Skript} wiedergegebene Skript {\tt Select.qrl} entwickelt. Dabei wird auf komplizierte Schleifen und Verzweigungen innerhalb des Ablaufs zugunsten der "Ubersichtlichkeit verzichtet. Die im vorigen Abschnitt aufgef"uhrten {\sf OMS} Schnittstellenfunktionen stehen im Vordergrund der Betrachtung und werden exemplarisch ausgef"uhrt.\\

{\bf {\sf Skriptinhalt}}

Das {\sf QRL} Skript {\tt Select.qrl} wurde mit einem konventionellen Texteditor erstellt und ohne {\sf qrp} Optionen interpretiert. Eine spezielle Formatierung der Skriptausgabe erfolgte nicht (\engl{Default}: ascii), allerdings wurde das Skriptresultat nachtr"aglich in die Datei {\tt Select\_Output.txt} "ubernommen und zwecks besserer "Ubersichtlichkeit aufbereitet (siehe Anhang~\ref{Ann:Skriptausgabe}). Auf der Kommandooberfl"ache erfolgte der Aufruf zur Skriptinterpretation in der folgenden Weise:

\begin{quote}
{\bf {\tt qrp Select.qrl}}
\end{quote}

In diesem Abschnitt sind nur einige Ausschnitte des gesamten {\sf QRL} Skripts aufgef"uhrt. Die obligatorischen Skriptelemente sind zwecks besserer "Ubersichtlichkeit vernachl"assigt worden.\\

{\sf Variablendeklaration und -initialisierung:}

\begin{quote}
{\tt cntx\_ref cntx\_ref\_var;}\\
{\tt cntx cntx\_var;}\\
{\tt link link\_var;}\\
{\tt node node\_var;}\\
{\tt int zaehler;}\\ 
{\tt int id = 14209;}\\
{\tt string query = "{}node$[$type == OMTEvent \&\& annot\_file\_id == 0$]$"{};}
\end{quote}        

\newpage

{\sf QRL Befehle f"ur den Zugriff und die Ausgabe einiger im StP Repository abgelegter Werte:}

\begin{quote}
\underline{{\sf OMS} Anfrage Nr. 1:}\\
{\tt for\_each\_in\_select("{}cntx\_ref"{}, cntx\_ref\_var)}

{\tt print\_line("{}cntx\_ref\_id: $\setminus$"{}"{} + cntx\_ref\_var.id + "{}$\setminus$"{} cntx\_id: "{}}\\
{\tt + cntx\_ref\_var.cntx\_id);}

Diese {\sf OMS} Anfrage sucht nach {\tt cntx\_ref} Objekten im Repository. Anschlie"send werden die Werte der Attribute {\tt id} und {\tt cntx\_id} ausgegeben:

{\tt cntx\_ref\_id: "{}54602"{} cntx\_id: 54601}\\
{\tt cntx\_ref\_id: "{}54604"{} cntx\_id: 54603}\\
\\
\underline{{\sf OMS} Anfrage Nr. 2:}\\
{\tt for\_each\_in\_select("{}link$[$id >= 54400$]$"{}, link\_var)}

{\tt print\_line("{}link\_id: $\setminus$"{}"{} + link\_var.id}\\
{\tt + "{}$\setminus$"{} from\_node\_id: "{} + link\_var.from\_node\_id}\\
{\tt + "{}$\setminus$"{} to\_node\_id: "{} + link\_var.to\_node\_id);}

Diese {\sf OMS} Anfrage sucht nach {\tt link} Objekten im Repository, deren Attribut {\tt id} die angegebene Bedingung erf"ullt. Anschlie"send werden die Werte der Attribute {\tt id}, {\tt from\_node\_id} und {\tt to\_node\_id} ausgegeben:

{\tt link\_id: "{}54403"{} from\_node\_id: 402"{} to\_node\_id: 301}\\
{\tt link\_id: "{}59202"{} from\_node\_id: 4001"{} to\_node\_id: 401}\\
{\tt link\_id: "{}59203"{} from\_node\_id: 401"{} to\_node\_id: 4001}\\
\\
\underline{{\sf OMS} Anfrage Nr. 3:}\\
{\tt print(find\_by\_query("{}node$[$id == "{}+id+"{}$]$"{}));}

Diese {\sf OMS} Anfrage sucht nach {\tt node} Objekten im Repository, deren Attribut {\tt id} die angegebene Bedingung erf"ullt. Anschlie"send werden alle Attribute und deren Werte ausgegeben:

{\tt \{}\\
{\tt id = 14209}\\
{\tt name = send message request}\\
{\tt type = OMTEvent}\\
{\tt scope\_node\_id = 0}\\
{\tt sig =}\\
{\tt annot\_file\_id = 0}\\
{\tt \}}\\
\\
\underline{{\sf OMS} Anfrage Nr. 4:}\\
{\tt zaehler = selection\_count(query);}

{\tt print("{}Anzahl gefundener Objekte, die vom Typ OMTEvent sind"{}}\\
{\tt + "{} und den Wert 0 als annot\_file\_id besitzen: "{} + zaehler);}

Diese {\sf OMS} Anfrage sucht nach den in der Anfrage spezifizierten Repositoryobjekten. Anschlie"send wird deren Anzahl ausgegeben:

{\tt Anzahl gefundener Objekte, die vom Typ OMTEvent sind und}\\
{\tt den Wert 0 als annot\_file\_id besitzen: 41}
\end{quote}

Der Zugriff auf die Attributwerte der PDM-Typen erfolgt nach der Zuweisung an die entsprechende Variable mit Hilfe der Punktnotation. Alle PDM-Typen einschlie"slich ihrer Attribute und Relationen sind in \cite{StPoms94} dargestellt.

Die vollst"andige Ausgabe des gesamten Skripts {\tt Select.qrl} befindet sich in der Datei {\tt Select\_Output.txt} im Anhang~\ref{Ann:Skriptausgabe}.

\section{C-Programme auf der Basis des StP Application Program Interface (API)}
\label{Sec:CProgAPI}

Neben der Einbettung von {\sf OMS} Anfragen in {\sf Query and Reporting Language} Skripte ist es ebenfalls m"oglich, die Repository-Anfrageanweisungen in Funktionen des {\sf StP Application Program Interface} in der Form von an die {\sf API} Funktionen "ubergebenen Argumenten (als {\tt Strings}) zu integrieren.
\input{zugriff2}
