Bevor eine Datei verarbeitet werden kann, muss sie mit einem OPEN-Makroaufruf eröffnet werden. Für ISAM-Dateien sind folgende Eröffnungsmodi zulässig: OUTPUT, OUTIN, EXTEND, INOUT, INPUT. Gleichzeitig muss überprüft werden, ob die Datei bereits von einem anderen Auftrag geöffnet ist, in welchem ISAM-Pool sie verarbeitet werden soll, ob sie im Übertragungs- oder im Locate-Mode zu verarbeiten ist, usw.
OUTPUT | es wird eine neue Datei sequenziell erstellt, es ist nur der PUT-Makroaufruf erlaubt. |
OUTIN | wie bei OPEN OUTPUT wird eine neue Datei erstellt, eine evtl. vorher bestehende Datei wird überschrieben. Es sind alle ISAM-Aktionen zulässig. |
EXTEND | eine bestehende Datei wird sequenziell erweitert; wie bei OUTPUT sind nur Schreiboperationen mit PUT zulässig. |
INOUT | eine existierende Datei soll aktualisiert werden: wie bei OUTIN sind alle ISAM-Aktionen erlaubt wie Suchen, Lesen, Ändern, Einfügen und Löschen von Sätzen. |
INPUT | eine existierende Datei soll gelesen werden, es sind nur Leseoperationen zulässig. |
Betriebsarten
ISAM-Dateien werden normalerweise im Move-Mode (Übertragungsbetrieb) verarbeitet; Dateiverarbeitung im Locate-Mode (Ortungsbetrieb) ist möglich, wird bei NK-ISAM allerdings nur noch aus Kompatibilitätsgründen unterstützt.
Aktionsmakroaufruf | OPEN-Typ | OPEN-Typ | OPEN-Typ | OPEN-Typ | OPEN-Typ |
GET | B | - | - | B | B |
GETR | B | - | - | B | B |
GETFL | B | - | - | B | B |
GETKY | B | - | - | B | B |
PUT | - | B | B | B | B |
PUTX | - | - | - | B | B |
INSRT | - | - | - | M | M |
STORE | - | - | - | M | M |
ELIM | - | - | - | x | x |
SETL | x | - | - | x | x |
Tabelle 3: ISAM-Aktionsmakroaufrufe und OPEN-Typ
Legende
M: Übertragungsbetrieb (Ortungsbetrieb, nur wenn der Arbeitsbereich versorgt wurde)
B: Übertragungs- oder Ortungsbetrieb möglich
x: Aktionsmakroaufruf zulässig
-: Aktionsmakroaufruf nicht zulässig
OPEN-Fehler bei der Verarbeitung von NK-ISAM-Dateien
NK-ISAM-Datei auf Band: Beim Importieren/Zurückschreiben der Banddatei wurde ein falsches Datenformat im FILE- oder FCB-Makroaufruf angegeben.
Der ISAM-Pool, in dem eine NK-ISAM-Datei eröffnet werden soll, ist überlastet: OPEN-Verarbeitung wird mit dem Fehlercode DMS0D9B abgewiesen.
Bei jedem SVC-Einstieg wird eine Überprüfung der Größe der betroffenen NK-ISAM-Datei anhand der im File Table Entry verankerten Extent-Liste durchgeführt. Wird dabei eine Dateigröße über 32 GB ermittelt und hat der Aufrufer in seinem FCB das Attribut LARGE_FILE=*FORBIDDEN gesetzt, wird die Verarbeitung abgebrochen. NK-ISAM liefert in diesem Fall den Returncode X'00000A23'
(FILE SIZE GROESSER 32 GIGABYTES IST NICHT ERLAUBT
).
Übernahme der Dateieigenschaften in den FCB
Die Inhalte von FCB-Feldern für Dateieigenschaften können vom Wert des entsprechenden Operanden im FILE-Aufruf abweichen; dies gilt z.B. für KEYPOS, KEYLEN, PAD und BLKSIZE. Wenn „n“ der Wert des Feldes KEYPOS und „m“ der Wert von KEYLEN im Katalogeintrag bzw. in TFT oder FCB-Makroaufruf ist, gilt für geöffnete Dateien:
das Feld KEYLEN im TU-FCB hat den Inhalt m-1
das Feld KEYPOS im TU-FCB hat für RECFORM = F den Inhalt (n+4)-1 = n+3
Der PAD-Wert wird nur dann berücksichtigt, wenn die Datei sequenziell mit PUT-Makroaufruf erstellt wird. Die Makroaufrufe INSRT und STORE verwenden den gesamten Speicherplatz eines Datenblocks. Bei beiden Funktionen kann es schon bei Dateierstellung zum Blocksplitting kommen.
Auch der Inhalt des Feldes BLKSIZE im TU-FCB kann vom Wert des BLKSIZE-Operanden in FILE, FCB-Makroaufruf oder Katalogeintrag abweichen: außer bei INPUT-Dateien wird der BLKSIZE-Wert unter Berücksichtigung des PAD-Wertes neu berechnet (BLKSIZE minus PAD) und im FCB-Feld BLKSIZE hinterlegt.
Beispiel
Katalogeintrag: BLKSIZE=(STD,3); PAD=15 (Standard). Der Inhalt von BLKSIZE im TU-FCB errechnet sich folgendermaßen: (3 * 2048) * (1.0 - 0.15); im Feld BLKSIZE steht während der Verarbeitung der Wert X'1467'.
DUMMY-Dateien
Für Testzwecke, vor allem für das Testen von Fehler-Routinen des Anwenderprogramms, eignen sich sog. DUMMY-Dateien, die im FILE-Makroaufruf mit *DUMMY definiert werden. Bei der Verarbeitung solcher DUMMY-Dateien finden keine Ein-/Ausgaben statt. Leseversuche führen zum Ansprung von Fehler-Routinen, Schreibaufrufe werden ignoriert, d.h. es wird in jedem Fall eine Nulloperation (d.h. keine Operation) durchgeführt.
Die folgende Tabelle zeigt, welche Ereignisse bei den ISAM-Leseoperationen auftreten.
Leseoperation | Makro | Ereignis | EXLST-Ausgang | Meldung |
sequenzielles Lesen | GET/GETR | Dateiende | EOFADDR | DMS0AAE |
Lesen mit Schlüssel | GETKY | Schlüssel nicht vorhanden | NOFIND | DMS0AA8 |
Lesen über Flags | GETFL | Schlüssel nicht vorhanden | NOFIND | DMS0AA8 |
GETFL | Dateiende | EOFADDR | DMS0AAE |
Blockfüllung: PAD-Wert
Bei sequenzieller Dateierstellung mit PUT kann der Anwender über den PAD-Operanden in FILE oder FCB bestimmen, wie viel Platz in den Datenblöcken freibleiben soll. Dieser Platz wird benötigt, wenn bei einer späteren Aktualisierung die Sätze in der Datei verlängert werden. Standardmäßig gilt PAD=15, d.h. 15 Prozent des Speicherplatzes im Datenblock bleiben frei. Wenn mit einem PUT-Aufruf diese Grenze erreicht wird, wird für den folgenden Satz ein neuer Datenblock angelegt.
Für NK-ISAM-Dateien gilt: sobald diese PAD-Grenze überschritten ist, wird ein neuer Datenblock angefordert; K-ISAM fordert einen neuen Datenblock bereits an, bevor die PAD-Grenze überschritten wird.
Beim sequenziellen Erstellen (PUT) nimmt der Platzbedarf einer Datei mit steigendem PAD-Faktor zu. Durch geeignete Wahl des PAD-Faktors lässt sich jedoch die nachfolgende Dateiverarbeitung (STORE/INSRT) optimieren: in den Datenblöcken ist so viel freier Platz vorzusehen, dass es bei Dateierweiterungen nicht zum Blocksplitting kommt. Zur richtigen Wahl des PAD-Faktors ist also eine Prognose erforderlich, in welchem Umfang die Datei wachsen wird.
Werden ISAM-Dateien mit STORE erstellt, hat PAD keinen Einfluss auf die Blockfüllung: STORE schreibt solange Sätze in einen Datenblock, bis dieser gefüllt ist. Wird noch ein weiterer Satz geschrieben, der nicht mehr in den Datenblock passt, kommt es zum Blocksplitting; die Blöcke werden in der Regel nur zu 50 % gefüllt.
Auch wenn die Datei zwar mit PUT, aber nicht über einen Ein-/Ausgabebereich im Programm erstellt wird, ist die PAD-Angabe wirkungslos (der Ein-/Ausgabebereich wird im FCB mit IOAREAn definiert; siehe unter „Programmpuffer = Ein-/Ausgabebereich im Benutzerprogramm"). Jeder PUT-Aufruf löst eine Schreiboperation aus, und das DVS versucht, den aktuellen Satz im letzten Datenblock unterzubringen. Erst wenn dieser gefüllt ist, legt es einen neuen Datenblock an.
Programmpuffer = Ein-/Ausgabebereich im Benutzerprogramm
Verwendet ein Programm einen eigenen Ein-/Ausgabebereich, muss dieser mindestens die Größe eines Datenblocks haben (= n * 2048 Byte, 1 <= n <= 16) entsprechend BLKSIZE=(STD,n). Standardmäßig wird vom System ein Ein-/Ausgabebereich im Klasse-5-Speicher angelegt.
Die Existenz eines vom Benutzer in seinem Programm mit IOAREA1/2 definierten Ein-/Ausgabebereichs ist vor allem bei sequenzieller Verarbeitung von ISAM-Dateien von Vorteil durch die Reduzierung von SVCs:
sequenzielles Lesen (GET/GETR): bei der ersten Leseoperation werden so viele Sätze wie möglich in den Ein-/Ausgabebereich übertragen, bevor der erste Satz dem Programm zur Verfügung gestellt wird. Bei den nachfolgenden Leseoperation werden dem Programm dann die weiteren im Ein-/Ausgabebereich vorhandenen Sätze zur Verfügung gestellt. Eine erneute Ein-/Ausgabe erfolgt erst, wenn alle Sätze gelesen sind.
sequenzielles Schreiben (PUT): bei sequenzieller Dateierstellung oder -erweiterung werden die Sätze im Ein-/Ausgabebereich gesammelt, bis er gefüllt ist (PAD-Wert wird berücksichtigt) oder die sequenzielle Verarbeitung durch Aufruf einer anderen Operation beendet wird. Es ist also darauf zu achten, dass „PUT“-Folgen nicht durch andere Aktionsaufrufe unterbrochen werden, da dann jedes Mal aus dem Inhalt des Ein-/Ausgabebereichs ein Datenblock gebildet wird und so Datenblöcke mit geringer Blockfüllung entstehen können.
Für NK-ISAM kann im Move-Mode (Move Mode) auf den Ein-/Ausgabebereich verzichtet werden (im FCB: IOAREA1=NO). Jeder Aktionsmakroaufruf führt dann zu einem SVC.