798 lines
33 KiB
Plaintext
798 lines
33 KiB
Plaintext
AMX(DABA) DABA16 AMX(DABA)
|
|
|
|
NAME
|
|
amx - Einbettung der Datenmanipulationssprache AMX in "C"
|
|
|
|
BESCHREIBUNG
|
|
|
|
Einleitung
|
|
|
|
Die Sprache AMX stellt ein Interface zur Einbettung von Da-
|
|
tenbankzugriffen in "C"-Programme dar und ist leicht erlern-
|
|
bar.
|
|
|
|
Es werden eine Laufzeitbibliothek, i.allg. .../lib/libamx.a,
|
|
und DABA-MUTOS-Kommandos (i.allg. amx(mutos)) bereitge-
|
|
stellt. Durch ein solches Kommando (z.B. amx) werden bei
|
|
entsprechend spezifizierten Optionen (Flags) ein DABA-
|
|
Praecompiler fuer AMX und der C-Compiler "cc" (einschliess-
|
|
lich Linker) aufgerufen. Der Praecompiler erzeugt ein guel-
|
|
tiges C-Programm, das mit dem C-Compiler uebersetzt wird.
|
|
Anschliessend werden die fuer die Datenbankaktionen notwen-
|
|
digen Objektmoduln aus der Laufzeitbibliothek eingebunden.
|
|
|
|
|
|
|
|
In AMX-Programmen ist das parallele Arbeiten mehrerer Nutzer
|
|
in den gleichen Relationen unterstuetzt.
|
|
|
|
Die Vorteile bei der Benutzung dieser AMX-Sprache bestehen
|
|
in der Moeglichkeit der Realisierung laufzeiteffektiver Pro-
|
|
gramme, in der Formulierbarkeit von Transaktionen und in ei-
|
|
ner rekursiven Anwendbarkeit. Letzteres bedeutet, dass z.B.
|
|
Wiederfinden und Aendern geschachtelt benutzbar sind. Aus-
|
|
serdem sind prozedurale Probleme, z.B. die totale
|
|
Mengenbedarfsermittlung (totale Stuecklistenaufloesung),
|
|
elegant loesbar.
|
|
|
|
Alle (auch temporaere) Relationen (einschliesslich aller da-
|
|
tenbankspezifischen Namen), die in AMX-Programmen verarbei-
|
|
tet werden sollen, muessen zur Uebersetzungszeit bereits
|
|
existieren. Das bedeutet, dass sie vorher mit IQL, EQL oder
|
|
"creater" (creater(mutos)) erstellt werden muessen.
|
|
|
|
Mit AMX-Programmen manipulierte Relationen sind mit IQL, EQL
|
|
oder auch AMX weiterhin bearbeitbar.
|
|
|
|
Uebersicht
|
|
|
|
Alle tupelorientierten AMX-Anweisungen sind ausschliesslich
|
|
auf eine einzige Relation anwendbar.
|
|
|
|
Die Sprache AMX hat als maechtigste Operation das Bereit-
|
|
stellen von Werten spezifizierter Domaenen aus einer u.U.
|
|
selektierten Tupelmenge einer Relation (Wiederfinden) (re-
|
|
trieve).
|
|
|
|
Die Recherche (Wiederfinden) kann alle Daten der Relation
|
|
umfassen oder durch Selektionsbedingungen (Qualifiktionen)
|
|
eingeschraenkt werden.
|
|
|
|
In einer retrieve-Anweisung kann eine Qualifikation und muss
|
|
eine Auswahl spezifizierter oder aller Domaenen als
|
|
target_list (Ergebnis- oder Zielliste) angegeben werden.
|
|
Eine solche Ergebnisliste besitzen ausser der retrieve nur
|
|
die append und die replace Anweisung.
|
|
|
|
Nach einer erfolgreichen Recherche, die eine Tupelmenge
|
|
(mindestens ein Tupel) bereitstellt, wird fuer jedes dieser
|
|
Tupel eine Aktion ausgefuehrt.
|
|
|
|
Die anderen tupelorientierten AMX-Anweisungen beziehen sich
|
|
immer nur auf ein Tupel.
|
|
|
|
|
|
|
|
Es sind das Ersetzen der Werte der Domaenen eines Tupels
|
|
(Ersetzen) (replace), das Loeschen eines Tupels (Loeschen)
|
|
(delete), das Anzeigen eines Tupels (print) bzw. das Erzeu-
|
|
gen eines neuen Tupels (Zufuegen zu einer Relation) (ap-
|
|
pend), aus der Menge vorher mit "retrieve" selektierter Tu-
|
|
pel, moeglich.
|
|
|
|
Des weiteren ist das Zufuegen eines neuen Tupels zur Rela-
|
|
tion ohne vorherige Selektion nutzbar (append).
|
|
|
|
Es gibt weiterhin AMX-Anweisungen fuer das Eroeffnen einer
|
|
spezifizierten Datenbank entweder mit exklusiver (alleini-
|
|
ger) Benutzung (daba oder exclusive), ohne Sperrung oder mit
|
|
geteilter Benutzung (shared) sowie fuer das Eroeffnen (open)
|
|
bzw. das Schliessen (close) einer Relation.
|
|
|
|
Sollen in einem AMX-Programm miteinander in logischer Bezie-
|
|
hung stehende Datenmanipulationen (i.allg. in mehreren Rela-
|
|
tionen) ausgefuehrt werden, ist es zur Erhaltung der Date-
|
|
nintegritaet erforderlich, Transaktionen zu formulieren.
|
|
Eine Transaktion ist eine Folge von AMX-Anweisungen als lo-
|
|
gische Arbeitseinheit. Es gibt jeweils eine Anweisung zur
|
|
Spezifikation des Transaktionsbeginns (use), des Transak-
|
|
tionsendes (commit), sowie des Abbrechens einer Transaktion
|
|
und das Ruecksetzen (abort) und fuer das Behandeln einer
|
|
Verklemmung (if (deadlock)).
|
|
|
|
Bei Transaktionsbeginn sind die beteiligten Relationen und
|
|
die Art ihrer Benutzung (alleinig (exclusive), geteilt
|
|
(shared) oder ohne Sperrung (nolock)) spezifizierbar. Aus-
|
|
serdem ist u.a. das Sperrniveau (Seitensperrung (page) oder
|
|
Relationssperrung (table)) angebbar.
|
|
|
|
Des weiteren sind Anweisungen zur vorzeitigen Beendigung
|
|
eine Wiederfindungszyklusses (endretrieve), zur vorzeitigen
|
|
Beendigung einer Tupelverarbeitung im Wiederfindungszyklus
|
|
(nextretrieve), zum Bereitstellen der Gesamt-Tupelanzahl ei-
|
|
ner Relation (tuplecount) sowie der maximalen Tupellaenge
|
|
der Relation (tuplelength), und eine Leeranweisung (;) ver-
|
|
fuegbar.
|
|
|
|
Neben den durch "C" bereitgestellten und von AMX unter-
|
|
stuetzten Datentypen short (2), int (2 bei 16 Bit- und 4 bei
|
|
32-Bit Rechnern), long(4) , float(4), double(8), char * und
|
|
char [] (1-255) sind durch AMX zusaetzlich die mit den
|
|
DABA-Datentypen uebereinstimmenden Typen
|
|
|
|
i1, i2, i4, f4, und f8
|
|
|
|
verfuegbar.
|
|
|
|
Einschraenkungen
|
|
|
|
Die Geschwindigkeit der AMX-Zugriffe erfordert einige Ein-
|
|
schraenkungen. AMX gestattet Datenveraenderungen und Wie-
|
|
derfinden ausschliesslich in Basis-Nutzerrelationen (nicht
|
|
in Sichten!). Das Wiederfinden in Index-Nutzerrelationen
|
|
wird unterstuetzt. Die Katalogrelationen sind, entsprechend
|
|
definierte Befugnisse vorausgesetzt, lesbar.
|
|
|
|
Da nur die in einem AMX-Programm konkret benoetigten Zu-
|
|
griffsroutinen eingebunden werden, sind keine Universallo-
|
|
esungen, z.B. universelle Druckprogramme, realisierbar.
|
|
|
|
Aus dem Dargelegten ergibt sich ebenfalls, dass die Nutzer-
|
|
relationen nicht mit AMX erstellt werden koennen. Bevor ein
|
|
AMX-Programm uebersetzt werden kann, muessen die in diesem
|
|
Programm spezifizierten Relationen bereits mit IQL, EQL oder
|
|
dem DABA-MUTOS-Kommandos "creater" (creater(mutos)) erstellt
|
|
worden sein.
|
|
|
|
Da nur die in einem AMX-Programm benoetigten Zugriffsrouti-
|
|
nen zu den Relationen, entsprechend den konkreten Bedingun-
|
|
gen, zugriffsoptimiert in das ausfuehrbare Programm einge-
|
|
bunden werden, ist nach jeder Modifikation der Relations-
|
|
struktur (modify(ql), modifyr(mutos), index(ql) bzw.
|
|
indexr(mutos), destroy(ql) bzw. destroyr(mutos) und crea-
|
|
te(ql) bzw. creater(mutos), eine Neuuebersetzung des AMX-
|
|
Programmes notwendig!
|
|
|
|
Eine Relation, die durch ein AMX-Programm verarbeitet werden
|
|
soll, darf keine definierten Integritaetsbedingungen besit-
|
|
zen! Als Befugnisse einer solchen Relation duerfen aus-
|
|
schliesslich operationelle Befugnisse (append, retrieve, de-
|
|
lete, replace oder all) ohne jede Qualifikation definiert
|
|
worden sein!
|
|
|
|
Werden mehrere Objektmodule zu einem ausfuehrbaren Programm
|
|
verbunden, darf nur einer dieser Objektmodule AMX-
|
|
Anweisungen enthalten!
|
|
|
|
Konvertierungen zwischen numerischen und Zeichenkettenwerten
|
|
(und umgekehrt) werden nicht unterstuetzt. Numerische Kon-
|
|
vertierungen erfolgen ohne Unter- bzw. Ueberlaufkontrolle.
|
|
|
|
Vergleiche von Zeichenkettenwerten zwischen Domaenen und Va-
|
|
riablen werden in der Laenge der Domaene ausgefuehrt, z.B.
|
|
liefert der Variablenwert "Automat" den Wert "Auto" fuer die
|
|
Datenbankaktion, wenn die zugehoerige Domaene den DABA-
|
|
Datentyp "c4" hat.
|
|
|
|
Uebersetzung
|
|
|
|
AMX-Anweisungen, im Anwendungsprogramm durch ein besonde-
|
|
res Praefixsymbol "##" gekennzeichnet, werden durch den
|
|
Voruebersetzer (Praeprozessor) syntaktisch und semantisch
|
|
ueberprueft und in Prozeduraufrufe der hoeheren Programm-
|
|
iersprache uebersetzt. Vorbild fuer diesen Loesungsansatz
|
|
war EQL des DABA.
|
|
|
|
"C"-Anweisungen werden unveraendert in das "C"-Programm ko-
|
|
piert.
|
|
|
|
Damit ein AMX-Quellprogramm vom AMX-Compiler verarbeitet
|
|
werden kann, muss das File, in dem es enthalten ist, den
|
|
File-Namenssuffix ".x" (z.B. prog.x) besitzen.
|
|
|
|
Der AMX-Compiler holt sich alle Informationen zu den Rela-
|
|
tionen und Domaenen aus den Systemkatalogen (Katalogrelatio-
|
|
nen) der Datenbank und entlastet somit den Anwender von der
|
|
Angabe dieser Details und den Fehlern, die an dieser Stelle
|
|
gemacht werden koennen. Durch diesen Ansatz ist eine weit-
|
|
gehende Quelltextunabhaengigkeit von der Struktur der Daten-
|
|
bank gesichert.
|
|
|
|
Bei der Zugriffspfadoptimierung werden die vorhandenen In-
|
|
dizes voll herangezogen. Wenn der AMX-Programmierer es for-
|
|
dert, ist eine davon abweichende Zugriffsgestaltung spezifi-
|
|
zierbar.
|
|
|
|
Aenderungen sind nur in Nutzerrelationen gestattet, die Sy-
|
|
stemkataloge und Indizes werden durch AMX aktualisiert.
|
|
|
|
Eine Aenderung der Speicherungsstruktur einer Relation er-
|
|
fordert, wie bereits betont, keine Aenderung des AMX-
|
|
Quellprogramms, wohl aber dessen neue Uebersetzung.
|
|
|
|
Wenn der AMX-Compiler ein AMX-Programm uebersetzen soll, ar-
|
|
beitet dieser als Nutzer "daba". Damit das erzeugte "C"-
|
|
Programm in das aktuelle Arbeits-Directory geschrieben wer-
|
|
den kann, muss deshalb "daba" in diesem Directory die
|
|
Schreiberlaubnis besitzen.
|
|
|
|
Die Spezifikation des AMX-Quell-Files erfolgt, wie ueblich,
|
|
entweder als absoluter Pfadname oder relativ zum aktuellen
|
|
Arbeit-Directory.
|
|
|
|
|
|
|
|
|
|
Das durch den AMX-Compiler erzeugte AMX-Programm besitzt den
|
|
Filemodus oktal "6755" und ist dem Nutzer daba und der Grup-
|
|
pe daba zugeordnet. Es ist z.B. beim Kopieren eines AMX-
|
|
Programmes darauf zu achten, dass dieser Filemodus erhalten
|
|
bleibt.
|
|
|
|
Zur Fehlererkennung beimm Compilieren ist folgendes zu be-
|
|
merken. Nach Erkennung eines Fehlers wird die Uebersetzung
|
|
erst nach drei als richtig erkannten syntaktischen Einheiten
|
|
(Token, Morpheme) fortgesetzt, sodass eine zweite Ueberset-
|
|
zung Fehler erzeugen kann, die in der ersten nicht gemeldet
|
|
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 wur-
|
|
de, da der Compiler immer eine syntaktische Einheit voraus
|
|
liest.
|
|
Wird ein Fehler festgestellt, ist in dem oben genannten Fall
|
|
der Zeilenzaehler aber schon um eins (oder mehr, bei Zeilen
|
|
ohne syntaktische Einheiten) hochgezaehlt. Bei einigen syn-
|
|
taktischen Fehler ist eine Angabe der Fehlerursache aeus-
|
|
serst schwierig.
|
|
Aufgrund der einfachen Syntax von AMX wurde auf eine detail-
|
|
lierte Fehlererkennung verzichtet und der Anwender muss den
|
|
erzeugten Fehler
|
|
|
|
"syntax error"
|
|
selbst deuten.
|
|
|
|
Namenskonventionen
|
|
|
|
Fuer Datenbankbegriffe (ql(iql)) und auch bezueglich der
|
|
Grenzwerte gelten die gleichen Bedingungen wie in den an-
|
|
deren DABA-Interfaces. Es sei nochmals daran erinnert, dass
|
|
die Namen der Systemrelationen:
|
|
|
|
"relation" Verwaltung der Relationen
|
|
"attribute" Verwaltung der Domaenen
|
|
"indexes" Verwaltung der Indizes
|
|
"integrities" Verwaltung der definierten Integritaeten
|
|
"protect" Verwaltung der vergebenen Zugriffsrechte
|
|
"tree" Verwaltung der voruebersetzten Datenbank-
|
|
aktionen
|
|
"references" Verwaltung von Beziehungen zwischen
|
|
Relationen
|
|
|
|
als Namen von Nutzerrelationen gesperrt sind.
|
|
|
|
|
|
|
|
|
|
Alle Namen (Datenbank, Relationen, Domaenen) 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 (siehe
|
|
ql(iql)). Der AMX-Compiler konvertiert bei Namen grosse
|
|
Buchstaben "[A-Z]" automatisch in kleine "[a-z]".
|
|
|
|
Durch die Laufzeitbibliothek werden eine Reihe von Objekten
|
|
definiert, die alle mit "AA" beginnen. Der Anwendungspro-
|
|
grammierer hat zu gewaehrleisten, dass diese Objekte nicht
|
|
ueberdefiniert werden. Er sollte Namen, die mit "AA" begin-
|
|
nen, generell vermeiden.
|
|
|
|
AMX-Programm
|
|
|
|
Jedes AMX-Programm besteht aus "C"-Anweisungen und eingebet-
|
|
teten AMX-Anweisungen, die vom AMX-Praeprozessor verarbeitet
|
|
werden.
|
|
|
|
Alle AMX-Anweisungen sind durch das AMX-Kommandopraefix, das
|
|
aus zwei Nummernzeichen "##" am Zeilenanfang gebildet wird,
|
|
gekennzeichnet.
|
|
|
|
|
|
|
|
|
|
"C"-Variablen, die in AMX-Anweisungen verwendet werden, sind
|
|
ebenfalls durch "##" zu kennzeichnen.
|
|
|
|
Wie bereits dargelegt, sind die "C"-Variablentypen und zu-
|
|
saetzlich "i1", "i2", "i4", "f4" und "f8" verfuegbar.
|
|
|
|
Alle Variablen sind global zu deklarieren!
|
|
|
|
Die erste Anweisung im AMX-Quellprogramm muss eine der An-
|
|
weisungen zum Eroeffnen der Datenbank (exclusive, daba, no-
|
|
lock oder shared) sein.
|
|
|
|
Die erste auszufuehrende Funktion, anstelle von "main", muss
|
|
die Funktion "amx" sein. Fuer diese Funktion sind die glei-
|
|
chen Parameter wie bei "main" spezifizierbar (amx() ohne Pa-
|
|
rameter).
|
|
|
|
Jede Relation muss vor ihrer Verwendung eroeffnet und kann
|
|
nach Beendigung der Verarbeitung geschlossen werden. Durch
|
|
die MUTOS Funktion "exit" werden alle noch eroeffneten Rela-
|
|
tionen geschlossen, nachdem die entsprechenden noch ausste-
|
|
henden Ausgaben erfolgt sind.
|
|
|
|
|
|
|
|
Zur Bildung syntaktischer Konstruktionen werden zur Darstel-
|
|
lung einer Auswahl oder Wiederholung die folgenden Metasym-
|
|
bole verwendet:
|
|
|
|
| : Alternative.
|
|
|
|
[ ] : wahlweiser Ausdruck, kann entfallen.
|
|
|
|
{ } : mindestens einmalige Wiederholung,
|
|
mehrere Elemente werden durch ein Komma "," getrennt.
|
|
|
|
Als syntaktische Variable werden u.a. die folgenden verwen-
|
|
det:
|
|
|
|
dbname = Datenbankname
|
|
c_code = C-Anweisung
|
|
c_decl = Deklaration einer C-Variablen
|
|
relname = Relationsname
|
|
c_var = C-Variablenname
|
|
domname = Domaenenname bzw. Domaenennummer
|
|
const = int-Konstante | long-Konstante
|
|
| double-Konstante | "string"-Konstante
|
|
|
|
|
|
|
|
Sprachbeschreibung
|
|
|
|
Das Folgende ist eine Beschreibung der allgemeinen Syntax
|
|
der Sprache AMX und der syntaktischen Klassen aus denen die
|
|
Teile der AMX-Anweisungen gebildet werden. Die einzelnen
|
|
Anweisungen werden ebenfalls hier erlaeutert.
|
|
|
|
Kennzeichnung der AMX-Anweisungen
|
|
|
|
Alle AMX-Anweisungen beginnen mit "##" am Zeilenanfang. Nur
|
|
diese Anweisungen werden im folgenden behandelt. Alle an-
|
|
deren Anweisungen sind "C"-Anweisungen die den Regeln des
|
|
"C"-Compilers unterliegen.
|
|
|
|
Die erste AMX-Anweisung im Programm
|
|
|
|
Die erste AMX-Anweisung in einem AMX-Programm muss das Ero-
|
|
effnen einer Datenbank sein.
|
|
|
|
Ist keine Sperrung der Datenbank vorgesehen, ist die Anwei-
|
|
sung:
|
|
|
|
## nolock [ flags ] dbname [ with deadlock ]
|
|
|
|
zu verwenden.
|
|
|
|
Soll eine Datenbank alleinig benutzt werden, sind die Anwei-
|
|
sungen:
|
|
|
|
## daba [ flags ] dbname [ with deadlock ]
|
|
|
|
oder
|
|
|
|
## exclusive [ flags ] dbname [ with deadlock ]
|
|
|
|
zu benutzen.
|
|
|
|
Bei geteilter Nutzung ist:
|
|
|
|
## shared [ flags ] dbname [ with deadlock ]
|
|
|
|
zu verwenden.
|
|
|
|
Die wahlweisen Flags haben folgende Bedeutung:
|
|
|
|
-uname Erlaubt es, sich als Nutzer mit dem Login-Namen
|
|
name auszugeben. Das AMX-Programm arbeitet dann
|
|
mit den Datenbankbefugnissen des entsprechenden
|
|
Nutzers. Nur der DBA und der DABA-
|
|
Systemverantwortliche duerfen dieses Flag benut-
|
|
zen.
|
|
|
|
+bufno Ist die Spezifikation zusaetzlich verfuegbaren
|
|
DABA-Puffer. Normalerweise werden nur insgesamt
|
|
drei Puffer bereitgestellt. Bei paralleler Arbeit
|
|
mit mehreren Relationen (Indexrelationen muessen
|
|
mit gezaehlt werden!), sollte jeder Relation
|
|
mindestens ein Puffer zugeordnet werden. Empfeh-
|
|
lenswert sind zwei Puffer pro Relation.
|
|
|
|
Die Spezifikation with deadlock bedeutet, dass Deadlocks
|
|
(Totsperren) auftreten koennen, die der Nutzer selbst abfan-
|
|
gen will.
|
|
|
|
Kommentar
|
|
|
|
Kommentare sind innerhalb von AMX-Anweisungen in der C-
|
|
ueblichen Notation zugelassen und duerfen nicht geschachtelt
|
|
werden:
|
|
|
|
## . . . /* Kommentar */ . . .
|
|
|
|
|
|
|
|
|
|
Deklaration von C-Variablen
|
|
|
|
"C"-Variable, die in einer AMX-Anweisung verwendet werden
|
|
sollen, sind unbedingt durch "##" zu kennzeichnen. Folgende
|
|
"C"-Typen werden unterstuetzt:
|
|
|
|
- short
|
|
- int
|
|
- long
|
|
- float
|
|
- double
|
|
- char *
|
|
- char []
|
|
|
|
|
|
Ausserdem sind die DABA-Typen i1, i2, i4, f4 und f8 zugelas-
|
|
sen.
|
|
|
|
Folgende Speicherklassen werden unterstuetzt:
|
|
|
|
- auto
|
|
- extern
|
|
- static
|
|
|
|
|
|
Relationseroeffnung
|
|
|
|
Die Anweisung:
|
|
|
|
## open relation
|
|
|
|
eroeffnet die Relation relname fuer die weitere Verarbei-
|
|
tung.
|
|
Die Relation relname muss eine Primaer- bzw. Basisrelation
|
|
sein, d.h. es ist nicht moeglich, explizit eine Indexrela-
|
|
tion zu eroeffnen.
|
|
|
|
Durch die open Anweisung werden automatisch alle zur Rela-
|
|
tion gehoerigen Indizes miteroeffnet.
|
|
Die Relation relname darf keine Sicht (View) sein, und es
|
|
duerfen keine Integritaetsbedingungen bzw. nur operationelle
|
|
Befugnisse (append, replace, retrieve, delete oder all) ohne
|
|
jede Qualifikation auf ihr definiert sein. Die Systemkata-
|
|
loge relation , attribute und indexes werden durch den Start
|
|
eines AMX-Programms automatisch eroeffnet. Sie duerfen vom
|
|
Nutzer nicht explizit eroeffnet werden.
|
|
Recherchen sind auf alle Relationen zugelassen, d.h. auf
|
|
Basis-, Indexrelationen und Katalogen.
|
|
Aenderungen und Einfuegungen sind nur auf Basisrelationen
|
|
zulaessig, fuer die das Programm die Aenderungsbefugnis (de-
|
|
lete, append, replace) hat.
|
|
|
|
## close relname
|
|
|
|
Die close Anweisung schliesst die Relation relname fuer die
|
|
weitere Verarbeitung. Es koennen nur Relationen geschlossen
|
|
werden, die zuvor durch die open Anweisung eroeffnet wurden.
|
|
Die Beendigung eines Programms ( exit ) schliesst automati-
|
|
sch alle eroeffneten Relationen und Kataloge.
|
|
|
|
## tuplecount relname c_var
|
|
|
|
Die tuplecount-Anweisung weist der C-Variable c_var als Wert
|
|
die Anzahl der Tupel der Relation relname zu. C_var muss
|
|
von numerischem Typ und als long (oder besser i4 ) definiert
|
|
worden sein.
|
|
|
|
## tuplelength relname c_var
|
|
|
|
Die tuplelength-Anweisung weist der C-Variablen c_var als
|
|
Wert die Laenge eines Tupels zu und sollte als short ( oder
|
|
besser als i2 ) definiert sein.
|
|
|
|
|
|
|
|
Die Anzahl der Tupel einer Relation und ihre Laenge sind die
|
|
einzigen verfuegbaren variablen Kataloginformationen fuer
|
|
ein AMX-Programm. Auf Umwegen kann so die Anzahl der Aende-
|
|
rungen in einer Relation bestimmt werden:
|
|
|
|
. . .
|
|
## long old, new;
|
|
. . .
|
|
## tuplecount rel old
|
|
{ Neueinfuegungen }
|
|
## tuplecount rel new
|
|
printf("# of updates", new - old);
|
|
. . .
|
|
|
|
Ergebnisliste
|
|
|
|
In der retrieve, der replace und der append Anweisung kann
|
|
eine Domaenenauswahl in Form einer target_list (Ergebnis-
|
|
oder Zielliste) spezifiziert werden.
|
|
|
|
Die target_list ist eine durch Kommas separierte Liste von
|
|
Domaenenzuordnungen (dom_assign). Sie muss in runde Klam-
|
|
mern eingeschlossen werden und mindestens eine Domaenenspe-
|
|
zifikation enthalten.
|
|
|
|
Eine Domaenenzuordnung der Ergebnisliste besteht aus:
|
|
|
|
$domname = value.
|
|
|
|
Sie weist der Domaene domname den Wert value zu. Dabei
|
|
kennzeichnet das Dollar-Zeichen $ den Domaenennamen.
|
|
Als domname kann auch eine Domaenennummer ( attid des attri-
|
|
bute Kataloges) spezifiziert werden.
|
|
Bei den Zuweisungen von numerischen zu numerischen Typen
|
|
werden die notwendigen Konvertierungen ohne Ueberlauf- bzw.
|
|
Unterlaufkontrolle vorgenommen.
|
|
Zuweisungen von numerischen zu Zeichenkettenwerten und um-
|
|
gekehrt sind nicht zulaessig.
|
|
Durch die explizite Kennzeichnung von Domaenennamen durch
|
|
das Zeichen "$" werden im Gegensatz zu EQL Konflikte mit dem
|
|
Namen von C-Variablen vermieden.
|
|
Die Referenzierung von Domaenen ueber ihre interne Nummer
|
|
(Reihenfolge vom create(ql)) kann sinnvoll bei einer vekto-
|
|
risierten Verarbeitung sein.
|
|
|
|
Ein Wert value kann der aktuelle Wert der C-Variablen c_var,
|
|
eine in C uebliche Konstante const oder eine Domaenenzuord-
|
|
nung sein. Ein Wert kann der aktuelle Wert der Domaene (Do-
|
|
maenenzuordnung) (gekennzeichnet durch das Dollarzeichen)
|
|
$domname sein. Diese Form des Wertes kann nur im Aktions-
|
|
teil der Recherche angegeben werden und setzt eine ueber-
|
|
geordnete retrieve Anweisung voraus, aus dem der Wert fuer
|
|
die Domaene domname geholt werden kann.
|
|
|
|
Die retrieve-Anweisung
|
|
|
|
|
|
## [ over over_relname ] retrieve ret_relname [ qual ] [ (
|
|
target_list ) ]
|
|
|
|
Die retrieve Anweisung zur Recherche ist die maechtigste
|
|
AMX-Anweisung, sie uebernimmt die Zugriffspfadoptimierung
|
|
und ermoeglicht eine rekursive Verarbeitung, da innerhalb
|
|
einer Recherche eine weitere Recherche aufgerufen werden
|
|
kann.
|
|
|
|
Die over Klausel gestattet die Zuweisung des Zugriffspfades
|
|
ueber die Relation over_relname fuer die Recherche und damit
|
|
die Ausschaltung der Zugriffspfadoptimierung im AMX-
|
|
Compiler.
|
|
|
|
Over_relname muss die wiederzufindende Relation selbst oder
|
|
ein Index von ret_relname sein. Ist over_relname ein Index
|
|
und wird durch die Selektion qual keinem Schluessel von
|
|
over_relname ein Wert zugewiesen, wird der Zugriffspfad ue-
|
|
ber die Primaerrelation rel_relname gewaehlt, da eine Re-
|
|
cherche ueber die gesamte Relation und ueber einen Index un-
|
|
sinning ist.
|
|
|
|
Die retrieve Klausel ( retrieve ret_relname ) adressiert die
|
|
zu suchende Relation ret_relname.
|
|
|
|
Qualifikation
|
|
|
|
Die Recherche kann durch eine Qualifikation qual als Spezi-
|
|
fikation einer Selektion eingeschraenkt werden, wodurch die
|
|
relevanten Tupel selektiert werden.
|
|
Die Selektion ist eine Einschraenkung des Wertebereichs ein-
|
|
zelner (oder aller) Domaenen.
|
|
Mehrere Einschraenkungen werden durch "and" getrennt.
|
|
Eine Qualifikation qual hat maximal zwei Klausel pro Doma-
|
|
enenname. Eine Klausel besteht aus einer Domaenenspezifika-
|
|
tion (einem Domaenennamen domname, gekennzeichnet durch ein
|
|
Dollarzeichen "$" davor), einem Vergleichsoperator und einem
|
|
Wert value. Domname gibt die einzuschraenkende Domaene und
|
|
value den Wert der Einschraenkung an. Fuer die Spezifika-
|
|
tion von value gilt das in "Ergebnisliste" dargelegte.
|
|
|
|
|
|
|
|
Es sind die Vergleichsoperatoren:
|
|
|
|
"=", "==", "<", "<=", ">", ">=", "!="
|
|
|
|
zulaessig.
|
|
Wird eine Domaene doppelt eingeschraenkt, sind folgende zu-
|
|
laessige Kombinationen zu beachten:
|
|
|
|
"<[=]" und ">[=]"
|
|
"<[=]" und "!="
|
|
">[=]" und "!="
|
|
|
|
Die Reihenfolge der Einschraenkungen fuer eine Domaene ist
|
|
in folgender Art einzuhalten:
|
|
|
|
"<[=]" --> ">[=]" --> "!="
|
|
|
|
Alle zugewiesenen Bedingungen und Werte der angebenen Ein-
|
|
schraenkungen werden beim Einlauf in die Recherche gekel-
|
|
lert, sodass z.B. eine Aenderung des Wertes einer verwende-
|
|
ten C-Variablen keinen Einfluss auf die Selektion hat.
|
|
|
|
|
|
|
|
|
|
Ergebnisliste der retrieve-Anweisung
|
|
|
|
Die Ergebnisliste ( target_list ) zur Spezifikation der Do-
|
|
maenenauswahl (Projektionsoperation des DBBS) ist wahlweise.
|
|
|
|
Aktion
|
|
|
|
Die Aktion, die bei jedem gefundenen Tupel duchlaufen werden
|
|
soll, ist durch den Einschluss der ##{ und der ##} Anweisun-
|
|
gen, die unmittelbar der ## retrieve Anweisung folgen soll-
|
|
ten, zu spezifizieren. Zwischen diesen Anweisungen koennen
|
|
beliebige AMX-Anweisungen und C-Anweisungen stehen. Die Ak-
|
|
tion kann leer sein, allerdings muessen die Klammern ange-
|
|
geben sein.
|
|
Es ist wichtig zu wissen, dass innerhalb der Aktion die Do-
|
|
maenenwerte des gefundenen Tupel immer vorhanden sind und
|
|
sich nicht aendern.
|
|
Eine Aktion fuer ein Tupel kann vorzeitig beendet werden.
|
|
Es ist moeglich, durch die Anweisung
|
|
|
|
## nextretrieve
|
|
|
|
zur Verabeitung des naechsten Tupels ueberzugehen oder durch
|
|
|
|
## endretrieve
|
|
|
|
die Aktion (Recherche) zu beenden.
|
|
|
|
Variablenzuweisung
|
|
|
|
Eine Zuweisung weist der C-Variablen c_var den aktuellen
|
|
Wert der Domaene domname zu.
|
|
|
|
c_var = $domname
|
|
|
|
Bei den Zuweisungen von numerischen zu numerischen Typen
|
|
werden die notwendigen Konvertierungen ohne Ueberlauf-
|
|
bzw. Unterlaufkontrolle vorgenommen.
|
|
Zuweisungen von numerischen zu Zeichenkettenwerten und um-
|
|
gekehrt sind nicht zulaessig.
|
|
|
|
Die print-Anweisung
|
|
|
|
## print ([{ domname }])
|
|
|
|
Die print-Anweisung gibt die Werte der, durch eine oeffnende
|
|
"(" und eine schliessende runde Klammer ")", begrenzten Li-
|
|
ste der Domaenen in einem Standardformat nach Standardoutput
|
|
aus.
|
|
Die Liste enthaelt eine durch Kommas "," getrennte Aufza-
|
|
ehlung der auszugebenden Domaenen. Eine leere Liste "()"
|
|
gibt die Werte aller Domaenen aus.
|
|
|
|
Das Standardformat enthaelt den Namen und den Wert der Doma-
|
|
ene in folgender Form:
|
|
|
|
"%12s: %?\n", domname, value
|
|
|
|
? == Format der auszugebenden Domaene
|
|
|
|
Die delete-Anweisung
|
|
|
|
## delete
|
|
|
|
Eine delete-Anweisung loescht das innerhalb der laufenden
|
|
Recherche gefundene aktuelle Tupel aus der Relation. In-
|
|
nerhalb der Aktion bleibt das aktuelle Tupel mit seinen Wer-
|
|
ten erhalten.
|
|
Eventuell vorhandene Indizes werden automatisch aktuali-
|
|
siert.
|
|
|
|
Die replace-Anweisung
|
|
|
|
## replace (target_list)
|
|
|
|
Die replace Anweisung gestattet die Aenderung von Werten
|
|
einzelner (oder aller) Domaenen eines wiedergefundenen Tu-
|
|
pels.
|
|
Eine Unterscheidung von Schluessel- und Nichtschluesseldoma-
|
|
enen ist nicht zu beachten.
|
|
Die Aenderungen werden durch die Projektions target_list
|
|
spezifiziert.
|
|
|
|
Es ist zu beachten, dass die Aenderungen in einem gesonder-
|
|
tem Puffer ausgefuehrt werden, das aktuell gefundene Tupel
|
|
also innerhalb der Aktion unveraendert bleibt.
|
|
Eventuell vorhandene Indizes werden, falls noetig, auto-
|
|
matisch aktualisiert. Eine Aktualsierung entfaellt z.B.,
|
|
wenn eine identische Aenderung (geaendertes == Ursprungstu-
|
|
pel) ausgefuehrt wurde oder wenn die geaenderten Domaenen
|
|
nicht Bestandteil des Index sind und sich die Tupeladresse
|
|
TID nicht geaendert hat.
|
|
|
|
Die append-Anweisung
|
|
|
|
## append [ relname ] (target-list)
|
|
|
|
Die append Anweisung mit der Spezifikation relname fuegt ein
|
|
neues Tupel in die Relation relname ein. Die nicht in der
|
|
target_list spezifizierten Domaenen der Relation relname
|
|
werden mit einem Nullwert initialisiert, alle numerischen
|
|
Domaenen bekommen den Wert 0.
|
|
Den Zeichenkettendomaenen wird eine mit Leerzeichen gefuell-
|
|
te Zeichenkette zugewiesen.
|
|
|
|
Die append Anweisung ohne relname fuegt ein neues Tupel in
|
|
die Relation ein. Sie kann nur innerhalb einer Recherche ge-
|
|
nutzt werden. Durch die Projektion target_list werden den
|
|
aufgefuehrten Domaenen Werte zugewiesen.
|
|
Alle nicht angebenen Domaenen erhalten den Wert aus dem ak-
|
|
tuell gefundenen Tupel der laufenden Recherche.
|
|
|
|
Es ist zu beachten, dass die Aenderungen in einem gesonder-
|
|
ten Puffer ausgefuehrt werden, also das aktuell gefundene
|
|
Tupel unveraendert bleibt. Eventuell vorhandene Indizes
|
|
werden automatisch aktualisiert.
|
|
|
|
Arbeit mit Transaktionen
|
|
|
|
Zur Arbeit mit Transaktionen stehen die AMX-Anweisungen use,
|
|
commit, abort und if (deadlock) bereit.
|
|
|
|
## use ( use_rel [, ...] )
|
|
|
|
Use spezifiziert den Beginn einer Transaktion. den Beginn
|
|
einer Transaktion. Use_rel wird wie folgt angegeben:
|
|
|
|
[ exclusive | shared | nolock | + ] relname [
|
|
|
|
with [ level = page | table ]
|
|
|
|
[ readlock = exclusive | shared | nolock ]
|
|
|
|
[ maxlock = int ]
|
|
|
|
[ timeout = int ] ]
|
|
|
|
Exclusive oder + bedeuten exklusive (alleinige), das Weglas-
|
|
sen oder shared eine geteilte Benutzung. Die geteilte Be-
|
|
nutzung und nolock (kein Sperren) sind nur fuer Leseopera-
|
|
tionen, exklusive Benutzung fuer Schreiboperationen anwend-
|
|
bar.
|
|
|
|
Level kennzeichnet das Sperrniveau page (Seitensperren) oder
|
|
table (Relationsperren).
|
|
|
|
Readlock ist nur fuer Leseoperationen anwendbar und kenn-
|
|
zeichnet die Art der Lesesperren.
|
|
|
|
|
|
Maxlock spezifiziert die maximale Anzahl der Sperren ( -1 :
|
|
unbegrenzt) und timeout die Zeit (in Sekunden), bis eine
|
|
Rueckkehr vom DBBS erfolgt sein muss ( - 1 : warten, bis
|
|
verfuegbar).
|
|
|
|
Nur, wenn beim Eroeffnen der Datenbank with deadlock spezi-
|
|
fiziert wurde, sind die folgenden Anweisungen nutzbar.
|
|
|
|
## if ( bd deadlock ) { stmt_list }
|
|
|
|
Mit dieser Anweisung kann abgetestet werden, ob ein Deadlock
|
|
aufgetreten ist. Diese Anweisung ist unmittelbar nach use,
|
|
retrieve, append, replace oder delete anzuordnen. Wenn ein
|
|
Deadlock aufgetreten ist, wird die Anweisungsfolge stmt_list
|
|
abgearbeitet werden, was i.allg. die Anweisung abort sein
|
|
wird.
|
|
|
|
## abort
|
|
|
|
Diese Anweisung beendet eine Transaktion zwangsweise und
|
|
setzt die Datenbank auf den Stand vor Beginn der Transaktion
|
|
zurueck.
|