ING_DB
This commit is contained in:
parent
d3a00367c6
commit
964b85169c
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
|
@ -0,0 +1,544 @@
|
||||||
|
.ds RH \f3ZIP\f1
|
||||||
|
.ds LH Anwendung
|
||||||
|
.ds CH - % -
|
||||||
|
.bp
|
||||||
|
.LP
|
||||||
|
.NH 2
|
||||||
|
.ft B
|
||||||
|
Eingabegenerator ZIP
|
||||||
|
.br
|
||||||
|
- Vers. 2.1 *
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
.sp 10
|
||||||
|
.NH 3
|
||||||
|
.ft B
|
||||||
|
Einleitung
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
Der vorliegende Eingabegenerator ist den Bedingungen von
|
||||||
|
\*(xx\-Versionen angepasst, f\o'u"'r die eine
|
||||||
|
.ft B
|
||||||
|
termcap
|
||||||
|
.ft R
|
||||||
|
und das
|
||||||
|
Softwarepaket
|
||||||
|
.ft B
|
||||||
|
curses
|
||||||
|
.ft R
|
||||||
|
verf\o'u"'gbar sind.
|
||||||
|
Da ZIP als Hilfe f\o'u"'r die Eingabe und Anzeige von Daten
|
||||||
|
in der Umgebung von AMX- und EQUEL-Programmen entworfen wurde,
|
||||||
|
soll nachfolgend die Anwendung auch an solchen Beispielen
|
||||||
|
gezeigt werden.
|
||||||
|
.LP
|
||||||
|
Die Erstellung einer ZIP-Prozedur erfolgt in drei Schritten:
|
||||||
|
.IP 1.
|
||||||
|
Mit dem Editor wird eine Maske entworfen, die deckungsgleich
|
||||||
|
sp\o'a"'ter auf dem Bildschirm abzubilden ist. Variablenfelder
|
||||||
|
werden durch # eingeleitet, die Anzahl der nachfolgenden Zeichen
|
||||||
|
bis zum Leerzeichen bzw. Newline (auch EOF)
|
||||||
|
oder einem beliebigen Begrenzungszeichen
|
||||||
|
legt die Stelligkeit fest (einschliesslich #).
|
||||||
|
Bei Gleitkommazahlen bestimmt der Punkt die Konvertierungsvorschrift.
|
||||||
|
.IP 2.
|
||||||
|
Die Textmaske (Filename: vorgeschlagenes Postfix _m) wird
|
||||||
|
einschliesslich m\o'o"'glicher steuernder Flags
|
||||||
|
als Argument f\o'u"'r das Kommando
|
||||||
|
.ft B
|
||||||
|
zip
|
||||||
|
.ft R
|
||||||
|
angegeben und ein C-Quellfile generiert.
|
||||||
|
.IP 3.
|
||||||
|
Die Verbindung zwischen Maske und Variablen ergibt sich
|
||||||
|
aus dem Dialog. Die Flags -hp ziehen zus\o'a"'tzliche Fragen
|
||||||
|
f\o'u"'r Hilfen bzw. Pr\o'u"'fungen nach sich.
|
||||||
|
Der C-Compiler wird automatisch gerufen, bei Flag -l erfolgt
|
||||||
|
die Einordnung in eine Arbeits\%bib\%lio\%thek.
|
||||||
|
.LP
|
||||||
|
Bei Verwendung des Flag -z wird ein Zeilenoffset ausgegeben.
|
||||||
|
Er berechnet sich aus der Anzahl der Newlines + EOF im Ausgangsfile.
|
||||||
|
Mit diesem Offset soll der Entwurf des Gesamtbildes auf dem
|
||||||
|
Schirm kontrolliert werden.
|
||||||
|
.LP
|
||||||
|
Bevor eine ZIP-Prozedur im Programm genutzt werden kann, ist
|
||||||
|
die Initia\%lisie\%rungs\%prozedur
|
||||||
|
.ft B
|
||||||
|
initzip()
|
||||||
|
.ft R
|
||||||
|
zu rufen - sie
|
||||||
|
ini\%tiali\%siert auch die Verwendbarkeit der
|
||||||
|
.ft B
|
||||||
|
curses
|
||||||
|
.ft R
|
||||||
|
-Makros bzw.
|
||||||
|
Prozeduren. Die \o'u"'blichen Ausgaben zu stdout (printf, write,
|
||||||
|
putchar usw.) d\o'u"'rfen innerhalb des G\o'u"'ltigkeitsbereiches
|
||||||
|
des sogenannten "Standard-Screen" (stdscr) nicht verwendet
|
||||||
|
werden, weil dann Konsistenzprobleme auftreten.
|
||||||
|
Daf\o'u"'r stehen die curses-Makros (addstr(), addch()) zur
|
||||||
|
Verf\o'u"'gung.
|
||||||
|
.br
|
||||||
|
.ft B
|
||||||
|
Anmerkung:
|
||||||
|
.ft R
|
||||||
|
Zum Binden des gesamten Programmes (AMX, EQC u.a.) sind
|
||||||
|
die Bibliotheken libcurses.a und libzip.a einzu\%ziehen.
|
||||||
|
.LP
|
||||||
|
Die direkte Einordnung des Generators in das Datenbanksystem
|
||||||
|
unter Nutzung der System-Relation "attribute" ist
|
||||||
|
vorl\o'a"'ufig nicht geplant.
|
||||||
|
Die Praxis zeigt, dass die Eingabe und Korrektur aller
|
||||||
|
Dom\o'a"'nen in einem Menue die Ausnahme ist - als
|
||||||
|
weiteres Problem steht dann, in welcher Reihenfolge
|
||||||
|
die F\o'u"'hrungstexte den Spalten
|
||||||
|
zugeordnet werden sollten. Hierzu w\o'a"'re
|
||||||
|
wieder ein Dialog oder eine Zuordnung in der Phase des Editierens
|
||||||
|
der Maske notwendig.
|
||||||
|
Es ist in der Regel so, dass erst in Abh\o'a"'ngigkeit vom Wert des
|
||||||
|
Schl\o'u"'ssels entweder vom Programm oder vom
|
||||||
|
Bedienenden entschieden wird, wie sich der weitere
|
||||||
|
Ablauf gestaltet ("append", "replace" oder "delete") bzw.
|
||||||
|
die Dom\o'a"'nen anderer Relationen einzubeziehen sind.
|
||||||
|
.NH 3
|
||||||
|
.ft B
|
||||||
|
Realisierung
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
ZIP wird durch "make all" im Directory "../../src/zip"
|
||||||
|
installiert. Das Kommando zip wird in "../../bin" eingeordnet.
|
||||||
|
Ruft man zip ohne Parameter, wird eine Kurzinformation
|
||||||
|
zur Anwendung gegeben (in "../../man/zip").
|
||||||
|
Im Directory "../src/zip" ist ein Directory "tut" enthalten,
|
||||||
|
an dem man sich analog dieser Dokumentation orientieren kann.
|
||||||
|
.LP
|
||||||
|
Die verwendete Relation "anschrift" hat folgende Struktur:
|
||||||
|
.DS L
|
||||||
|
|
||||||
|
Relation: anschrift
|
||||||
|
---------
|
||||||
|
Besitzer: ing_db
|
||||||
|
Tupellaenge: 199
|
||||||
|
Verfallsdatum: Wed Mar 30 15:21:36 1988
|
||||||
|
Tupelanzahl: 99
|
||||||
|
Speicherstruktur: ISAM
|
||||||
|
Relationentyp: Nutzerrelation
|
||||||
|
.DE
|
||||||
|
.sp 1
|
||||||
|
.DS L
|
||||||
|
Domaenname Typ Laenge Schluessel
|
||||||
|
-------------------------------------------
|
||||||
|
bn i 4 1
|
||||||
|
ans1 c 40
|
||||||
|
ans2 c 40
|
||||||
|
ans3 c 30
|
||||||
|
ort c 30
|
||||||
|
plz c 5
|
||||||
|
kubez c 48
|
||||||
|
bezirk i 2
|
||||||
|
-------------------------------------------
|
||||||
|
.DE
|
||||||
|
.LP
|
||||||
|
Zur Veranschaulichung der Verfahrensweise folgendes
|
||||||
|
AMX-Programm:
|
||||||
|
.nf
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
## shared hardsoft
|
||||||
|
|
||||||
|
/* Eingabe und Korrektur von Anschriften */
|
||||||
|
|
||||||
|
## long BN;
|
||||||
|
## char ANS1[40]; /* 1.Zeile Anschrift */
|
||||||
|
## char ANS2[40]; /* 2.Zeile Anschrift */
|
||||||
|
## char ANS3[30]; /* 3.Zeile Anschrift, Strasse/Psf. */
|
||||||
|
## char ORT[30]; /* Ort */
|
||||||
|
## char PLZ[5]; /* Postleitzahl */
|
||||||
|
## char KUBEZ[48]; /* Kurzbezeichnung Anschrift */
|
||||||
|
## int BEZIRK; /* individueller Bezirksschluessel */
|
||||||
|
|
||||||
|
amx()
|
||||||
|
{
|
||||||
|
int flag;
|
||||||
|
int clr;
|
||||||
|
int zl;
|
||||||
|
|
||||||
|
initzip(); /*Initialisierung von curses und zip*/
|
||||||
|
|
||||||
|
## open anschrift
|
||||||
|
|
||||||
|
do
|
||||||
|
{
|
||||||
|
BN = 0;
|
||||||
|
ANS1[0] = ANS2[0] = ANS3[0] = ORT[0] = '\\0';
|
||||||
|
PLZ[0] = '\\0';
|
||||||
|
KUBEZ[0] = '\\0';
|
||||||
|
clr = 0;
|
||||||
|
if (!ansbn(clr++, 0)) break; /*Schirm wird gloescht,*/
|
||||||
|
if (!BN) break; /*dr anschliessend erhoeht*/
|
||||||
|
flag = 0;
|
||||||
|
## scan anschrift $bn=BN (ANS1=$ans1,ANS2=$ans2,ANS3=$ans3,
|
||||||
|
## ORT=$ort,PLZ=$plz,KUBEZ=$kubez,BEZIRK=$bezirk)
|
||||||
|
## {
|
||||||
|
++flag;
|
||||||
|
if (!ansein(clr, 1)) break; /*kein Schirm loeschen,*/
|
||||||
|
/*alle Variablen erst anzeigen*/
|
||||||
|
## replace ($bn=BN,$ans1=ANS1,$ans2=ANS2,$ans3=ANS3,
|
||||||
|
## $ort=ORT,$plz=PLZ,$kubez=KUBEZ,$bezirk=BEZIRK)
|
||||||
|
## }
|
||||||
|
if (!flag)
|
||||||
|
{
|
||||||
|
if (!ansein(clr, 1)) continue;
|
||||||
|
## append anschrift ($bn=BN,$ans1=ANS1,$ans2=ANS2,
|
||||||
|
## $ans3=ANS3,$ort=ORT,$plz=PLZ,$kubez=KUBEZ,$bezirk=BEZIRK)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (BN);
|
||||||
|
|
||||||
|
## commit
|
||||||
|
## close anschrift
|
||||||
|
}
|
||||||
|
-------------------------------------------------------------
|
||||||
|
.fi
|
||||||
|
.LP
|
||||||
|
Als Eingabe- bzw. Korrekturprozeduren kommen ansbn() und ansein() vor.
|
||||||
|
Mit der Trennung
|
||||||
|
in zwei Masken bzw. Prozeduren
|
||||||
|
wird vermieden, dass ansein() bei BN = 0 noch Werte abfordert
|
||||||
|
und das gleiche Programm zum Anf\o'u"'gen neuer Tupel bzw. zum
|
||||||
|
\o'A"'ndern vorhandener Verwendung findet. Im ersten Schritt
|
||||||
|
werden die Masken
|
||||||
|
.ft B
|
||||||
|
ansbn_m
|
||||||
|
.ft R
|
||||||
|
und
|
||||||
|
.ft B
|
||||||
|
ansein_m
|
||||||
|
.ft R
|
||||||
|
mit dem Editor aufgestellt,
|
||||||
|
dabei ist zu beachten, dass in den Zeilen, bei denen mit
|
||||||
|
F\o'u"'hrungstexten begonnen wird, ganz links kein Leerzeichen
|
||||||
|
steht - f\o'u"'hrende Leerzeichen werden nicht ausgegeben:
|
||||||
|
.DS L
|
||||||
|
.ft B
|
||||||
|
Maske ansbn_m:
|
||||||
|
.ft R
|
||||||
|
|
||||||
|
Erfassg./Korr. von Anschriften ==> Abbruch: Betriebsnummer = 0
|
||||||
|
|
||||||
|
Betriebsnummer(8-St.): #9999999<
|
||||||
|
|
||||||
|
.DE
|
||||||
|
.DS L
|
||||||
|
.ft B
|
||||||
|
Maske ansein_m:
|
||||||
|
.ft R
|
||||||
|
|
||||||
|
Anschrift-Betriebsbezeichnung1: #aaaaaaaaaaaaaaaaaaaaaaaaa..a<
|
||||||
|
..........Betriebsbezeichnung2: #aaaaaaaaaaaaaaaaaaaaaaaaa..a<
|
||||||
|
..........Strasse/Nr. : #aaaaaaaaaaaaaaaaaaaaaaaaaaaa<
|
||||||
|
..........Ort : #aaaaaaaaaaaaaaaaaaaaaaaaaaaa<
|
||||||
|
..........Postleitzahl : #aaa<
|
||||||
|
Kurzbezeichnung: #aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<
|
||||||
|
Bezirk : #9<
|
||||||
|
|
||||||
|
.DE
|
||||||
|
In den ersten beiden Zeilen wurden, um eine bessere Darstellung
|
||||||
|
zu erreichen, einige a ausgeblendet (entspricht ..).
|
||||||
|
.LP
|
||||||
|
.ft B
|
||||||
|
Ablauf:
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
Der Eingabe-Generator wird mit
|
||||||
|
.br
|
||||||
|
.ft B
|
||||||
|
zip
|
||||||
|
.ft R
|
||||||
|
-pl LIBTUT ansbn
|
||||||
|
.br
|
||||||
|
gerufen.
|
||||||
|
.nf
|
||||||
|
Darstellung des Dialogs:
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
+--------------------------------+
|
||||||
|
| EINGABE-GENERATOR >>> ZIP <<< |
|
||||||
|
| Version 2.1 (curses) 01.02.89 |
|
||||||
|
| EVK Olbernhau |
|
||||||
|
+--------------------------------+
|
||||||
|
|
||||||
|
Der Abfragezyklus bezieht sich jeweils auf eine Variable!
|
||||||
|
Zur Orientierung werden die Texte der Maske mit ausgegeben.
|
||||||
|
|
||||||
|
Erfassg./Korr. von Anschriften ==> Abbruch: Betriebsnummer = 0
|
||||||
|
|
||||||
|
Betriebsnummer(8-St.):
|
||||||
|
>>>Datentyp (i/l/c/f/d) > l
|
||||||
|
|
||||||
|
>>>vereinbarter Name (Feld mit []) > BN
|
||||||
|
|
||||||
|
>>>mit Korrekturmoeglichkeit?(j/n) > j
|
||||||
|
|
||||||
|
>>>Name Pruefprozedur mit () u.Arg.> przk()
|
||||||
|
|
||||||
|
>>>Pruef-Art:Zei.=z/Wort=w > w
|
||||||
|
|
||||||
|
>>>Hilfe einordnen? (j/n) > j
|
||||||
|
|
||||||
|
>>>Hilfe-Art: Text=t / Prozedur=p > t
|
||||||
|
|
||||||
|
>>>Name File f. Hilfe-Text m. (z,s) > bnhlp(3,15)
|
||||||
|
9999999<
|
||||||
|
|
||||||
|
|
||||||
|
Okay? >j
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
.fi
|
||||||
|
.LP
|
||||||
|
Zur Orientierung im Dialog gibt ZIP alle F\o'u"'hrungstexte
|
||||||
|
entsprechend der Textmaske mit aus.
|
||||||
|
.LP
|
||||||
|
Parallel zum Dialog wird das File ansbn_i angelegt:
|
||||||
|
.DS I
|
||||||
|
-pl LIBTUT ansbn
|
||||||
|
long BN j przk() w bnhlp(3,15) t
|
||||||
|
.DE
|
||||||
|
.LP
|
||||||
|
Die Pr\o'u"'fung der Statistik-Betriebsnummer erledigt die Prozedur przk():
|
||||||
|
.nf
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
/* Pruefziffernkontrolle Modul 11 (8-stellig) */
|
||||||
|
|
||||||
|
przk(pn) long *pn;
|
||||||
|
{
|
||||||
|
long nr;
|
||||||
|
int bew[8];
|
||||||
|
int erg, sg, i, divr, anr, pz, p;
|
||||||
|
|
||||||
|
nr = *pn;
|
||||||
|
bew[0] = 0;
|
||||||
|
bew[1] = 4;
|
||||||
|
bew[2] = 8;
|
||||||
|
bew[3] = 5;
|
||||||
|
bew[4] = 10;
|
||||||
|
bew[5] = 9;
|
||||||
|
bew[6] = 7;
|
||||||
|
bew[7] = 3;
|
||||||
|
|
||||||
|
p = nr % 10;
|
||||||
|
sg = 0;
|
||||||
|
|
||||||
|
for (i = 0; i < 8; i++ )
|
||||||
|
{
|
||||||
|
anr = nr % 10;
|
||||||
|
erg = anr * bew[i];
|
||||||
|
sg = sg + erg;
|
||||||
|
nr = nr / 10;
|
||||||
|
}
|
||||||
|
divr = sg % 11;
|
||||||
|
switch(divr)
|
||||||
|
{
|
||||||
|
case 0 : pz = 5;
|
||||||
|
break;
|
||||||
|
case 2 : pz = 4;
|
||||||
|
break;
|
||||||
|
case 3 : pz = 9;
|
||||||
|
break;
|
||||||
|
case 4 : pz = 3;
|
||||||
|
break;
|
||||||
|
case 5 : pz = 8;
|
||||||
|
break;
|
||||||
|
case 6 : pz = 2;
|
||||||
|
break;
|
||||||
|
case 7 : pz = 7;
|
||||||
|
break;
|
||||||
|
case 8 : pz = 1;
|
||||||
|
break;
|
||||||
|
case 9 : pz = 6;
|
||||||
|
break;
|
||||||
|
default: pz = 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
if (p == pz) return(1);
|
||||||
|
else return(0);
|
||||||
|
}
|
||||||
|
-------------------------------------------------------------
|
||||||
|
.fi
|
||||||
|
.LP
|
||||||
|
Der R\o'u"'ckkehrcode dieser Prozedur, die ebenfalls in LIBTUT steht,
|
||||||
|
wird ausgewertet (1 ist TRUE, 0 ist FALSE). Der Return-Code 0
|
||||||
|
veranlasst nach einem Hupton zur erneuten Eingabe (Kursor
|
||||||
|
auf Feldanfang), die Eingabe von Fragezeichen (?) f\o'u"'hrt zur
|
||||||
|
Ausgabe der
|
||||||
|
Hilfe "pruefzifferngesichert" - der Text dazu steht im File bnhlp,
|
||||||
|
das bei der Generierung eingezogen wird.
|
||||||
|
Die Prozedur ansein() wird mit
|
||||||
|
.br
|
||||||
|
zip -a 3 -hl LIBTUT ansein
|
||||||
|
.br
|
||||||
|
generiert.
|
||||||
|
Der Dialog l\o'a"'uft wie folgt ab:
|
||||||
|
.nf
|
||||||
|
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
+--------------------------------+
|
||||||
|
| EINGABE-GENERATOR >>> ZIP <<< |
|
||||||
|
| Version 2.1 (curses) 01.02.89 |
|
||||||
|
| EVK Olbernhau |
|
||||||
|
+--------------------------------+
|
||||||
|
|
||||||
|
Der Abfragezyklus bezieht sich jeweils auf eine Variable!
|
||||||
|
Zur Orientierung werden die Texte der Maske mit ausgegeben.
|
||||||
|
|
||||||
|
Anschrift-Betriebsbezeichnung1:
|
||||||
|
>>>Datentyp (i/l/c/f/d) > c
|
||||||
|
|
||||||
|
>>>vereinbarter Name (Feld mit []) > ANS1[40]
|
||||||
|
|
||||||
|
>>>mit Korrekturmoeglichkeit?(j/n) > j
|
||||||
|
|
||||||
|
>>>Hilfe einordnen? (j/n) > n
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<
|
||||||
|
..........Betriebsbezeichnung2:
|
||||||
|
>>>Datentyp (i/l/c/f/d) > c
|
||||||
|
|
||||||
|
>>>vereinbarter Name (Feld mit []) > ANS2[40]
|
||||||
|
|
||||||
|
>>>mit Korrekturmoeglichkeit?(j/n) > j
|
||||||
|
|
||||||
|
>>>Hilfe einordnen? (j/n) > n
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<
|
||||||
|
..........Strasse/Nr. :
|
||||||
|
>>>Datentyp (i/l/c/f/d) > c
|
||||||
|
|
||||||
|
>>>vereinbarter Name (Feld mit []) > ANS3[30]
|
||||||
|
|
||||||
|
>>>mit Korrekturmoeglichkeit?(j/n) > j
|
||||||
|
|
||||||
|
>>>Hilfe einordnen? (j/n) > n
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaa<
|
||||||
|
..........Ort :
|
||||||
|
>>>Datentyp (i/l/c/f/d) > c
|
||||||
|
|
||||||
|
>>>vereinbarter Name (Feld mit []) > ORT[30]
|
||||||
|
|
||||||
|
>>>mit Korrekturmoeglichkeit?(j/n) > j
|
||||||
|
|
||||||
|
>>>Hilfe einordnen? (j/n) > n
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaa<
|
||||||
|
..........Postleitzahl :
|
||||||
|
>>>Datentyp (i/l/c/f/d) > c
|
||||||
|
|
||||||
|
>>>vereinbarter Name (Feld mit []) > PLZ[5]
|
||||||
|
|
||||||
|
>>>mit Korrekturmoeglichkeit?(j/n) > j
|
||||||
|
|
||||||
|
>>>Hilfe einordnen? (j/n) > n
|
||||||
|
aaa<
|
||||||
|
Kurzbezeichnung:
|
||||||
|
>>>Datentyp (i/l/c/f/d) > c
|
||||||
|
|
||||||
|
>>>vereinbarter Name (Feld mit []) > KUBEZ[48]
|
||||||
|
|
||||||
|
>>>mit Korrekturmoeglichkeit?(j/n) > j
|
||||||
|
|
||||||
|
>>>Hilfe einordnen? (j/n) > n
|
||||||
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa<
|
||||||
|
|
||||||
|
>>>Datentyp (i/l/c/f/d) > i
|
||||||
|
|
||||||
|
>>>vereinbarter Name (Feld mit []) > BEZIRK
|
||||||
|
|
||||||
|
>>>mit Korrekturmoeglichkeit?(j/n) > j
|
||||||
|
|
||||||
|
>>>Hilfe einordnen? (j/n) > j
|
||||||
|
|
||||||
|
>>>Hilfe-Art: Text=t / Prozedur=p > t
|
||||||
|
|
||||||
|
>>>Name File f. Hilfe-Text m.(z,s) > bezhlp(15,3)
|
||||||
|
9<
|
||||||
|
|
||||||
|
Okay? >>j
|
||||||
|
-------------------------------------------------------------
|
||||||
|
.fi
|
||||||
|
.LP
|
||||||
|
Die nach > stehenden Eingaben sind jeweils mit <CR> (Carriage Return)
|
||||||
|
abzuschliessen.
|
||||||
|
|
||||||
|
Folgendes i-File entsteht:
|
||||||
|
.DS I
|
||||||
|
-a 3 -hl LIBTUT ansein
|
||||||
|
char ANS1[40] j n n
|
||||||
|
char ANS2[40] j n n
|
||||||
|
char ANS3[30] j n n
|
||||||
|
char ORT[30] j n n
|
||||||
|
char PLZ[5] j n n
|
||||||
|
char KUBEZ[48] j n n
|
||||||
|
int BEZIRK j n bezhlp(15,3) t
|
||||||
|
.DE
|
||||||
|
.LP
|
||||||
|
Es w\o'a"'re denkbar, die PLZ mit "isdigit()" zu pr\o'u"'fen, in Abweichung
|
||||||
|
zu oben entst\o'u"'nde das i-File:
|
||||||
|
.DS I
|
||||||
|
-a 3 -phl LIBTUT ansein
|
||||||
|
char ANS1[40] j n n
|
||||||
|
char ANS2[40] j n n
|
||||||
|
char ANS3[30] j n n
|
||||||
|
char ORT[30] j n n
|
||||||
|
char PLZ[5] j isdigit() z
|
||||||
|
char KUBEZ[48] j n n
|
||||||
|
int BEZIRK j n bezhlp(15,3) t
|
||||||
|
.DE
|
||||||
|
.LP
|
||||||
|
Beachten sie, dass \et als Trennzeichen steht.
|
||||||
|
Bei \o'A"'nderungen im *_i-File
|
||||||
|
d\o'u"'rfen die
|
||||||
|
Trennzeichen nicht versehentlich gel\o'o"'scht
|
||||||
|
werden!
|
||||||
|
.LP
|
||||||
|
Es wird bei der Erzeugung der Ein-/Ausgabe-Prozedur
|
||||||
|
davon ausgegangen, dass die C-Variablen an
|
||||||
|
Spalten bestimmter Relationen \o'u"'bergeben
|
||||||
|
bzw. von diesen \o'u"'bernommen werden. Deshalb sind
|
||||||
|
die C-Variablen grunds\o'a"'tzlich global de\%kla\%riert,
|
||||||
|
entsprechend erwartet die erzeugte Prozedur eine
|
||||||
|
globale Deklaration zur Wert-\o'U"'bergabe/-\o'U"'bernahme.
|
||||||
|
F\o'u"'r alle zu realisierenden Konvertierungen werden die
|
||||||
|
Prozeduren (im Sinne von Parameter-Prozeduren)
|
||||||
|
aus /usr/lib/libzip.a verwendet.
|
||||||
|
Die manuelle Ersetzung
|
||||||
|
der Funktionsprozeduren aus der Standard-Bibliothek von
|
||||||
|
C (libc.a) f\o'u"'hrt zu Fehlern.
|
||||||
|
.LP
|
||||||
|
Die Reihenfolge der Objekte in
|
||||||
|
der Arbeits-Bibliothek (hier LIBTUT) spielt eine Rolle,
|
||||||
|
sofern Pr\o'u"'fprozeduren verwendet werden (nach der ZIP-Prozedur !).
|
||||||
|
Die Arbeits-Bibliothek muss im Bindekommando
|
||||||
|
vor /usr/lib/libzip.a stehen.
|
||||||
|
.LP
|
||||||
|
Pruefprozeduren werden in Anlehnung an
|
||||||
|
die Funktionen aus "ctype" (isdigit(), isascii() usw.) so
|
||||||
|
ge\%staltet, dass der Rueckkehrcode 1 fuer TRUE und
|
||||||
|
0 f\o'u"'r FALSE liefert. Das gilt sowohl f\o'u"'er Prozeduren
|
||||||
|
die zeichenweise (z) als auch f\o'u"'r solche, die
|
||||||
|
wortweise (w) pr\o'u"'fen.
|
||||||
|
Das header-File <ctype.h> wird f\o'u"'r ZIP-Prozeduren
|
||||||
|
standardm\o'a"'ssig eingezogen.
|
||||||
|
.LP
|
||||||
|
Als kleine zus\o'a"'tzliche Hilfe von ZIP steht eine
|
||||||
|
Menue-Prozedur
|
||||||
|
.ft B
|
||||||
|
menzip()
|
||||||
|
.ft R
|
||||||
|
zur Verf\o'u"'gung, die ein im main() vereinbartes Zeichenkettenfeld
|
||||||
|
auf w\o'a"'hlbaren Positionen invers ausgibt und die
|
||||||
|
angeklickte Zeile (1..n) als R\o'u"'ckkehrwert liefert
|
||||||
|
(s. Teil III, Beispiel "Terminkontrolle").
|
||||||
|
|
||||||
|
|
@ -0,0 +1,597 @@
|
||||||
|
.ds LH Anwendung
|
||||||
|
.ds RH \f3ZUGRIFF\f1
|
||||||
|
.ds CH - % -
|
||||||
|
.bp
|
||||||
|
.NH 2
|
||||||
|
.ft B
|
||||||
|
Zugriffsmethoden und **
|
||||||
|
.br
|
||||||
|
Datenlokalisierung
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
.sp 10
|
||||||
|
.NH 3
|
||||||
|
.ft B
|
||||||
|
Einleitung
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
\*(yy\ unterst\o'u"'tzt mehrere Zugriffsmethoden,
|
||||||
|
deren sinnvoller Einsatz dem Projektanten
|
||||||
|
und dem Datenbankadministrator \o'u"'berlassen wird
|
||||||
|
und die Zuordnung von Datenbanken
|
||||||
|
und Relationen in eine hierarchische \*(xx\-File-Struktur.
|
||||||
|
.LP
|
||||||
|
Diese Kapitel beschreibt die Funktionsweise
|
||||||
|
der Zugriffsmethoden und gibt damit ,weiterf\o'u"'hrend
|
||||||
|
zum vorangegangenen, eine
|
||||||
|
Anleitung zu ihrem effektiven problembezogenem Einsatz.
|
||||||
|
Ausserdem werden die Teile des \*(yy\-Filesystems
|
||||||
|
beschrieben, die den anwendungsbezogenen Aufbau
|
||||||
|
mountbarer Filesysteme erm\o'o"'glichen.
|
||||||
|
.NH 3
|
||||||
|
.ft B
|
||||||
|
Grundkonzepte von \*(yy
|
||||||
|
.ft R
|
||||||
|
.NH 4
|
||||||
|
.ft B
|
||||||
|
Seitenkonzept und Tupeldarstellung
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
Alle Zugriffsmethoden legen den Datenbestand
|
||||||
|
einer Relation in \*(xx\-Files ab.
|
||||||
|
Das File ist generierungsabh\o'a"'ngig in Seiten von 512-Byte
|
||||||
|
(\*(xx\ Version 7) oder 1KByte L\o'a"'nge
|
||||||
|
unterteilt. Jedes File f\o'u"'r eine
|
||||||
|
Relation besteht aus einer ganzen Anzahl von Seiten,
|
||||||
|
mindestens aber aus einer.
|
||||||
|
.LP
|
||||||
|
Jede Seite enth\o'a"'lt Tupel der Relation
|
||||||
|
und zwar so, dass jedes Tupel vollst\o'a"'ndig auf einer Seite
|
||||||
|
untergebracht ist.
|
||||||
|
.LP
|
||||||
|
Ein Tupel kann gew\o'o"'hnlich oder komprimiert gespeichert
|
||||||
|
werden:
|
||||||
|
Als gew\o'o"'hnlich gespeichertes Tupel wollen wir eine Speicherung verstehen,
|
||||||
|
wo jedes Attribut des Tupel genau soviele Bytes
|
||||||
|
belegt, wie beim create der Relation
|
||||||
|
als Formatl\o'a"'nge f\o'u"'r die entsprechenden Dom\o'a"'nen
|
||||||
|
definiert wurde.
|
||||||
|
Bei den Dom\o'a"'nen des Typs c (character) wird h\o'a"'ufig der
|
||||||
|
Fall eintreten, dass deren Attribute den verf\o'u"'gbaren Speicherplatz
|
||||||
|
nicht voll ausf\o'u"'llen, indem sie ab einer bestimmten
|
||||||
|
Position nur noch Leerzeichen enthalten.
|
||||||
|
Als eine komprimierte Speicherung eines Tupel
|
||||||
|
verstehen wir eine solche,
|
||||||
|
bei der Attribute von c-Dom\o'a"'nen um diese rechten Leerstellen
|
||||||
|
verk\o'u"'rzt werden (das Ende des relevanten Teils
|
||||||
|
des Attributes wird durch ein zus\o'a"'tzliches '\e0'-Byte markiert ! ).
|
||||||
|
Als Spreizen einer Relation wollen wir die Transformation
|
||||||
|
einer komprimierten in die gew\o'o"'hnliche Darstellung
|
||||||
|
verstehen.
|
||||||
|
.LP
|
||||||
|
F\o'u"'r gew\o'o"'hnlich dargestellte Relationen kann man die auf einer
|
||||||
|
Seite unterbringbaren Tupel berechnen als
|
||||||
|
.DS I
|
||||||
|
|
||||||
|
512 - 12
|
||||||
|
Tupel pro Seite = ggZ (--------------------)
|
||||||
|
Tupell\o'a"'nge + 2
|
||||||
|
|
||||||
|
(Tupell\o'a"'nge in Byte,
|
||||||
|
ggZ: gr\o'o"'sste ganze Zahl von )
|
||||||
|
.DE
|
||||||
|
Man sieht, dass pro Seite generell 12
|
||||||
|
Bytes und pro Tupel 2 Byte Verwaltungsplatz
|
||||||
|
ben\o'o"'tigt werden.
|
||||||
|
.LP
|
||||||
|
Analog kann man sich ausrechnen, wieviel Restplatz
|
||||||
|
auf jeder Seite frei bleibt, wenn die Tupell\o'a"'nge
|
||||||
|
so gew\o'a"'hlt wird, dass ein ganzes Vielfaches von
|
||||||
|
ihr ( + 2 ! ) die Seite nicht ausf\o'u"'llt.
|
||||||
|
Maximal darf die Tupell\o'a"'nge 498 Bytes betragen
|
||||||
|
(pro Seite dadurch also ein Tupel !).
|
||||||
|
Die Beziehungen f\o'u"'r 1024-Byte-Seiten k\o'o"'nnen
|
||||||
|
mit den gleichen absoluten Werten berechnet werden.
|
||||||
|
.LP
|
||||||
|
Aus der Anzahl der Tupel und den auf einer Seite unterbringbaren,
|
||||||
|
kann der, f\o'u"'r eine Relation insgesamt n\o'o"'tige Speicherplatz
|
||||||
|
ausgerechnet werden.
|
||||||
|
.LP
|
||||||
|
F\o'u"'r komprimiert dargestellte Relationen
|
||||||
|
muss man eigene Absch\o'a"'tzungen verwenden.
|
||||||
|
.LP
|
||||||
|
Wir bezeichnen eine Seite mit minimalem Restplatz
|
||||||
|
als (100 %-tig) gef\o'u"'llt.
|
||||||
|
Der F\o'u"'llfaktor einer Seite entspricht dem
|
||||||
|
durch Tupel belegten Platz
|
||||||
|
im Verh\o'a"'ltnis zum Gesamtplatz.
|
||||||
|
.NH 4
|
||||||
|
.ft B
|
||||||
|
Schl\o'u"'sselbegriff von \*(yy
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
In der Relationentheorie bezeichnet
|
||||||
|
man als Schl\o'u"'ssel einer Relation
|
||||||
|
eine derartige Dom\o'a"'ne (oder Gruppe von Dom\o'a"'nen),
|
||||||
|
deren Attribute allein das Tupel charakterisieren.
|
||||||
|
Beliebige zwei Tupel einer Relation unterscheiden sich also
|
||||||
|
mindestens in ihren Schl\o'u"'sseln.
|
||||||
|
.LP
|
||||||
|
Wenn in der \*(yy\-Dokumentation von Schl\o'u"'sseln
|
||||||
|
gesprochen wird, ist ein anderer, schw\o'a"'cherer Begriff
|
||||||
|
gemeint.
|
||||||
|
Bei \*(yy\ kann eine Dom\o'a"'ne
|
||||||
|
(oder eine Gruppe von in ihrer Reihenfolge
|
||||||
|
ge\%kennzeichneter Dom\o'a"'nen)
|
||||||
|
f\o'u"'r die Sortierung oder Zugriffsunterst\o'u"'tzung
|
||||||
|
herangezogen werden.
|
||||||
|
F\o'u"'r diese Dom\o'a"'ne(n) wird dann vom Schl\o'u"'ssel
|
||||||
|
der Relation gesprochen.
|
||||||
|
\*(yy\ unterstellt f\o'u"'r den Schl\o'u"'ssel nicht
|
||||||
|
unbedingt die o.g. unifizierende Eigenschaft,
|
||||||
|
dass sich zwei Tupel mindestens in ihren Schl\o'u"'sseln
|
||||||
|
unterscheiden m\o'u"'ssen.
|
||||||
|
.LP
|
||||||
|
F\o'u"'r \*(yy\ sind zwei Tupel genau dann gleich,
|
||||||
|
wenn sie in allen paarigen Attributen
|
||||||
|
\o'u"'bereinstimmen. An den Stellen,
|
||||||
|
wo \*(yy\ doppelte Tupel ausschliesst, wird nicht
|
||||||
|
nur auf Unterschiede in den Schl\o'u"'sselattributen,
|
||||||
|
sondern auf solche in allen paarigen
|
||||||
|
Attributen getestet.
|
||||||
|
.NH 4
|
||||||
|
.ft B
|
||||||
|
Seitenketten
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
Wir wollen eine Gruppe von Seiten, die aus einer Hauptseite besteht,
|
||||||
|
an der ggf. weitere Seiten durch Verweisungen angekettet sind,
|
||||||
|
als Seitenkette bezeichnen.
|
||||||
|
Im Extrem besteht die Sei\%tenkette nur aus der Hauptseite.
|
||||||
|
Die Verweisungen erfolgen linear aus der Hauptseite
|
||||||
|
auf deren nachfolgende, aus dieser auf deren nachfolgende u.s.w.
|
||||||
|
In der Regel werden die der Hauptseite folgenden
|
||||||
|
Seiten als \o'U"'berlaufseiten bezeichnet.
|
||||||
|
Wir bezeichnen die in der Seitenkette enthaltenen Tupel als
|
||||||
|
Tupel\%kette der Seiten\%kette.
|
||||||
|
.DS L
|
||||||
|
Seitenkette ___________
|
||||||
|
| |
|
||||||
|
| Haupt |
|
||||||
|
| Seite |
|
||||||
|
| |
|
||||||
|
~~~~~~~~~~~
|
||||||
|
| ....................
|
||||||
|
___________ \o'U"'berlaufseiten
|
||||||
|
| |
|
||||||
|
| Folge |
|
||||||
|
| Seite |
|
||||||
|
| |
|
||||||
|
~~~~~~~~~~~
|
||||||
|
|
|
||||||
|
:
|
||||||
|
:
|
||||||
|
:
|
||||||
|
.DE
|
||||||
|
.LP
|
||||||
|
Gemeinsam bei allen Zugriffsmethoden ist:
|
||||||
|
.IP \ \ \ - 5
|
||||||
|
Die Suche eines Tupels in einer Seitenkette erfolgt
|
||||||
|
sequentiell.
|
||||||
|
.sp1
|
||||||
|
Sieht man von den hier nicht darzustellenden
|
||||||
|
Dekompositionsverfahren bei retrieve-Anweisungen
|
||||||
|
mit Aggregaten oder \o'u"'ber mehrere Relationen ab,
|
||||||
|
erfolgt die Anzeige aufgefundener Tupel
|
||||||
|
unmittelbar in der Reihenfolge der Tupelkette.
|
||||||
|
.sp1
|
||||||
|
.IP
|
||||||
|
Das Anf\o'u"'gen (append) eines Tupel in einer Seitenkette
|
||||||
|
erfolgt hinten an die Tupel der laufenden Seite;
|
||||||
|
wenn daf\o'u"'r kein Platz mehr ist,
|
||||||
|
wird die Seitenkette um eine neue Seite verl\o'a"'ngert.
|
||||||
|
.sp1
|
||||||
|
Dadurch geht die anfangs bestehende Reihenfolgeordnung
|
||||||
|
der Tupel in einer Seite und auch in der Seitenkette verloren.
|
||||||
|
.sp1
|
||||||
|
.IP
|
||||||
|
Beim Streichen (delete) eines Tupel wird der Platz des Tupel
|
||||||
|
freigegeben und die Seite komprimiert;
|
||||||
|
die Seitenkette wird nicht komprimiert.
|
||||||
|
.LP
|
||||||
|
Unterschiede zwischen den Zugriffsmethoden
|
||||||
|
bestehen darin:
|
||||||
|
.sp1
|
||||||
|
.IP \ \ \ - 5
|
||||||
|
bei der heap-Technik wird die gesamte Relation in einer
|
||||||
|
einzigen Seitenkette abgelegt, bei den Direktzugriffsmethoden
|
||||||
|
hash und isam besteht die Relation aus mehreren Seitenketten.
|
||||||
|
Die Unterschiede bei letzteren Techniken
|
||||||
|
bestehen in der Art der Zuordnung von
|
||||||
|
Schl\o'u"'sselwerten zu den verschiedenen Seitenketten
|
||||||
|
der Relation.
|
||||||
|
.sp1
|
||||||
|
.IP
|
||||||
|
Bei der heap-Technik werden doppelte Tupel in der Seiten\%kette
|
||||||
|
zugelassen, bei den Direktzugriffstechniken nicht.
|
||||||
|
.sp1
|
||||||
|
Daraus ergeben sich Unterschiede beim Anf\o'u"'gen neuer Tupel:
|
||||||
|
.br
|
||||||
|
Bei heap erfolgt die Einspeicherung
|
||||||
|
am Ende der Tupel\%kette,
|
||||||
|
bei hash und isam muss die gesamte Seiten\%kette
|
||||||
|
durchsucht werden, um doppelte Tupel auszuschliessen,
|
||||||
|
das Anf\o'u"'gen erfolgt
|
||||||
|
auf dem ersten ausreichenden freien Platz der Seitenkette.
|
||||||
|
Bei heap wird dadurch der durch delete entstandene
|
||||||
|
freie Platz nicht wieder ausgenutzt.
|
||||||
|
.sp1
|
||||||
|
Daraus ergeben sich auch Unterschiede beim Ersetzen (replace)
|
||||||
|
in komprimierten Relationen in solchen F\o'a"'llen,
|
||||||
|
wo das Ersetzen ggf. nicht inplace erfolgen kann.
|
||||||
|
Dann wird replace in delete und append aufgel\o'o"'st.
|
||||||
|
Beachten sie, dass jedes gefundene Tupel ersetzt wird,
|
||||||
|
replace also die Anzahl der Tupel einer Relation nicht \o'a"'ndert.
|
||||||
|
.NH 3
|
||||||
|
.ft B
|
||||||
|
Zugriffstechniken von \*(yy
|
||||||
|
.ft R
|
||||||
|
.NH 4
|
||||||
|
.ft B
|
||||||
|
Heap
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
Eine als heap dargestellte Relation belegt
|
||||||
|
eine Seitenkette.
|
||||||
|
Bis auf die letzte Seite sind
|
||||||
|
bei Erzeugung der Relation
|
||||||
|
durch modify, copy from oder sukzessives append
|
||||||
|
alle Seiten
|
||||||
|
(100 %-tig) gef\o'u"'llt.
|
||||||
|
Die Tupel sind unsortiert.
|
||||||
|
Die Relation enth\o'a"'lt ggf. doppelte Tupel.
|
||||||
|
.LP
|
||||||
|
append f\o'u"'gt Tupel hinten an
|
||||||
|
(ggf. werden weitere Seiten angekettet !).
|
||||||
|
delete gibt Speicherplatz auf der jeweiligen Seite frei;
|
||||||
|
um die zu l\o'o"'schenden Tupel zu finden,
|
||||||
|
muss die gesamte Relation durchsucht werden.
|
||||||
|
Der freigegebene Platz kann durch append nicht wiederbenutzt werden,
|
||||||
|
da neue Tupel hinten angelegt werden.
|
||||||
|
retrieve durchsucht die gesamte Relation
|
||||||
|
und zeigt die sich qua\%lifizierenden
|
||||||
|
Tupel in der gefundenen, unsortierten Reihenfolge.
|
||||||
|
.LP
|
||||||
|
heap und cheap sind geeignete Zugriffstechniken,
|
||||||
|
um aus einer leeren Relation durch sukzessives Anf\o'u"'gen oder copy from
|
||||||
|
eine Relation aufzubauen.
|
||||||
|
Eine effektive Arbeit mit dieser Zugriffstechnik
|
||||||
|
ist aber nur bei kleinen Relationen denkbar.
|
||||||
|
.NH 4
|
||||||
|
.ft B
|
||||||
|
Heapsort
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
heapsort ist keine Speichertechnik
|
||||||
|
sondern Zustand einer Relation
|
||||||
|
nach Ausf\o'u"'hrung eines entsprechenden modify-Statements;
|
||||||
|
die Relation ist in der Folge ein heap.
|
||||||
|
.LP
|
||||||
|
Bei der Ausf\o'u"'hrung eines modify to heapsort
|
||||||
|
wird die Relation nach den angesprochenen Dom\o'a"'nen
|
||||||
|
sortiert, werden doppelte Tupel gestrichen
|
||||||
|
und wird die Relation als heap abgelegt.
|
||||||
|
.LP
|
||||||
|
Zur Durchf\o'u"'hrung der Sortierung wird die Relation
|
||||||
|
gespreizt, falls sie komprimiert gespeichert war.
|
||||||
|
Es werden Sortierarbeitspl\o'a"'tze
|
||||||
|
als Files im SYS-directory angelegt.
|
||||||
|
.NH 4
|
||||||
|
.ft B
|
||||||
|
Hash
|
||||||
|
.tf R
|
||||||
|
.LP
|
||||||
|
F\o'u"'r eine als hash dargestellte Relation besteht ein
|
||||||
|
Direktzugriff auf ein Tupel,
|
||||||
|
wenn der Wert seines(r) Schl\o'u"'sselattribute(s)
|
||||||
|
vollst\o'a"'ndig angegeben wird.
|
||||||
|
Dieser Zugriff wird wie folgt vollzogen:
|
||||||
|
.LP
|
||||||
|
Durch eine hash-Funktion wird aus dem Schl\o'u"'sselattribut
|
||||||
|
die Adresse (der hash-Code) einer Hauptseite
|
||||||
|
berechnet.
|
||||||
|
Die hash Funktion berechnet also nach einem besonderen
|
||||||
|
Verfahren aus einem irgendwie strukturiertem Schl\o'u"'ssel
|
||||||
|
eine Zahl, die in einem Intervall
|
||||||
|
.DS C
|
||||||
|
0 <= Hauptseite <= N-1
|
||||||
|
.DE
|
||||||
|
liegt.
|
||||||
|
N bezeichnen wir als Spreizungsbreite der hash-Funktion.
|
||||||
|
Diese dadurch jeweils errechnete Hauptseite ist Anfangsseite
|
||||||
|
einer Seitenkette, die alle die Tupel der Relation enth\o'a"'lt,
|
||||||
|
deren Schl\o'u"'ssel den gleichen hash-Code haben.
|
||||||
|
In diesen Seitenketten werden keine doppelten Tupel zugelassen.
|
||||||
|
Die Relation kann insgesamt als unsortiert aufgefasst werden,
|
||||||
|
da die hash-Funktion keinen "nat\o'u"'rlichen" Wert
|
||||||
|
aus dem Schl\o'u"'ssel bildet.
|
||||||
|
.DS I
|
||||||
|
0
|
||||||
|
1
|
||||||
|
hash(Schl\o'u"'sselwert) = :
|
||||||
|
:
|
||||||
|
N-1
|
||||||
|
|
||||||
|
|
||||||
|
0 1 ......... N-1
|
||||||
|
________ ________ ________
|
||||||
|
| | | | | |
|
||||||
|
|Seiten| |Seiten| ......... |Seiten|
|
||||||
|
|kette | |kette | |kette |
|
||||||
|
| | | | | |
|
||||||
|
~~~~~~~~ ~~~~~~~~ ~~~~~~~~
|
||||||
|
|
||||||
|
.DE
|
||||||
|
.LP
|
||||||
|
Beim modify einer Relation zu hash
|
||||||
|
kann die Spreizungsbreite
|
||||||
|
der hash-Funktion durch die geforderte Anzahl von
|
||||||
|
Hauptseiten
|
||||||
|
(minpages/maxpages als minimale/maximale Anzahl)
|
||||||
|
beeinflusst werden.
|
||||||
|
Die Ausf\o'u"'hrung des modify erfolgt durch sukzessives insert
|
||||||
|
in eine neue Relation.
|
||||||
|
Die alte Relation wird aus Sicherheitsgr\o'u"'nden erst
|
||||||
|
freigegeben, wenn die neue erzeugt ist.
|
||||||
|
Beim create einer leeren Relation
|
||||||
|
kann man mit
|
||||||
|
modify
|
||||||
|
eine gew\o'u"'nschte Spreizungsbreite einstellen.
|
||||||
|
.LP
|
||||||
|
hash und chash sind geeignete Zugriffstechniken,
|
||||||
|
um aus einer leeren Relation durch sukzessives Anf\o'u"'gen
|
||||||
|
oder durch copy from eine Relation aufzubauen.
|
||||||
|
.LP
|
||||||
|
\*(yy\ unterst\o'u"'tzt nur eine hash-Funktion.
|
||||||
|
Es kann nicht garantiert werden,
|
||||||
|
dass die durch die Spreizungsbreite definierte Anzahl
|
||||||
|
von Seitenketten schon bei Erzeugung der Relation jeweils
|
||||||
|
mindestens ein Tupel und maximal nicht mehr als auf der Hauptseite
|
||||||
|
unterbringbar enthalten.
|
||||||
|
Allerdings wird f\o'u"'r jede Seitenkette mindestens
|
||||||
|
eine Hauptseite reserviert.
|
||||||
|
.LP
|
||||||
|
Die Suche in einer hash-Relation f\o'u"'r einen einzelnen Schl\o'u"'sselwert
|
||||||
|
f\o'u"'hrt \o'u"'ber dessen hash-Code
|
||||||
|
auf die Hauptseite, wo sequentiell weiter gesucht wird.
|
||||||
|
Die Suche nach einem Schl\o'u"'sselintervall zwingt zum Durchsuchen
|
||||||
|
der gesamten Relation.
|
||||||
|
Deshalb ist die hash-Technik ungeeignet,
|
||||||
|
wenn h\o'a"'ufig Suchpfade \o'u"'ber
|
||||||
|
Schl\o'u"'sselintervalle benutzt werden m\o'u"'ssen.
|
||||||
|
.LP
|
||||||
|
Das \o'A"'ndern in einer Relation erfolgt einschliesslich
|
||||||
|
der Suche und dem Ausschluss der Anlage doppelter Tupel.
|
||||||
|
Beim Erg\o'a"'nzen neuer Tupel wird die betroffene Seitenkette
|
||||||
|
ggf. durch \o'U"'berlaufseiten erg\o'a"'nzt, die an die
|
||||||
|
vorherigen Seiten der Seitenkette angekettet werden.
|
||||||
|
.NH 4
|
||||||
|
.ft B
|
||||||
|
Isam
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
F\o'u"'r eine als isam dargestellte Relation
|
||||||
|
besteht ein Direktzugriff auf ein Tupel,
|
||||||
|
wenn der Wert seines(r) Schl\o'u"'sselattribute(s)
|
||||||
|
angegeben wird und besteht dar\o'u"'ber hinaus die M\o'o"'glichkeit,
|
||||||
|
Schl\o'u"'sselintervalle in einer ann\o'a"'hernden
|
||||||
|
Sortierung abzugreifen.
|
||||||
|
.LP
|
||||||
|
F\o'u"'r isam ist ein aus mehreren Komponenten
|
||||||
|
bestehender Schl\o'u"'ssel soweit definiert und ggf.
|
||||||
|
f\o'u"'r einen direkten Zugriff nutzbar,
|
||||||
|
wie seine ersten Komponenten l\o'u"'ckenlos
|
||||||
|
definiert sind.
|
||||||
|
.LP
|
||||||
|
Der Zugriff wird wie folgt organisiert:
|
||||||
|
.LP
|
||||||
|
Durch einen Adress-B*-Baum wird aus dem Schl\o'u"'sselattribut
|
||||||
|
die Adresse einer Hauptseite berechnet.
|
||||||
|
.LP
|
||||||
|
Ein B*-Adressbaum enth\o'a"'lt in jeder Baumebene
|
||||||
|
eine Folge von Seiten. Eine derartige Folge von Seiten
|
||||||
|
enth\o'a"'lt aufsteigend geordnete Schl\o'u"'ssel
|
||||||
|
von Seiten der darunter liegenden Baum\%ebene, also der
|
||||||
|
Nachfolgeebene.
|
||||||
|
Aus der Position des Schl\o'u"'ssels kann die betreffende Seite
|
||||||
|
der Nachfolgeebene bestimmt werden.
|
||||||
|
Diese enth\o'a"'lt ab dem sie definierenden Anfangsschl\o'u"'ssel
|
||||||
|
alle, die kleiner als der Anfangsschl\o'u"'ssel
|
||||||
|
ihrer, in gleicher Baumebene liegenden, Nachbarseite sind.
|
||||||
|
Der B*-Baum wird nach unten durch Hauptseiten
|
||||||
|
von Seitenketten abgeschlossen,
|
||||||
|
die zu den Schl\o'u"'sseln auch alle weiteren Attribute
|
||||||
|
als vollst\o'a"'ndige Tupel enthalten.
|
||||||
|
Der B*-Baum erh\o'a"'lt nach oben soviele Ebenen, bis die
|
||||||
|
Wurzelebene ganz auf einer Seite darstellbar ist.
|
||||||
|
.LP
|
||||||
|
Nehmen wir als Beispiel Schl\o'u"'ssel von ganzen Zahlen an und nehmen wir weiter an, dass auf
|
||||||
|
einer Seite der Seitenkette der Relation 5 Tupel unterbringbar w\o'a"'ren,
|
||||||
|
auf einer Seite des B*-Baumes aber 25 Adressen.
|
||||||
|
Dann w\o'a"'re folgender B*-Baum mit zwei Baumebenen denkbar:
|
||||||
|
.DS L
|
||||||
|
|
||||||
|
______________________________
|
||||||
|
| 5 130 |
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
________________________ ________________________
|
||||||
|
| 5 10 .... 125| |130 135 .... 255|
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
_____ _____ _____ _____ _____ _____ _____
|
||||||
|
| | | | | | | | | | | | | |
|
||||||
|
| 0 | | 5 | | 10| |125| |130| |135| |255|
|
||||||
|
| : | | : | | : | ..... | : | | : | | : | ..... | : |
|
||||||
|
| : | | : | | : | | : | | : | | : | | : |
|
||||||
|
| 4 | | 9 | | 14| |129| |134| |139| | : |
|
||||||
|
| | | | | | | | | | | | | |
|
||||||
|
~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~ ~~~~~
|
||||||
|
|
||||||
|
.DE
|
||||||
|
Die Genauigkeit des B*-Baumes w\o'u"'rde gew\o'a"'hrleisten,
|
||||||
|
dass im Schl\o'u"'sselintervall 0 ... 254
|
||||||
|
maximal 5 Tupel sequentiell gesucht werden m\o'u"'ssten,
|
||||||
|
dass in diesem Intervall keine \o'U"'berlaufseiten auftreten
|
||||||
|
und dass bei der Ausgabe Sortierabweichungen
|
||||||
|
nur in 5-er Schritten auftreten k\o'o"'nnten:
|
||||||
|
.br
|
||||||
|
z.B.
|
||||||
|
.DS I 12
|
||||||
|
9, 11, 13, 12, 14, 10, 17
|
||||||
|
aber nie 9 nach 10, 11, 12, 13, 14
|
||||||
|
oder nie 15 vor 10, 11, 12, 13, 14
|
||||||
|
.DE
|
||||||
|
Allerdings w\o'u"'rden alle Tupel mit Schl\o'u"'sselwerten ab 255
|
||||||
|
in die letzte Seitenkette eingeordnet werden.
|
||||||
|
.LP
|
||||||
|
Beenden wir hiermit das Beispiel.
|
||||||
|
.LP
|
||||||
|
Der B*-Baum ist Bestandteil der Relation.
|
||||||
|
.sp1
|
||||||
|
.ti +5
|
||||||
|
.ne 8
|
||||||
|
(seine L\o'a"'nge ist berechenbar:
|
||||||
|
.IP \ \ \ \ \ - 8
|
||||||
|
Tupell\o'a"'nge der Adresse:
|
||||||
|
.br
|
||||||
|
gespreizter Schl\o'u"'sselcode
|
||||||
|
.IP
|
||||||
|
jede Baumebene ganz in Seiten)
|
||||||
|
.LP
|
||||||
|
Die durch den B*-Baum ermittelten Hauptseiten
|
||||||
|
sind Anfangsseiten von Seitenketten,
|
||||||
|
die unsortiert alle Tupel enthalten und deren Schl\o'u"'ssel den
|
||||||
|
gleichen Baumpfad nehmen.
|
||||||
|
In diesen Seitenketten werden keine doppelten Tupel zugelassen.
|
||||||
|
Die B*-Baum-Struktur gew\o'a"'hrleistet f\o'u"'r gewisse
|
||||||
|
Schl\o'u"'sselintervalle
|
||||||
|
eine Sortierung untereinander.
|
||||||
|
.LP
|
||||||
|
Der B*-Baum wird bei der Erzeugung der Relation
|
||||||
|
angelegt und bleibt \o'u"'ber deren gesamte Lebensdauer fest.
|
||||||
|
Es ist unsinnig, eine leere Relation
|
||||||
|
als isam zu gr\o'u"'nden, der B*-Baum w\o'a"'re entartet,
|
||||||
|
man w\o'u"'rde eine einzige Seitenkette erzeugen,
|
||||||
|
bei dem bei jedem Einf\o'u"'gen eines neuen Tupel
|
||||||
|
eine Duplikatkontrolle \o'u"'ber alle bereits
|
||||||
|
vorhandenen Tupel erfolgen w\o'u"'rde.
|
||||||
|
.LP
|
||||||
|
Bei der Erzeugung der isam Relation durch modify
|
||||||
|
kann man die Genauigkeit des B*-Baumes
|
||||||
|
durch den F\o'u"'llfaktor der Hauptseiten
|
||||||
|
bestimmen.
|
||||||
|
Die alte Relation wird zun\o'a"'chst in eine Speicherungsform analog
|
||||||
|
heapsort \o'u"'berf\o'u"'hrt, diese wird danach, entsprechend dem
|
||||||
|
F\o'u"'llfaktor, gespreizt
|
||||||
|
und \o'u"'ber den so entstandenen Hauptseiten
|
||||||
|
wird der B*-Baum aufgebaut.
|
||||||
|
.LP
|
||||||
|
Die Suche in einer isam Relation kann f\o'u"'r die Angabe
|
||||||
|
von einzelnen Schl\o'u"'sselwerten, als auch f\o'u"'r
|
||||||
|
Intervalle von ihnen unterst\o'u"'tzt werden.
|
||||||
|
Das Anf\o'u"'gen erfolgt zun\o'a"'chst in den
|
||||||
|
Hauptseiten - soweit der F\o'u"'llfaktor des
|
||||||
|
erzeugenden modify vorausschauend gen\o'u"'genden Restplatz
|
||||||
|
definiert - danach werden der jeweiligen Seitenkette
|
||||||
|
\o'U"'berlaufseiten angef\o'u"'gt.
|
||||||
|
Das \o'A"'ndern in der Relation erfolgt einschliesslich
|
||||||
|
der Suche und dem Ausschluss der Anlage doppelter Tupel.
|
||||||
|
.NH 3
|
||||||
|
.ft B
|
||||||
|
Die Gestaltung des Datenbankfilesystems
|
||||||
|
.br
|
||||||
|
f\o'u"'r \*(yy
|
||||||
|
.ft R
|
||||||
|
.NH 4
|
||||||
|
.ft B
|
||||||
|
Einordnung einer Datenbank
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
\*(yy\ wird installationsabh\o'a"'ngig
|
||||||
|
unter einem Anfangspfadnamen
|
||||||
|
.DS C
|
||||||
|
Pathname
|
||||||
|
.DE
|
||||||
|
installiert. Zum Beispiel ist
|
||||||
|
.DS C
|
||||||
|
Pathname = /mnt/ing_db
|
||||||
|
.DE
|
||||||
|
eingerichtet.
|
||||||
|
.LP
|
||||||
|
Unter diesem Pathname liegen eine Reihe hier nicht behandelter
|
||||||
|
Files und directories.
|
||||||
|
Die Datenbanken sind unter
|
||||||
|
.DS C
|
||||||
|
Pathname/data/base
|
||||||
|
.DE
|
||||||
|
eingerichtet, jede Datenbank erh\o'a"'lt ein directory ihres Namens:
|
||||||
|
.DS C
|
||||||
|
Pathname/data/base/dbname
|
||||||
|
.DE
|
||||||
|
In jedem directory dbname liegen
|
||||||
|
.sp1
|
||||||
|
.IP \ \ \ - 5
|
||||||
|
dbname/admin
|
||||||
|
.br
|
||||||
|
das s.g. admin-File mit allgemeinen Datenbankinformationen,
|
||||||
|
.sp1
|
||||||
|
.IP
|
||||||
|
die Systemkataloge
|
||||||
|
(die Relationen relation, references, attributes, integrity, protect, indexes),
|
||||||
|
die Relationen (Relationen schlechthin, Indizes)
|
||||||
|
.LP
|
||||||
|
Durch diese Struktur sind insbesondere
|
||||||
|
.DS B
|
||||||
|
base oder
|
||||||
|
dbname oder
|
||||||
|
SYS
|
||||||
|
.DE
|
||||||
|
mountbar.
|
||||||
|
.LP
|
||||||
|
Bei Erzeugung einer Datenbank mittels creatdb
|
||||||
|
wird das directory dbname
|
||||||
|
angelegt und werden die Systemkataloge eingerichtet.
|
||||||
|
.NH 4
|
||||||
|
.ft B
|
||||||
|
Bewertung des Relationennamens
|
||||||
|
.ft R
|
||||||
|
.LP
|
||||||
|
\*(yy\ speichert alle Daten einer Relation in einem \*(xx\-File
|
||||||
|
unter dem directory dbname.
|
||||||
|
Der File-Name wird aus dem vom Anwender
|
||||||
|
bei create oder retrieve into angegebenem Relationennamen
|
||||||
|
gebildet.
|
||||||
|
Dazu wird der Relationenname
|
||||||
|
.IP \ \ \ - 5
|
||||||
|
ggf. durch Leerzeichen (<blank>) auf 12 Bytes
|
||||||
|
verl\o'a"'ngert;
|
||||||
|
.br
|
||||||
|
dabei wird das erste in 2. bis 11. Position
|
||||||
|
gefundene "_" (<underscore>) durch "/" (<slash>)
|
||||||
|
ersetzt;
|
||||||
|
.IP
|
||||||
|
den 12 Bytes werden 2 Bytes als Code des
|
||||||
|
arbeitenden Nutzers (s. auch
|
||||||
|
-u-Flag bei quel(unix) im Referenz-Manual)
|
||||||
|
angef\o'u"'gt.
|
||||||
|
.LP
|
||||||
|
Dadurch wird es m\o'o"'glich, dass
|
||||||
|
.IP -
|
||||||
|
verschiedene Nutzer private Relationen gleichen
|
||||||
|
Namens in der gleichen Datenbank anlegen k\o'o"'nnen;
|
||||||
|
.IP -
|
||||||
|
ein Nutzer durch sinnvolle Verwendung des <underscore>
|
||||||
|
im Relationennamen die Verteilung der Relationen
|
||||||
|
auf das Wurzel-directory dbname oder in sub-directories
|
||||||
|
von dbname steuern kann.
|
||||||
Loading…
Reference in New Issue