P8000/WEGA/contrib/ingres/dbs/ing_src/teil2/amx

1087 lines
32 KiB
Plaintext

.ds RH \f3AMX\f1
.ds CH - % -
.ds LH Anwendung
.ds RF \f3UNIX\f1
.bp
.NH 2
.ft B
AMX **
.ft R
.LP
.sp 10
.NH 3
.ft B
Einleitung
.ft R
.LP
AMX (Access Method - an eXtended interface) ist ein
Werkzeug, das direkt auf die \*(yy\ Zugriffsmethoden
abbildet. Es ist leicht erlernbar, einfach anzuwenden und
erzeugt laufzeiteffektive Programme. Gegen\o'u"'ber dem
Datenbanksystem \*(yy\ bzw. der EQUEL Komponente sind AMX-Programme
bedeutend schneller. Mit AMX k\o'o"'nnen
sowohl rekursive Zugriffe zu Daten programmiert, als auch
Recherchen mit \o'A"'nderungen frei gemischt und
Abfragen implementiert werden, die die M\o'a"'chtigkeit
der relationalen Abfragesprachen \o'u"'bersteigen (Baum-,
St\o'u"'cklistenverarbeitung usw.).
.LP
AMX baut auf dem \*(yy\ System auf. Es ist m\o'o"'glich mit
\*(yy\ erstellte Daten mit AMX weiterzuverarbeiten und
umgekehrt. Dieser komplexe Ansatz gestattet zwischen AMX,
EQUEL und dem Datenbanksystem \*(yy\ frei zu wechseln.
.NH 3
.ft B
Entwurf
.ft R
.LP
AMX ist eine Datenbanksprache, die in eine h\o'o"'here
Programmier\%sprache eingebettet ist. Als Einbettungsstrategie
bietet sich einer der vier klassischen Ans\o'a"'tze an:
.IP (1)
prozedurale Einbettung in die h\o'o"'here
Program\%miersprache \o'u"'ber eine call-Schnittstelle:
.DS C
call database("database_action as string");
.DE
Die Datenbankaktion wird zur Laufzeit interpretiert,
eine Modifikation des \o'U"'bersetzers der h\o'o"'heren
Programmiersprache entf\o'a"'llt. Ein besonderes Problem
ist die Verwendung gemeinsamer Variablen und die
Pr\o'u"'fung der Zul\o'a"'ssigkeit der Datenbankaktionen.
z.B: SYSTEM-R, ADABAS, IMS
.IP (2)
einfache Erweiterungen der h\o'o"'heren
Programmiersprache um Elemente der Datenbanksprache
.IP
Eine Modifikation des \o'U"'bersetzers der h\o'o"'heren Pro-
grammiersprache ist notwendig, auch wenn der Aufwand
durch Angleichung der Syntax der Datenbanksprache an
die der h\o'o"'heren Programmiersprache minimiert werden
kann. Die Zul\o'a"'ssigkeit der Datenbankaktionen kann
bei diesem Ansatz zur \o'U"'bersetzungszeit \o'u"'berpr\o'u"'ft
werden.
.br
z.B: COBOL-DML des DBTG Netzwerkdatenmodells
.IP (3)
syntaktische Erweiterung der h\o'o"'heren
Programmiersprache um Elemente der Datenbanksprache ohne
Modifikation des \o'U"'bersetzers der h\o'o"'heren
Programmiersprache
.IP
Die Datenbankaktionen werden in dem
Anwendungsprogramm durch ein besonderes Pr\o'a"'fixsymbol
gekennzeichnet, die durch einen zu konstruierenden
Vor\o'u"'bersetzer (Preprozessor) syntaktisch und
semantisch \o'u"'berpr\o'u"'ft und in Prozeduraufrufe der
h\o'o"'heren Programmiersprache \o'u"'bersetzt werden.
Nachteilig erscheint die Verwendung zweier Semantiken
durch den Benutzer.
.br
z.B: EQUEL/INGRES
.IP (4)
Datenbankprogrammiersprache: Erweiterung einer
h\o'o"'heren Programmiersprache um das Datenmodell einer
Datenbanksprache
.IP
Dieser Ansatz erfordert eine grunds\o'a"'tzliche
Modifikation bzw. Neukonstruktion des \o'U"'bersetzers der
h\o'o"'heren Programmiersprache.
.br
z.B: MODULA-R
.LP
F\o'u"'r AMX wurde der 3. Ansatz gew\o'a"'hlt. Er garantiert mit
einem geringen Implementierungsaufwand die Realisierung
aller Forderungen, die an eine Einbettung zu stellen sind.
Der Preprozessor ist in YACC und C implementiert und damit
\*(xx\ portabel. Die Verwendung von YACC als Werkzeug zur
Compilergenerierung bringt einige Probleme in der Meldung
von erkannten Fehlern mit sich. Nach Erkennung eines
Fehlers wird die \o'U"'bersetzung erst nach drei als richtig
erkannten syntaktischen Einheiten (Token, Morpheme)
fortgesetzt, so dass eine zweite \o'U"'bersetzung Fehler erzeugen
kann, die in der ersten nicht erzeugt wurden. Die zu jedem
Fehler mit ausgegebene Zeilennummer ist nicht immer exakt.
Sie kann sich auf eine der vorherigen Zeilen beziehen, wenn
der Fehler am Zeilenende erkannt wurde. YACC liest immer
eine syntaktische Einheit voraus, wird ein Fehler
festgestellt, ist in dem oben genannten Fall der Zeilenz\o'a"'hler
aber schon um eins (oder mehr, bei Zeilen ohne syntaktische
Einheiten) hochgez\o'a"'hlt. Bei syntaktischen Fehlern, die
YACC selbst generiert, ist eine Angabe der Fehlerursache
\o'a"'usserst schwierig. Aufgrund der einfachen Syntax von AMX
wurde auf eine detaillierte Fehlererkennung verzichtet und
der Anwender muss den erzeugten Fehler
.DS C
"syntax error"
.DE
selbst deuten.
.LP
Ein Datenbanksystem l\o'a"'sst sich in zwei grosse Komplexe
gliedern, den logischen Datenbankprozessor
.ft B
(LDBP)
.ft R
und den
physischen Datenbankprozessor
.ft B
(PDBP).
.ft R
Der LDBP ist
zust\o'a"'ndig f\o'u"'r das \o'U"'bersetzen bzw.
Parsen
.ft B
(P)
.ft R
der Datenbank\%aktion
und deren Optimierung
.ft B
(O).
.ft R
Der PDBP erh\o'a"'lt eine Folge von
Auftr\o'a"'gen (query evaluation plan -
.ft B
QEP
.ft R
) zur Abarbeitung der
Datenbankaktion unter Einbeziehung der Daten der Datenbank.
Unter dem Gesichtspunkt dieser Klassifizierung l\o'a"'sst sich
die Einbettungsstrategie wie folgt verfeinern:
.DS I
+---------+----------+
| L D P B | |
+------+------+ PDBP |
| P | O | |
+------+------+------+
| | | |
a |####################|
| | | |
b |======|#############|
| | | |
c |=============|######|
| | | |
d |====================|
| | | |
+------+------+------+
LEGENDE
#: zur Laufzeit
=: zur \o'U"'bersetzungszeit
.DE
.IP a-
Die \o'U"'bersetzung, Optimierung und interpretative
Abarbeitung der Datenbankaktionen zur Laufzeit ist
die nat\o'u"'rliche Form der zum Datenbanksystem
geh\o'o"'rigen Abfragesprache. Sie ist geeignet f\o'u"'r
ad hoc-Abfragen.
.IP b-
Die \o'U"'bersetzung ohne Optimierung ist geeignet f\o'u"'r
st\o'a"'ndig wiederkehrende datenunabh\o'a"'ngige
Datenbankaktionen.
.IP c-
Die \o'U"'bersetzung mit Optimierung ist geeignet f\o'u"'r
st\o'a"'ndig wiederkehrende datenabh\o'a"'ngige
Datenbankaktionen, da der QEP fest determiniert ist.
.IP d-
Die Umgehung des PDBP erfordert vom \o'U"'bersetzer die
Konstruktion nicht nur des QEP sondern auch eines
speziellen PDBP f\o'u"'r die konkreten Datenbankaktionen
in Form eines ausf\o'u"'hrbaren Programms. Diese
Variante ist f\o'u"'r schnelle Anwendungen (Erfassung und
\o'A"'nderung) bzw. Massendatenverarbeitung geeignet.
.LP
F\o'u"'r AMX wurde die Variante d) gew\o'a"'hlt. Eine wesentliche
Erh\o'o"'hung der Abarbeitungsgeschwindigkeit f\o'u"'r
Datenbankaktionen in AMX gegen\o'u"'ber \*(yy\ ist eingetreten, die
gew\o'a"'hlte Variante hat jedoch auch entscheidende Nachteile.
Die erzeugten AMX Programme sind abh\o'a"'ngig von der Struktur
der Datenbank, alle verwendeten datenbankspezifischen Namen
(der Datenbank, der Relationen und der Dom\o'a"'nen) m\o'u"'ssen zur
\o'U"'bersetzungszeit bekannt also konstant sein.
Beispielsweise kann mit AMX kein allgemeines Druckprogramm
konstruiert bzw. neue Relationen erzeugt werden. Dass ein AMX
Programm keine Relationen erzeugen kann, ist aus Anwendersicht
eine schwer einsehbare Tatsache. Der AMX Compiler holt sich
alle Informationen zu den Relationen und Dom\o'a"'nen aus den
Systemkatalogen der Datenbank und entlastet somit den
Anwender von der Angabe dieser Details und den Fehlern, die an
dieser Stelle gemacht werden k\o'o"'nnen. Eventuell ben\o'o"'tigte
permanente oder tempor\o'a"'re Relationen m\o'u"'ssen vor der
\o'U"'bersetzung des AMX Programms mit dem \*(yy\ System erzeugt
werden (siehe CREATE(QUEL)). Durch diesen Ansatz ist eine
weitgehende Quelltextunabh\o'a"'ngigkeit von der Struktur der
Datenbank gesichert, eine \o'A"'nderung der Speicherstruktur
einer Relation erfordert keine \o'A"'nderung des AMX
Quellprogramms, wohl aber dessen neue \o'U"'bersetzung.
.LP
F\o'u"'r die vorliegende Version
von AMX gelten einige Einschr\o'a"'nkungen:
.IP -
Das Pufferschema der \*(yy\ Zugriffsmethoden
ordnet jeder Relation maximal einen Puffer zu. F\o'u"'r
die rekursive Verarbeitung einer Relation ist ein
solcher Ansatz ungeeignet, da jede neue Rekursion den
Puffer \o'u"'berschreibt und ein st\o'a"'ndiges Nachlesen des
alten Pufferinhaltes bei Verlassen der Rekursion
erforderlich ist. Die Zuordnung von maximal einem
Puffer zu einer Relation ist ein Entwurfsprinzip der
internen Ebene des Datenbankystems \*(yy\, eine
\o'A"'nderung des Pufferschemas ist nicht angebracht.
.IP -
Beschr\o'a"'nkung der Variablentypen f\o'u"'r den Austausch
von Daten zwischen der Datenbanksprache und der
h\o'o"'heren Programmiersprache.
.IP -
Die verwendeten Relationen d\o'u"'rfen keine Sichten
(views) sein und d\o'u"'rfen keine definierten
In\%te\%gri\%t\o'a"'ts\%be\%din\%gun\%gen bzw. anderweitig vergebene Zugriffsrechte
besitzen.
.IP -
Konvertierungen zwischen numerischen und
Zeichenkettenwerten (und umgekehrt) werden nicht unterst\o'u"'tzt.
.IP -
Numerische Konvertierungen erfolgen ohne Unter- bzw.
\o'U"'berlaufkontrolle.
.IP -
Vergleiche von Zeichenkettenwerten zwischen Dom\o'a"'nen
und Variablen werden in der L\o'a"'nge der Dom\o'a"'ne
ausgef\o'u"'hrt, z.B. liefert der Variablenwert "Automat"
den Wert "Auto" f\o'u"'r die Datenbankaktion, wenn die
zugeh\o'o"'rige Dom\o'a"'ne den \*(yy\ Typ "c4" hat.
.LP
AMX garantiert die Integrit\o'a"'t der Datenbank, d.h. die
Konsistenz der Systemkataloge und der Indizes. Bei der
Zugriffs\%pfadoptimierung werden die vorhandenen Indizes voll
herangezogen. \o'A"'nderungen sind nur in Nutzerrelationen
ge\%stattet, die Systemkataloge und Indizes werden durch AMX
aktualisiert.
.LP
Es ist geplant, einen SORT-Operator f\o'u"'r die
Datenbankaktionen bereitzustellen, um in Recherchen doppelte Tupel
auszuschliessen und eine Hilfe f\o'u"'r die Verbindung zweier
Relationen (join) zu geben.
.NH 3
.ft B
Umgebung
.ft R
.LP
AMX ist an die \*(xx\ Programmiersprache C gebunden, es
erzeugt aus dem Input ein g\o'u"'ltiges C-Programm, das mit dem
C-Compiler weiter verarbeitet werden muss. Es besteht aus
einem Compiler (Preprozessor) und einer Laufzeitbibliothek
"liba.a". \o'A"'hnlich EQUEL werden AMX Anweisungen durch die
Kennzeichnung von zwei Nummernzeichen "##" am Zeilenanfang
in das C-Programm eingebettet. Der AMX Compiler verarbeitet
nur solche gekennzeichneten Zeilen, aufgrund dieser
Arbeitsweise is es notwendig, die in AMX Anweisungen verwendeteten
C-Variablen mit dem Kennzeichen zu deklarieren. In der
vorliegenden Version werden C-Variable vom Typ:
.DS I
- short
- int
- long
- float
- double
- char *
- char []
.DE
unterst\o'u"'tzt. Jede Variable ist global zu deklarieren.
.LP
Im AMX Programm muss die Eintrittsfunktion "amx()"
benannt werden, da der AMX Compiler ein "main()" generiert,
um die notwendigen Datenbankinitialisierungen vornehmen zu
k\o'o"'nnen.
.LP
AMX generiert Code f\o'u"'r die Schnittstelle des internen
Datenbankschemas von \*(yy\, d.h. von Seiten des
C-Programms sind einige Konventionen dieser Schnittstelle
einzuhalten. Alle ausf\o'u"'hrbaren Programme m\o'u"'ssen vom \*(yy\
Superuser angeeignet (owner, group) und mit dem Mode "6xxx"
.DS I
- "4000" set user id on execution
- "2000" set group id on execution
.DE
versehen sein, um die Datenbankfiles lesen und schreiben zu
k\o'o"'nnen. Eine weitere Besonderheit ist das \o'A"'ndern des
aktuellen Verzeichnisses (current directory) in das
Verzeichnis der Datenbank zur Startzeit des AMX Programms. Zur
Laufzeit ist es nicht gestattet, das aktuelle Verzeichnis zu
\o'a"'ndern! Daher sollten alle programmspezifischen Files
absolut von der root aus angegeben werden (z.B: "/dir/file",
siehe auch COPY(QUEL)).
.LP
Die Verwendung der C-Bibliotheksfunktionen
.DS I
- setjmp()
- longjmp()
.DE
zur Realisierung nichtlokaler Spr\o'u"'nge (siehe \*(xx\ Manual
SETJMP(3)) sollte vermieden werden.
.LP
Der AMX Compiler hat noch kein eigenes
Relationssperrkonzept, er sperrt die Datenbank f\o'u"'r die parallele
Verwendung w\o'a"'hrend der gesamten Zeit deren Nutzung durch
das AMX Programm, d.h.:
.IP 1-
zur Startzeit darf die Datenbank nicht in Benutzung
sein und
.IP 2-
zur Laufzeit kann niemand die Datenbank verwenden.
.LP
Das exklusive Sperren der Datenbank erfolgt \o'u"'ber das
concurrency-control-Schema von \*(yy\.
.LP
Durch die Laufzeitbibliothek werden eine Reihe von Objekten
definiert, die alle mit "AA" beginnen. Durch den
Anwendungsprogrammierer ist zu gew\o'a"'hrleisten, dass diese Objekte
nicht \o'u"'berdefiniert werden. Er sollte Namen, die mit "AA"
beginnen, generell vermeiden. Da die interne Ebene des
Datenbanksystems \*(yy\ in das AMX Programm gelinkt
wird, sind weitere Objekte mit einer festen Bedeutung
definiert, die im AMX Programm nicht verwendet werden
d\o'u"'rfen. Eine vollst\o'a"'ndige Liste der Namen befindet sich
im Anhang des Kapitel. F\o'u"'r eine n\o'a"'chste AMX Version
ist zumindest die \o'U"'berpr\o'u"'fung der Verwendung von bereits
vergebenen Namen vorgesehen.
.NH 3
.ft B
Compilation
.ft R
.LP
AMX Programmnamen m\o'u"'ssen mit ".x" beendet sein. Die
\o'U"'bersetzung erfolgt durch den Aufruf:
.DS C
% amx file.x
.DE
Als Flags sind die des C-Compilers m\o'o"'glich. Der AMX Compiler
hinterl\o'a"'sst sein Ergebnis im "file.o", das in
einfachster Form mit:
.DS C
% cc -n file.o -la -o file
oder
% cc -i file.o -la -o file
.DE
weiter verarbeitet wird. Durch die Angabe von "-la" wird
die AMX Laufzeitbibliothek "liba.a" herangezogen. Das AMX
Programm kann nun durch den Aufruf von:
.DS C
% file
.DE
abgearbeitet werden.
.LP
Eine gleichzeitige \o'U"'bersetzung mehrerer AMX Programme durch
einen Aufruf des AMX Compilers ist aus internen Gr\o'u"'nden
nicht zul\o'a"'ssig.
.LP
Eine separate Compilierung von AMX Moduln ist nicht
m\o'o"'glich, s\o'a"'mtliche Datenbankaktionen m\o'u"'ssen in einem
Programm zusammengefasst sein. Nat\o'u"'rlich k\o'o"'nnen zu dem
compilierten AMX Programm beliebige \*(xx\-Objektmodule
einzeln bzw. in Bibliotheken zugelinkt werden.
.NH 3
.ft B
Begriffe
.ft R
.LP
AMX ist in das relationale Modell von \*(yy\ integriert.
Durch ein AMX Programm k\o'o"'nnen Daten einer \*(yy\
Datenbank manipuliert werden. Eine Datenbank ist eine Menge von
Relationen. Die Anzahl der Relationen innerhalb einer
Datenbank ist unbegrenzt. Eine Relation ist eine Menge von
Dom\o'a"'nen und Tupel, sie hat einen Eigent\o'u"'mer (Besitzer).
.LP
Die Anzahl der Dom\o'a"'nen pro Relation ist auf 49 begrenzt.
Die maximale Tupell\o'a"'nge ist generierungsabh\o'a"'ngig und
schwankt zwischen 498 und 1010 Bytes. Eine Ausrichtung der
Dom\o'a"'nen auf bestimmte Adressen ist nicht zu beachten.
.DS I
+-------------------------+
| Begriffsanalogien |
+--------+-------+--------+
Relation | Tupel | Dom\o'a"'ne
Tabelle | Zeile | Spalte
Datei | Satz | Feld
---------+-------+---------
.DE
Eine Dom\o'a"'ne besitzt einen Typ und eine L\o'a"'nge. Folgende
Kombinationen sind zul\o'a"'ssig:
.DS I
---------+----------
Typ | L\o'a"'nge
---------+----------
integer | 1
| 2
| 4
float | 4
| 8
char | 1 .. 255
---------+----------
.DE
Innerhalb einer Datenbank muss ein Nutzer f\o'u"'r seine
Relationen unterschiedliche Namen verwenden. Die Namen der
Systemkataloge
.DS L
"relation" Verwaltung der Relationen
"attribute" Verwaltung der Dom\o'a"'nen
"indexes" Verwaltung der Indizes
"integrities" Verwaltung der definierten Integrit\o'a"'ten
"protect" Verwaltung der vergebenen Zugriffsrechte
"tree" Verwaltung der vor\o'u"'bersetzten Datenbank-
aktionen
.DE
sind als Relationenname gesperrt, ebenso die Namen der
Relationen des Datenbankeigent\o'u"'mers (Datenbankadministrator
- DBA).
.LP
Innerhalb einer Relation m\o'u"'ssen die Dom\o'a"'nennamen
eineindeutig sein. Alle Namen (Datenbank, Relationen,
Dom\o'a"'nen) sind maximal 12 Zeichen lang und bestehen aus den
Zeichen "[a-z_0-9]", wobei der Name nicht mit einer Ziffer
"[0-9]" beginnen darf. Der AMX Compiler konvertiert grosse
Buchstaben "[A-Z]" automatisch in kleine "[a-z]".
.LP
Jede Relation muss vor ihrer Verwendung er\o'o"'ffnet und kann
nach Beendigung der Verarbeitung geschlossen werden. Sie
besitzt eine Menge von Tupeln (tuplecount) als zugeh\o'o"'rige
Daten. Wir unterscheiden die Recherche nach einer Menge von
Tupeln (scan) und das \o'A"'ndern bzw. Einf\o'u"'gen eines einzelnen
Tupel. Die Recherche kann alle Daten der Relation umfassen
(full relation scan) oder durch Bedingungen eingeschr\o'a"'nkt
werden (limited scan).
.LP
Ein scan setzt sich aus den Komponenten
.IP -
Selektion = scan-Bedingung,
.IP -
Projektion = Auswahl der Dom\o'a"'nen, deren Werte f\o'u"'r
die Verarbeitung interessieren und
.IP -
Aktion = Verarbeitung, die f\o'u"'r jedes gefundene Tupel
angestossen wird,
.LP
zusammen.
.NH 3
.ft B
Syntaktische Regeln
.ft R
.LP
.nf
| : Alternative.
[ ] : wahlweiser Ausdruck, kann entfallen.
{ } : mindestens einmalige Wiederholung,
mehrere Elemente werden durch COMMA "," getrennt.
Ausnahme: { amx_stmt } wird nicht separiert.
{A-Z_}: Schl\o'u"'sselw\o'o"'rter bzw. terminale Symbole:
\*(yy\ = "ing_db"
OPEN = "open"
CLOSE = "close"
TUPLECOUNT = "tuplecount"
APPEND = "append"
OVER = "over"
SCAN = "scan"
PRINT = "print"
DELETE = "delete"
REPLACE = "replace"
LPAREN = "("
RPAREN = ")"
LBRACE = "{"
RBRACE = "}"
DOLLAR_SIGN = "$"
IS = "="
| "=="
RELOP = IS
| "<"
| "<="
| ">"
| ">="
| "!="
.fi
.LP
.nf
{a-z_} : Regelname bzw. nonterminale Symbole.
Mit "(n)" numerierte Regeln sind im Programm
frei verwendbar, die mit "{n}" nur innerhalb
eines scan-Statements.
Alle unterstrichenen Regeln sind nicht weiter
aufgel\o'o"'st und besitzen folgende Bedeutung:
xx = \*(yy\-Nutzercode f\o'u"'r das
alter-ego-Flag
no_of_bufs = Anzahl der zus\o'a"'tzlichen Puffer
f\o'u"'r die Zugriffsmethoden
database = Datenbankname
c_code = C-Statement
c_decl = Deklaration einer C-Variablen
rel = Relationsname
c_var = C-Variablenname
dom_name = Dom\o'a"'nenname bzw. Dom\o'a"'nennummer
const = int-Konstante
| long-Konstante
| double-Konstante
| "string"-Konstante
.fi
.LP
.NH 3
.ft B
Grammatik
.ft R
.LP
.nf
( 1) program : ing_db { amx_stmt }
;
( 2) ing_db : \*(yy\ flags database
; --------
( 3) flags : [ "-u user_name " ] [ " +no_of_bufs " ]
--------- ----------
;
( 4) amx_stmt : c_code
------
( 5) | c_decl
------
( 6) | OPEN rel
---
( 7) | CLOSE rel
---
( 8) | TUPLECOUNT rel c_var
--- -----
( 9) | APPEND rel target
---
(10) | [ OVER rel ] SCAN rel
--- ---
(11) [ { qual } ]
(12) [ LPAREN { var_assign } RPAREN ]
(13) LBRACE [ { amx_stmt } ] RBRACE
(14) | PRINT LPAREN [ { dom } ] RPAREN
(15) | DELETE
(16) | REPLACE target
(17) | APPEND target
;
(18) target : LPAREN { dom_assign } RPAREN
;
(19) dom_assign : dom IS value
;
(20) dom : DOLLAR_SIGN dom_name
; --------
(21) value : c_var
-----
(22) | const
-----
(23) | dom
;
(24) qual : dom RELOP value
;
(25) var_assign : c_var IS dom
.fi
.LP
.NH 3
.ft B
Sprachbeschreibung
.ft R
.LP
Die AMX Sprachbeschreibung orientiert sich an der
vereinfachten AMX Grammatik.
Kommentare sind innerhalb von AMX Statements in der C
\o'u"'blichen Notation zugelassen:
.DS C
## . . . /* Kommentar */ . . .
.DE
.DS L
( 1) program : ing_db { amx_stmt }
;
.DE
Ein AMX Programm besteht aus einem einleitenden ing_db-
Statement und einer beliebigen Menge von amx-Statements.
.DS L
( 2) ing_db : \*(yy\ flags database
; --------
.DE
Das ing_db-Statement adressiert die zu verarbeitende
Datenbank "database" und gestattet wahlweise die Angabe von
Flags.
.DS L
( 3) flags : [ "-uuser_name" ] [ "+no_of_bufs" ]
; --------- ----------
.DE
Das Flag -u"user_name" bewirkt, dass das AMX Programm mit den
Datenbankberechtigungen des \*(yy\ Nutzer "user_name" l\o'a"'uft.
Das Flag +"no_of_bufs" f\o'u"'gt "no_of_bufs"-Puffer in das
Pufferschema der \*(yy\ Zugriffsmethoden ein.
Normalerweise stehen nur 3 Puffer f\o'u"'r die Arbeit mit Relationen zur
Verf\o'u"'gung, wobei eine Relation maximal einen Puffer belegen
kann. Bei der parallelen Arbeit mit mehreren Relationen
(Indexrelationen m\o'u"'ssen mitgerechnet werden) sollte jeder
Relation ein eigener Puffer zugeordnet werden k\o'o"'nnen. Die
zus\o'a"'tzlichen Puffer werden im Nutzerstack angelegt.
.DS L
( 4) amx_stmt : c_code
; ------
.DE
Ein AMX Statement kann eine Menge von beliebigen
C-Statements sein. Die C-Statements werden nicht durch das
Kennzeichen "##" am Anfang der Zeile eingeleitet.
.DS L
( 5) amx_stmt : c_decl
; ------
.DE
C-Variable, die sowohl im AMX als auch im C-Programm
verwendet werden sollen, m\o'u"'ssen mit dem Kennzeichen "##" am
Anfang der Zeile deklariert werden.
.LP
Folgende Typen werden unterst\o'u"'tzt:
.DS I
- short
- int
- long
- float
- double
- char *
- char []
.DE
Folgende Speicherklassen werden unterst\o'u"'tzt:
.DS I
- auto
- extern
- static
.DE
.DS L
( 6) amx_stmt : OPEN rel
; ---
.DE
Das open-Statement er\o'o"'ffnet die Relation
.ft B
rel
.ft R
f\o'u"'r die
weitere Verarbeitung. Die Relation
.ft B
rel
.ft R
muss eine
Prim\o'a"'r bzw. Basisrelation sein, d.h. es ist nicht m\o'o"'glich,
explizit eine Indexrelation zu er\o'o"'ffnen. Durch das open-
Statement werden automatisch alle zur Relation geh\o'o"'rigen
Indizes miter\o'o"'ffnet. Die Relation
.ft B
rel
.ft R
darf kein view
sein und es d\o'u"'rfen keine integrity- bzw. protection-
constraints auf ihr definiert sein. Die Systemkataloge
.ft B
relation
.ft R
,
.ft B
attribute
.ft R
und
.ft B
indexes
.ft R
werden durch den Start
eines AMX Programms automatisch er\o'o"'ffnet.
.LP
Recherchen (scan-Statement) sind auf allen Relationen
zugelassen, d.h. auf Basis-, Indexrelationen und Katalogen.
\o'A"'nderungen und Einf\o'u"'gungen sind nur auf Basisrelationen
zul\o'a"'ssig, f\o'u"'r die das Programm die update-Erlaubnis hat.
.DS L
( 7) amx_stmt : CLOSE rel
; ---
.DE
Das close-Statement schliesst die Relation
.ft B
rel
.ft R
f\o'u"'r die
weitere Verarbeitung. Es k\o'o"'nnen nur Relationen geschlossen
werden, die zuvor durch das open-Statement er\o'o"'ffnet wurden.
Die Beendigung eines Programms (
.ft B
exit
.ft R
) schliesst
automatisch alle er\o'o"'ffneten Relationen und Kataloge.
.DS L
( 8) amx_stmt : TUPLECOUNT rel c_var
; --- -----
.DE
Das tuplecount-Statement weist der C-Variable
.ft B
c_var
.ft R
als Wert die Anzahl der Tupel der Relation
.ft B
rel
.ft R
zu.
.ft B
c_var
.ft R
muss ein numerischer Typ sein. Die Anzahl der Tupel einer
Relation ist die einzigste verf\o'u"'gbare variable
Kataloginformation f\o'u"'r das AMX Programm. Auf Umwegen kann so die
Anzahl der \o'A"'nderungen in einer Relation bestimmt werden:
.DS L
. . .
## long old, new;
. . .
## tuplecount rel old
{ Neueinf\o'u"'gungen }
## tuplecount rel new
printf("# of updates", new - old);
. . .
.DE
.DS L
( 9) amx_stmt : APPEND rel target
; ---
.DE
Das append-Statement f\o'u"'gt ein neues Tupel in die Relation
.ft B
rel
.ft R
ein. Durch die Projektion
.ft B
target
.ft R
werden den
aufgef\o'u"'hrten Dom\o'a"'nen Werte zugewiesen. Alle nicht angebenen
Dom\o'a"'nen der Relation
.ft B
rel
.ft R
werden mit einem Nullwert
initialisiert, alle numerischen Dom\o'a"'nen bekommen den Wert 0
und die Zeichenkettendom\o'a"'nen eine mit Leerzeichen gef\o'u"'llte
Zeichenkette zugewiesen. Eventuell vorhandene Indizes
werden automatisch aktualisiert.
.DS L
(18) target : LPAREN { dom_assign } RPAREN
;
.DE
Die Projektion wird durch eine \o'o"'ffnende "(" und eine
schliessende runde Klammer ")" begrenzt. Sie enth\o'a"'lt eine
durch Kommas "," getrennte Aufz\o'a"'hlung von Zuweisungen
.ft B
dom_assign.
.ft R
Es muss mindestens einer Dom\o'a"'ne ein Wert
zugewiesen werden.
.DS L
(19) dom_assign : dom IS value
;
.DE
Eine Zuweisung weist der Dom\o'a"'ne
.ft B
dom
.ft R
den Wert
.ft B
value
.ft R
zu.
Bei den Zuweisungen von numerischen zu numerischen Typen
werden die notwendigen Konvertierungen ohne \o'U"'berlauf- bzw.
Unterlaufkontrolle vorgenommen. Zuweisungen von numerischen
zu Zeichenkettenwerten und umgekehrt sind nicht zul\o'a"'ssig.
.DS L
(20) dom : DOLLAR_SIGN dom_name
; --------
.DE
Eine Dom\o'a"'ne wird durch das Kennzeichen "$" und ihren Namen
bzw. ihre Nummer (siehe Dom\o'a"'ne
.ft B
attid
.ft R
des Katalogs
.ft B
attribute
.ft R
) spezifiziert. Durch die explizite
Kennzeichnung von Dom\o'a"'nennamen durch das Zeichen "$" werden im
Gegensatz zu EQUEL Konflikte mit dem Namen von C-Variablen
vermieden. Die Referenzierung von Dom\o'a"'nen \o'u"'ber ihre
interne Nummer (Reihenfolge vom CREATE(QUEL)) kann sinnvoll
bei einer vektorisierten Verarbeitung sein.
.DS L
(21) value : c_var
; -----
.DE
Ein Wert kann der aktuelle Wert der C-Variablen
.ft B
c_var
.ft R
sein.
.DS L
(22) value : const
; -----
.DE
Ein Wert kann eine in C \o'u"'bliche Konstante
.ft B
const
.ft R
sein.
.DS L
(23) value : dom
;
.DE
Ein Wert kann der aktuelle Wert der Dom\o'a"'ne
.ft B
dom
.ft R
sein.
Diese Form des Wertes setzt einen \o'u"'bergeordneten scan
voraus, aus dem der Wert f\o'u"'r die Dom\o'a"'ne
.ft B
dom
.ft R
geholt
werden kann.
.DS L
(10) amx_stmt : [ OVER over_rel ] SCAN scan_rel
-------- --------
(11) Selektion [ { qual } ]
(12) Projektion [ LPAREN { var_assign } RPAREN ]
(13) Aktion LBRACE [ { amx_stmt } ] RBRACE
;
.DE
Das scan-Statement ist das m\o'a"'chtigste AMX Statement, es
\o'u"'bernimmt die Zugriffspfadoptimierung und erm\o'o"'glicht eine
rekursive Verarbeitung, da innerhalb eines scans ein weiterer
scan aufgerufen werden kann.
.LP
Die over-Klausel (OVER over_rel) gestattet die Zuweisung des
Zugriffspfades \o'u"'ber die Relation
.ft B
over_rel
.ft R
f\o'u"'r den scan
und damit die Ausschaltung der Zugriffspfadoptimierung im
AMX Compiler.
.ft B
over_rel
.ft R
muss die zu scannende Relation
selbst oder ein Index von
.ft B
scan_rel
.ft R
sein. Ist
.ft B
over_rel
.ft R
ein Index und wird durch die Selektion
.ft B
qual
.ft R
keinem
Schl\o'u"'ssel von
.ft B
over_rel
.ft R
ein Wert zugewiesen, wird der
Zugriffspfad \o'u"'ber die Prim\o'a"'rrelation
.ft B
scan_rel
.ft R
gew\o'a"'hlt, da
ein
.ft B
full relation scan
.ft R
\o'u"'ber einen Index unsinning ist.
Die scan-Klausel (SCAN scan_rel) adressiert die zu scannende
Relation
.ft B
scan_rel.
.ft R
.NH 3
.ft B
Selektion
.ft R
.LP
Der scan kann durch die Angabe einer Selektion
eingeschr\o'a"'nkt werden. Die Selektion ist eine Einschr\o'a"'nkung
des Wertebereichs einzelner (oder aller) Dom\o'a"'nen. Mehrere
Einschr\o'a"'nkungen werden durch Komma "," getrennt. Eine
Dom\o'a"'ne kann maximal zwei Einschr\o'a"'nkungen erfahren. Alle
zugewiesenen Bedingungen und Werte der angebenen
Einschr\o'a"'nkungen werden beim Einlauf in den scan gekellert, so
dass z.B. eine \o'A"'nderung des Wertes einer verwendeten C-
Variablen keinen Einfluss auf die Selektion hat.
.NH 3
.ft B
Projektion
.ft R
.LP
Die Projektion ist wahlweise, d.h. sie kann entfallen. Die
Projektion wird durch eine \o'o"'ffnende "(" und eine
schliessende runde Klammer ")" begrenzt. Sie weist f\o'u"'r
jedes, entsprechend der Selektion gefundene Tupel, der
angebenen Menge von C-Variablen den aktuellen Wert der
zugeordneten Dom\o'a"'nen zu. Die einzelnen Zuweisungen werden
durch Komma "," getrennt.
.NH 3
.ft B
Aktion
.ft R
.LP
Die Aktion wird durch eine \o'o"'ffnende "{" und eine
schliessende geschweifte Klammer "}" begrenzt. Innerhalb
der Aktion k\o'o"'nnen beliebige AMX Statements stehen. Die
Aktion kann leer sein, allerdings m\o'u"'ssen die Klammern
angegeben sein. Es ist wichtig zu wissen, dass innerhalb der
Aktion die Dom\o'a"'nenwerte des gefundenen Tupel immer vorhanden
sind und sich nicht \o'a"'ndern.
.LP
.ft B
BEISPIEL
.ft R
.DS L
. . .
## open supply
## open parts
. . .
## scan supply $snum = 122
## {
## scan parts /*parts*/$pnum = /*supply*/$pnum
## {
. . .
## }
## }
. . .
## close supply
## close parts
. . .
.DE
.LP
Die \o'U"'bernahme von Werten aus dem \o'u"'bergeordneten scan
gestattet die einfache Implementierung von geschachtelten
scan's z.B. zur Zuordnung von Abk\o'u"'rzungen zu Langformen
(Nomenklaturen) usw. Bei Zeichenkettendom\o'a"'nen gestattet
der AMX Compiler keine \o'U"'bernahme von Werten, wenn die
L\o'a"'nge der Dom\o'a"'ne des \o'u"'bergeordneten scan's k\o'u"'rzer als
die L\o'a"'nge der Dom\o'a"'ne des aktuellen scan's ist. Eine
Mischung von numerischen und Zeichenkettenwerten wird
grunds\o'a"'tzlich nicht unterst\o'u"'tzt.
.DS L
(24) qual : dom RELOP value
;
.DE
.ft B
dom
.ft R
gibt die einzuschr\o'a"'nkende Dom\o'a"'ne und
.ft B
value
.ft R
den Wert der Einschr\o'a"'nkung an. Als Einschr\o'a"'nkungen sind die
Bedingungen "RELOP":
.DS C
"=", "==", "<", "<=", ">", ">=", "!="
.DE
zul\o'a"'ssig. Wird eine Dom\o'a"'ne doppelt eingeschr\o'a"'nkt, sind
folgende zul\o'a"'ssige Kombinationen zu beachten:
.DS I
"<[=]" und ">[=]"
"<[=]" und "!="
">[=]" und "!="
.DE
Die Reihenfolge der Einschr\o'a"'nkungen f\o'u"'r eine Dom\o'a"'ne ist
in folgender Art einzuhalten:
.DS I
"<[=]" --> ">[=]" --> "!="
.DE
.DS L
(25) var_assign : c_var IS dom
; -----
.DE
Eine Zuweisung weist der C-Variablen
.ft B
c_var
.ft R
den aktuellen Wert der Dom\o'a"'ne
.ft B
dom
.ft R
zu. Bei den Zuweisungen von
numerischen zu numerischen Typen werden die notwendigen
Konvertierungen ohne \o'U"'berlauf- bzw. Unterlaufkontrolle
vorgenommen. Zuweisungen von numerischen zu
Zeichenkettenwerten und umgekehrt sind nicht zul\o'a"'ssig.
.DS L
(14) amx_stmt : PRINT LPAREN [ { dom } ] RPAREN
;
.DE
Das print-Statement gibt die Werte der, durch eine \o'o"'ffnende
"(" und eine schliessende runde Klammer ")", begrenzten Liste
der Dom\o'a"'nen in einem Standardformat nach standard output
aus. Die Liste enth\o'a"'lt eine durch Kommas "," getrennte
Aufz\o'a"'hlung der auszugebenden Dom\o'a"'nen. Eine leere Liste
"()" gibt die Werte aller Dom\o'a"'nen aus. Das Standardformat
enth\o'a"'lt den Namen und den Wert der Dom\o'a"'ne in folgender
Form:
.DS L
"%12s: %?\en", domainname, value
? == Format der auszugebenden Dom\o'a"'ne
.DE
.DS L
(15) amx_stmt : DELETE
;
.DE
Das delete-Statement l\o'o"'scht das innerhalb des laufenden
scan's gefundene aktuelle Tupel aus der Datenbasis.
Innerhalb der Aktion bleibt das aktuelle Tupel mit seinen
Werten erhalten. Eventuell vorhandene Indizes werden
automatisch aktualisiert.
.DS L
(16) amx_stmt : REPLACE target
;
.DE
Das replace-Statement gestattet die \o'A"'nderung von Werten
einzelner (oder aller) Dom\o'a"'nen. Eine Unterscheidung von
Schl\o'u"'ssel- und Nichtschl\o'u"'sseldom\o'a"'nen ist nicht zu
beachten. Die \o'A"'nderungen werden durch die Projektion
.ft B
target
.ft R
spezifiziert. Es ist zu beachten, dass die
\o'A"'nderungen in einem gesondertem Puffer ausgef\o'u"'hrt werden,
also das aktuell gefundene Tupel innerhalb des laufenden
scan's unver\o'a"'ndert bleibt. Eventuell vorhandene Indizes
werden, falls n\o'o"'tig, automatisch aktualisiert. Eine
Aktualsierung entf\o'a"'llt z.B., wenn eine identische \o'A"'nderung
(ge\o'a"'ndertes == Ursprungstupel) ausgef\o'u"'hrt wurde oder wenn
die ge\o'a"'nderten Dom\o'a"'nen nicht Be\%standteil des Index sind
und sich die Tupeladresse
.ft B
TID
.ft R
nicht ge\o'a"'ndert hat.
.DS L
(17) amx_stmt : APPEND target
;
.DE
Das append-Statement f\o'u"'gt ein neues Tupel in die aktuell
gescannte Relation ein. Durch die Projektion
.ft B
target
.ft R
werden den aufgef\o'u"'hrten Dom\o'a"'nen Werte zugewiesen. Alle
nicht angebenen Dom\o'a"'nen erhalten den Wert aus dem aktuell
gefundenen Tupel des laufenden scan's. Es ist zu beachten,
dass die \o'A"'nderung in einem gesondertem Puffer ausgef\o'u"'hrt
werden, also das aktuell gefundene Tupel unver\o'a"'ndert
bleibt. Eventuell vorhandene Indizes werden automatisch
aktualisiert.
.RE