This commit is contained in:
Oliver Lehmann 1989-10-25 05:38:54 +00:00
parent be1ca80d22
commit 240e81e137
1 changed files with 575 additions and 0 deletions

View File

@ -0,0 +1,575 @@
.th CL \*(RR 3.10.89 4
.sh UEBERSICHT
Die Abbildung von \*(RR Da\%ten\%banken
auf Relationen in \*(II Da\%ten\%banken
und umgekehrt wird formal durch
die Da\%ten\%bank\%ver\%bindungssprache
CL (Connection Language) definiert.
Die CL Syntax ist einfach
und schnell zu erlernen.
Die Da\%ten\%bankverbindungssprache CL
ist eine zei\%len\%orientierte Spra\%che,
die formal (Syntax)
und informal (Semantik) ein\%ge\%f\*uhrt wird.
.br
CL Pro\%gram\%me werden in DBI
(Data Bases Interface)
Textfiles ab\%ge\%legt,
die interpretierend von
CDB(\*(RR),
RDB(\*(RR) und
WDB(\*(RR) abgearbeitet werden.
.br
DBI-Textfiles k\*onnen mit einem
\*(UU Texteditor erstellt bzw. ge\*andert werden.
Bei der Erstellung kann
DB(\*(RR) eine zeitersparende Hilfe sein.
.sh SYNTAX
Die formale Beschreibung erfolgt in Form von Regeln (R).
Die rechte Seite der Regel gibt den Regelname an
und die linke Seite die Regelaufl\*osung.
Beide Seiten werden durch das Zeichen : getrennt.
Regelnamen werden immer mit klei\%nen,
nicht weiter aufgel\*oste Konstanten
immer mit gro\*sen Buch\%sta\%ben geschrieben.
Alle Regeln (und Alternativen) wer\%den durchnummeriert,
um einfache Bez\*uge herstellen zu k\*on\%nen.
.s1
.lp +8 8
(R\ 1) CL\ \ \ \ \ \ \ \ \ \ \ :\ {line}
.i0
.s1
R1 besagt,
da\*s die CL aus einer nicht leeren Menge ({})
von Zeilen (line) besteht.
Die geschweiften Klammern sind syn\%tak\%tische Metasymbole,
die eine 1 bis n-malige Wie\%der\%holung angeben.
Der Name line ist ein Regelname,
also durch wei\%te\%re Regeln noch aufzul\*osen.
.s1
.lp +8 8
(R\ 2) line\ \ \ \ \ \ \ \ \ :\ NL
.lp +8 8
(R\ 3) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ dbi_line
.i0
.s1
Eine Zeile kann leer sein
(R2: nur aus dem Zeichen NL be\%ste\%hend;
NL ist eine Konstante,
die das Zeilenendezeichen (newline) repr\*asentiert)
oder eine Schnitt\%stel\%len\%de\%fi\%ni\%tions\%zeile
(R3: dbi_line) sein.
Die Alternative wird durch das syntaktische Metazeichen |
am Anfang von R3 dargestellt.
Leerzeilen k\*onnen \*uberall stehen
und sollen daher nicht weiter betrachtet werden.
Schnittstellendefinitioszeilen wer\%den der Einfachheit halber
im folgendem Zeilen genannt.
Alle Zeilen haben einen allgemeinen Aufbau.
Sie d\*urfen maximal 255 Zeichen lang sein
und beginnen mit einem Zei\%len\%kennzeichen
gefolgt von einer Menge von Fel\%dern,
die durch ei\%nen Seperator (sep)
voneinander getrennt sind.
.s1
.lp +8 8
(R\ 4) sep\ \ \ \ \ \ \ \ \ \ :\ {space}
.lp +8 8
(R\ 5) space\ \ \ \ \ \ \ \ :\ TAB\ |\ BLANK
.i0
.s1
Ein Seperator kann aus vielen (R4)
Tabulatoren oder Leer\%zei\%chen (R5)
in beliebiger Reihenfolge gebildet werden.
.s1
Es werden 8 verschiedene Zeilentypen unterschieden:
.s1
.lp +8 8
(R\ 6) dbi_line\ \ \ \ \ :\ comment_line
.lp +8 8
(R\ 7) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ dbd_line
.lp +8 8
(R\ 8) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ field_line
.lp +8 8
(R\ 9) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ db_line
.lp +8 8
(R10) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ tab_line
.lp +8 8
(R11) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ dom_line
.lp +8 8
(R12) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ ref_line
.lp +8 8
(R13) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ cmd_line
.i0
.s1
.lp +8 8
(R14) comment_line\ :\ ':'\ sep\ COMMENT\ NL
.i0
.s1
Die Konstante ':' stellt das Zeichen : dar,
sie ist das Zei\%len\%kenn\%zei\%chen der Kommentarzeile
(R14: comment_line).
Die Konstante COM\%MENT ist ein beliebiger Kommentartext,
der durch den Seperator sep vom Zeilenkennzeichen zu trennen ist
und durch das Zeilenendezeichen NL beendet wird.
Kom\%men\%tar\%zeilen k\*onnen \*uberall stehen
und sollen daher nicht weiter betrachtet werden.
.s1
.lp +8 8
(R15) dbd_line\ \ \ \ \ :\ '2'\ |\ '3'\ sep\ DBD_NAME\ NL
.i0
.s1
Eine \*(RR Da\%ten\%bank\%zeile
(R15: dbd_line)
wird durch die \*(RR Versionsnummer
(2 f\*ur \*(R2
bzw. 3 f\*ur \*(R3/4)
als Zeilenkennzeichen eingeleitet,
sie hat ein Feld.
.br
Das Feld DBD_NAME ist der
\*(UU Filename der \*(RR Da\%ten\%bank.
.s1
Die angegebene Da\%ten\%bank mu\*s
zur Abarbeitungszeit von DB(\*(RR) und RDB(\*(RR)
im \*(UU Filesystem existieren.
.s1
.lp +8 8
(R16) field_line\ \ \ :\ 'F'\ sep\ F_NO\ sep\ F_NAME\ sep\ F_TYP
.lp +8 8
\ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ [sep\ F_DEC]\ NL
.i0
.s1
Eine (\*(RR) Feldzeile
(R16: field_line)
wird durch das Zeilenkennzeichen F eingeleitet,
sie hat 3 oder 4 Felder.
.br
Das Feld F_NO ist die Nummer des \*(RR Feldes,
sie darf zwischen 0 .. Feldanzahl-1 der Da\%ten\%bank liegen.
.br
Das Feld F_NAME ist der Name des \*(RR Feldes,
er darf aus dem Zei\%chen\%satz [A-Z:0-9] gebildet werden
und maximal 10 Zeichen lang sein.
.br
Das Feld F_TYP ist die Typ-/L\*angenangabe des \*(RR Feldes.
.br
Das Feld F_DEC ist die Anzahl der Dezimalstellen des \*(RR Feldes.
Ist F_DEC==0,
kann die Angabe des Feldes entfallen
(die Metazeichen [] geben die wahlweise Verwendung
der syn\%tak\%tischen Konstruktion an).
.s1
Folgende Wer\%te f\*ur F_TYP und F_DEC sind zul\*assig:
.s1
.in 13
.nf
F_TYP F_DEC
-------------------------------------------
Cl 0 0 < l < 255
D8 0
I4 0 nur f\*ur \*(RR Satznummer
L1 0
M10 0 nur \*(R3/4
Nl d 0 <= d < l < 21
.fi
.i0
.s1
Das Feld F_NO==0 ist die \*(RR Satznummer,
ein Feld das we\%der im \*(RR Datensatz
noch in den \*(RR Feld\%de\%fi\%ni\%tionen erscheint.
Dieses Feld mu\*s den Namen F_NAME==#
und den in\%ter\%nen Da\%ten\%typ F_TYP==I4
(32-bit Integer) erhalten.
.br
Das Feld F_NO==1 ist die \*(RR L\*oschmarkierung,
ein Feld das im \*(RR Datensatz,
nicht aber in den \*(RR Feld\%de\%fi\%ni\%tionen erscheint.
Dieses Feld mu\*s den Namen F_NAME==*
und den Da\%ten\%typ F_TYP==C1 erhalten.
.br
Beide Felder sind imagin\*are Felder,
die aber in beiden Rich\%tun\%gen \*ubernommen werden k\*onnen.
Die eigentlichen \*(RR Felder beginnen
also mit der Nummer F_NO==2.
.s1
Das angegebene Feld mu\*s
zur Abarbeitungszeit von DB(\*(RR) und RDB(\*(RR)
in der \*(RR Da\%ten\%bank
mit den gleichen Werten f\*ur F_NO, F_TYP und F_DEC existieren.
.s1
.lp +8 8
(R17) db_line\ \ \ \ \ \ :\ 'I'\ sep\ DB_NAME\ NL
.i0
.s1
Eine \*(II Da\%ten\%bank\%zeile
(R17: db_line)
wird durch das Zeilenkennzeichen I eingeleitet,
sie hat ein Feld.
.br
Das Feld DB_NAME ist der Name der \*(II Da\%ten\%bank,
er darf aus dem Zei\%chen\%satz [a-z_0-9] gebildet werden
und maximal 12 Zeichen lang sein.
.s1
Die angegebene Da\%ten\%bank mu\*s
zur Abarbeitungszeit von CDB(\*(RR),
RDB(\*(RR) und WDB(\*(RR)
im \*(II System existieren.
.s1
.lp +8 8
(R18) tab_line\ \ \ \ \ :\ 'T'\ sep\ TAB_NAME\ NL
.i0
.s1
Eine (\*(II) Tabellenzeile
(R18: tab_line)
wird durch das Zeilenkennzeichen T eingeleitet,
sie hat ein Feld.
.br
Das Feld TAB_NAME ist der Name der \*(II Tabelle (Re\%la\%tion),
er darf aus dem Zei\%chen\%satz [a-z_0-9] gebildet werden
und maximal 12 Zeichen lang sein.
.s1
Die angegebene Relation mu\*s
zur Abarbeitungszeit von RDB(\*(RR) und WDB(\*(RR)
in der \*(II Da\%ten\%bank existieren.
.s1
.lp +8 8
(R19) dom_line\ \ \ \ \ :\ 'D'\ sep\ D_NO\ sep\ D_NAME\ sep\ D_TYP\ NL
.i0
.s1
Eine (\*(II) Dom\*anzeile
(R19: dom_line)
wird durch das Zeilenkennzeichen D eingeleitet,
sie hat 3 Felder.
.br
Das Feld D_NO ist die Nummer der \*(II Dom\*ane,
sie darf zwischen 1 .. Dom\*ananzahl der Relation liegen.
.br
Das Feld D_NAME ist der Name der \*(II Dom\*ane,
er darf aus dem Zei\%chen\%satz [a-z_0-9] gebildet werden
und maximal 12 Zeichen lang sein.
.br
Das Feld D_TYP ist die Typ-/L\*angenangabe der \*(II Dom\*ane.
.br
.s1
Folgende Wer\%te f\*ur D_TYP sind zul\*assig:
.s1
.in 13
.nf
D_TYP
-------------------------------------------
cn 0 < n < 256
fn n==4 || n==8
in n==1 || n==2 || n==4
.fi
.i0
.s1
Die angegebene Dom\*ane mu\*s
zur Abarbeitungszeit von RDB(\*(RR) und WDB(\*(RR)
in der \*(II Relation
mit den gleichen Werten f\*ur D_NO und D_TYP existieren.
.s1
.lp +8 8
(R20) ref_line\ \ \ \ \ :\ '@'\ sep\ F_NO\ sep\ D_NO\ NL
.i0
.s1
Eine Zuordnungszeile
(R20: ref_line)
wird durch das Zei\%len\%kennzeichen @ eingeleitet,
sie hat 2 Felder.
.br
Das Feld F_NO ist die Nummer des \*(RR Feldes,
sie darf zwischen 0 .. Feldanzahl-1 der Da\%ten\%bank liegen.
.br
Das Feld D_NO ist die Nummer der \*(II Dom\*ane,
sie darf zwischen 1 .. Dom\*ananzahl der Relation liegen.
.br
Die Zuordnungszeile definiert,
welches \*(RR Feld
in welche \*(II Dom\*ane geladen werden soll
und umgekehrt.
Hinter den \*(RR Feldern und \*(II Dom\*anen
verbergen sich Werte, die umgeladen werden sollen.
Diese Werte sind allgemein als Typen
(F_TYP/F_DEC und D_TYP) definiert,
Folgende Typ\%zu\%ord\%nun\%gen wer\%den unterst\*utzt:
.s1
.in 13
.nf
\*(RR \*(II
----------------------------------------------------
Cl (0 < l < 255) cn (0 < n < 256)
D c8
L c1
Nl.d (0 <= d < l < 21) i1 || i2 || i4 || f4 || f8
M (nur \*(R3/4) keine Zuordnung m\*oglich
I4 (Satznummer) i4
C1 (Loeschmarkierung) c1
.fi
.i0
.s1
Bei der Zuordnung von \*(RR Feldern
zu \*(II Dom\*anen gilt,
da\*s jeweils nur ein Feld einer Dom\*ane zugewiesen wer\%den kann.
.s1
.lp +8 8
(R21) cmd_line\ \ \ \ \ :\ 'R'\ sep\ COMMAND\ NL
.lp +8 8
(R22) \ \ \ \ \ \ \ \ \ \ \ \ \ |\ 'W'\ sep\ COMMAND\ NL
.i0
.s1
Eine Kom\%man\%do\%zei\%le
(R21|R22: cmd_line)
wird entweder durch das Zei\%len\%kennzeichen R
oder W eingeleitet,
sie hat 1 Feld.
.br
Das Feld COMMAND ist der Kom\%man\%do\%text,
des auszuf\*uhrenden Kom\%man\%dos.
.br
Die R-Kom\%man\%do\%zei\%len (R21)
werden durch RDB(\*(RR)
und die W-Kom\%man\%do\%zei\%len (R22)
durch WDB(\*(RR) ausgef\*uhrt.
.sh SEMANTIK
Die bisherige Syntax mu\*s
um die Regeln der Reihenfolge
der verschiedenen Zeilen erweitert werden.
.br
Die informale Beschreibung erfolgt in Form von Regeln (S).
.br
Wie schon bekannt,
k\*onnen Leer- und Kommentarzeilen
an al\%len Stellen des DBI-Textfiles eingef\*ugt werden,
wo Zeilen stehen d\*urfen.
Sie sollen bei der Darstellung der se\%man\%tischen Regeln
nicht mehr erw\*ahnt werden.
.s1
.lp +8 8
(S\ 1) DBI\ \ \ \ \ \ \ \ \ \ :\ [before]\ \*(rr\ \*(ii\ [after]
.i0
.s1
Ein DBI-Text gliedert sich in 4 Abschnitte:
.lp +16 8
before Kom\%man\%do\%teil vor der Konvertierung (S2)
.lp +16 8
\*(rr \*(RR Da\%ten\%bank\%teil (S3)
.lp +16 8
\*(ii \*(II Da\%ten\%bank\%teil (S5)
.lp +16 8
after Kom\%man\%do\%teil nach der Konvertierung (S9)
.i0
Die Kom\%man\%do\%teile vor bzw. nach der Konvertierung sind wahl\%weise,
d.h. sie k\*onnen entfallen.
.s1
.lp +8 8
(S\ 2) before\ \ \ \ \ \ \ :\ {cmd_line}
.i0
.s1
Der Kom\%man\%do\%teil vor der Konvertierung
besteht aus einer be\%liebigen Menge
von R-Kom\%man\%do\%zei\%len (R21) bzw.
W-Kom\%man\%do\%zei\%len (R22).
.br
Die R-Kom\%man\%do\%zei\%len (R21)
werden durch RDB(\*(RR)
und die W-Kom\%man\%do\%zei\%len (R22)
durch WDB(\*(RR) ausgef\*uhrt.
Ein Kommando kann ein Programm mit Argumenten
oder eine shell-Prozedur mit Argumenten sein.
.br
In DB(\*(RR) sind Beispiele zur Verwendung
des Kom\%man\%do\%teils angegeben.
.s1
.lp +8 8
(S\ 3) \*(rr\ \ \ \ \ \ :\ dbd_line\ fields
.i0
.s1
Der \*(RR Da\%ten\%bank\%teil beschreibt vollst\*andig
die \*(RR Da\%ten\%bank.
Sie wird durch eine \*(RR Da\%ten\%bank\%zei\%le (R15: dbd_line)
und den Feldteil (S4: fields) definiert.
.s1
.lp +8 8
(S\ 4) fields\ \ \ \ \ :\ {field_line}
.i0
.s1
Die \*(RR Felder werden durch
eine Menge von Feldzeilen (R16: field_line) definiert.
.s1
.lp +8 8
(S\ 5) \*(ii\ \ \ \ \ \ \ \ \ :\ db_line\ {relation}
.i0
.s1
Der \*(II Da\%ten\%bank\%teil beschreibt vollst\*andig
die \*(II Da\%ten\%bank.
Sie wird durch eine \*(II Da\%ten\%bank\%zei\%le (R17: db_line)
und eine Menge von (\*(II) Ta\%bel\%len\%tei\%len (S6: relation) definiert.
Jeder Ta\%bel\%len\%tei\%l be\%schreibt genau eine \*(II Relation.
Es sind maximal 5 Ta\%bel\%len\%tei\%le zul\*assig.
.s1
.lp +8 8
(S\ 6) relation\ \ \ \ \ :\ tab_line\ doms\ refs
.i0
.s1
Der (\*(II) Ta\%bel\%len\%tei\%l beschreibt vollst\*andig
eine \*(II Relation.
Sie wird durch eine Tabellenzeile (R18: tab_line),
den Dom\*anteil(S7: doms)
und den Zuordnungsteil (S8: refs) definiert.
.s1
.lp +8 8
(S\ 7) doms\ \ \ \ \ \ \ \ \ :\ {dom_line}
.i0
.s1
Die \*(II Dom\*anen werden durch
eine Menge von Dom\*anzeilen (R19: dom_line) definiert.
.s1
.lp +8 8
(S\ 8) refs\ \ \ \ \ \ \ \ \ :\ {ref_line}
.i0
.s1
Die Zuordnungen werden durch
eine Menge von Zuordnungszeilen (R20: ref_line) definiert.
.s1
.lp +8 8
(S\ 9) after\ \ \ \ \ \ \ \ :\ {cmd_line}
.i0
.s1
Der Kom\%man\%do\%teil nach der Konvertierung
besteht aus einer be\%liebigen Menge
von R-Kom\%man\%do\%zei\%len (R21) bzw.
W-Kom\%man\%do\%zei\%len (R22).
.br
Die R-Kom\%man\%do\%zei\%len (R21)
werden durch RDB(\*(RR)
und die W-Kom\%man\%do\%zei\%len (R22)
durch WDB(\*(RR) ausgef\*uhrt.
Ein Kommando kann ein Programm mit Argumenten
oder eine shell-Prozedur mit Argumenten sein.
.br
In DB(\*(RR) sind Beispiele zur Verwendung
des Kom\%man\%do\%teils angegeben.
.bp
.sh BEISPIEL
Folgender DBI-Text soll die syntaktischen
und semantischen Regeln erl\*autern.
.s1
.nf
1 R echo START \*(R2 ==> \*(II
2 W echo START \*(II ==> \*(R2
3 2 pers.dbd
4 F 0 # I4
5 F 1 * C1
6 F 2 NUM N5
7 F 3 NAME C20
8 I \*(rr
9 T personal
10 D 1 num i2
11 D 2 name c20
12 @ 2 1
13 @ 3 2
14 R echo ENDE \*(R2 ==> \*(II
15 W echo ENDE \*(II ==> \*(R2
.fi
.s1
Folgend sollen alle Zeilen den
syntaktischen und semantischen Regeln zugeordnet werden:
.s1
.lp +12 12
Zeile\ \ 1-15 (S1) DBI-text
.s1
.lp +12 12
Zeile\ \ 1-\ 2 (S2) Kommandoteil vor der Konvertierung
.s1
.lp +12 12
Zeile\ \ \ \ \ 1 (R21) Kommando f\*ur RDB(\*(RR),
.br
gibt den Text "START \*(R2 ==> \*(II"
nach dem Start der Konvertierung aus.
.lp +12 12
Zeile\ \ \ \ \ 2 (R22) Kommando f\*ur WDB(\*(RR),
.br
gibt den Text "START \*(II ==> \*(R2"
nach dem Start der Konvertierung aus.
.s1
.lp +12 12
Zeile\ \ 3-\ 7 (S3) \*(RR Da\%ten\%bank\%teil
.s1
.lp +12 12
Zeile\ \ \ \ \ 3 (R15) \*(RR Da\%ten\%bank\%zeile,
f\*ur die \*(RR Da\%ten\%bank,
die sich in dem \*(UU file pers.dbd be\%fin\%det.
.s1
.lp +12 12
Zeile\ \ 4-\ 7 (S4) Feld\%teil
.s1
.lp +12 12
Zeile\ \ \ \ \ 4 (R16) Feldzeile,
f\*ur das Feld 0/# mit dem Typ I4
(\*(RR Satznummer).
.lp +12 12
Zeile\ \ \ \ \ 5 (R16) Feldzeile,
f\*ur das Feld 1/* mit dem Typ C1
(\*(RR L\*oschmarkierung).
.lp +12 12
Zeile\ \ \ \ \ 6 (R16) Feldzeile,
f\*ur das Feld 2/NUM mit dem Typ N5
(Angestelltennummer).
.lp +12 12
Zeile\ \ \ \ \ 7 (R16) Feldzeile,
f\*ur das Feld 3/NAME mit dem Typ C20
(Angestelltenname).
.s1
.lp +12 12
Zeile\ \ 8-13 (S5) \*(II Da\%ten\%bank\%teil
.s1
.lp +12 12
Zeile\ \ \ \ \ 8 (R17) \*(II Da\%ten\%bank\%zeile,
w\*ahlt die Da\%ten\%bank \*(rr aus.
.s1
.lp +12 12
Zeile\ \ 9-13 (S6) Tabellen\%teil
.s1
.lp +12 12
Zeile\ \ \ \ \ 9 (R18) Tabellen\%zeile
f\*ur die Relation personal der Da\%ten\%bank \*(rr.
.s1
.lp +12 12
Zeile\ 10-11 (S7) Dom\*an\%teil
.s1
.lp +12 12
Zeile\ \ \ \ 10 (R19) Dom\*anzeile,
f\*ur die Dom\*ane 1/num mit dem Typ i2
(Angestelltennummer).
.lp +12 12
Zeile\ \ \ \ 11 (R19) Dom\*anzeile,
f\*ur die Dom\*ane 2/name mit dem Typ c20
(Angestelltenname).
.s1
.lp +12 12
Zeile\ 12-13 (S8) Zuordnungs\%teil
.s1
.lp +12 12
Zeile\ \ \ \ 12 (R20) Zuordnungszeile,
korreliert das Feld 2 (NUM/N5)
mit der \*(II Dom\*ane 1 (num/i2).
.lp +12 12
Zeile\ \ \ \ 13 (R20) Zuordnungszeile,
korreliert das Feld 3 (NAME/C20)
mit der \*(II Dom\*ane 2 (name/c20).
.s1
.lp +12 12
Zeile\ 14-15 (S9) Kommandoteil nach der Konvertierung
.s1
.lp +12 12
Zeile\ \ \ \ 14 (R21) Kommando f\*ur RDB(\*(RR),
.br
gibt den Text "ENDE \*(R2 ==> \*(II"
nach dem Ende der Konvertierung aus.
.lp +12 12
Zeile\ \ \ \ 15 (R22) Kommando f\*ur WDB(\*(RR),
.br
gibt den Text "ENDE \*(II ==> \*(R2"
nach dem Ende der Konvertierung aus.
.i0