Für Plattendateien bietet UPAM nachfolgende Funktionen:
Erstellen von Plattendateien - den Zugriff auf Sätze muss der Benutzer selbst programmieren (z.B. sequenziellen Zugriff oder assoziativen Zugriff mittels Hashverfahren).
Lesen von SAM- und ISAM-Dateien (OPEN INPUT) und Übertragen auf andere Datenträger (z.B. von Platte auf Band); die Eigenschaften der Dateien werden jeweils im FCB abgesetzt (z.B. BLKSIZE, RECSIZE, RECFORM). Dies ermöglicht es dem Benutzer, den Zugriff auf Sätze zu programmieren.
UPAM kann SAM- oder ISAM-Dateien nicht im UPDATE-Modus eröffnen.
ISAM-Dateien lassen sich wegen der komplexen Zusammenhänge zwischen Index- und Datenblöcken mit UPAM nicht effektiv verarbeiten. Man kann UPAM jedoch dazu benutzen, eine ISAM-Datei blockweise auf ein Band zu übertragen.
Shared-Update-Verarbeitung - mehrere parallele Aufträge können eine PAM-Datei gleichzeitig bearbeiten.
Die zulässigen OPEN-Modi bei Shared-Update-Verarbeitung einer PAM-Datei (Mono-System) sind detailliert im Kapitel „UPAM“ im Handbuch „Einführung in das DVS“ [1] beschrieben.
PAM-Makroaufrufe in Listenform (bis zu 255, die Aufrufe brauchen sich nicht alle auf die gleiche Datei zu beziehen) können mit einer UPAM-Ein-/Ausgabe-Anforderung abgearbeitet werden, d.h. es wird nur ein SVC benötigt. Die Kettung von PAM-Makros dient (ebenso wie gekettete Ein-/Ausgabe) der zeitlichen Optimierung von Benutzerprogrammen.
Benachrichtigung des Benutzerauftrags bei Beendigung einer UPAM-Ein-/Ausgabeoperation und Start eines Contingency-Prozesses (Eventing-Mechanismus)
Bei Dateien mit Dual Recording by Volume (DRV; siehe Handbuch „DRV“[ 15 ]): Information des Benutzers über den aktuellen Zustand (gegebenenfalls Kopien-Ausfall). Die Information wird bei der Ausführung einer Ein-/Ausgabe von UPAM angefordert und im FCB (Feld ID1DRVST) hinterlegt. Dieses Feld wird jedoch nur bei einer Änderung des DRV-Status aktualisiert.
Bei der Anwendung von UPAM auf eine Plattendatei ohne PAM-Schlüssel (BLKCTRL=DATA oder BLKCTRL=NO) ist Folgendes zu beachten:
Die Datei muss Standardblöcke haben (BLKSIZE=(STD,n))
Falls es sich nicht um eine ISAM-Datei handelt (FCBTYPE=SAM oder FCBTYPE= PAM), muss die Sekundärzuweisung mindestens so groß sein wie die vereinbarte Blockgröße (BLKSIZE).
Gekettete Ein-/Ausgabe
Gekettete Ein-/Ausgabe ermöglicht die gleichzeitige Ein-/Ausgabe von bis zu 255 logisch aufeinander folgenden PAM-Seiten in einer Datei mit einem PAM-Makroaufruf (nicht zu verwechseln mit der Verkettung von PAM-Makroaufrufen in Listenform mit dem Operanden CHAIN=). Sie vermindert so die Anzahl von Ein-/Ausgabe-Operationen (sowie Unterbrechungen) und führt zu einer Zeitersparnis bei der Verarbeitung. Auf der anderen Seite werden jedoch Arbeitsspeicherbedarf und Paging-Aufwand größer.
UPAM arbeitet mit geketteter Ein-/Ausgabe, wenn der Operand LEN im PAM-Makroaufruf einen Wert > STD bzw. > 2048 enthält.
Dateiende-Verarbeitung (EOF-Verarbeitung)
Bei einer Schreiboperation wird eine Sekundärzuweisung durchgeführt; die angegebenen PAM-Seiten werden der Datei angefügt.
Tritt bei einer Leseoperation die Dateiendebedingung auf, überträgt UPAM nur die zur Datei gehörenden PAM-Seiten in den Puffer.
UPAM informiert den aufrufenden Auftrag über die EOF-Verarbeitung folgendermaßen:
Ohne ereignisgesteuerte Verarbeitung:
Der Benutzerauftrag erhält die Steuerung am EXLST-Ausgang USERERR mit dem Fehlercode X'0922' im Feld ID1ECB des FCB. Das Feld ID1NBPP des FCB enthält die Anzahl der übertragenen PAM-Seiten. Ist der Wert dieses Feldes X'00', liegen alle zu lesenden PAM-Seiten außerhalb der Datei. Ist der Wert des Feldes größer als X'00', so hat der Benutzerauftrag eine Warte-Operation auszuführen, falls diese nicht in der Lese-Operation implizit enthalten war (d.h. in einer RDWT-Operation).
Mit ereignisgesteuerter Verarbeitung:
Liegen alle zu lesenden PAM-Seiten außerhalb der Datei, übergibt UPAM dem Benutzerauftrag die Steuerung am EXLST-Ausgang USERERR mit dem Fehlercode X'0922' im Feld ID1ECB des FCB. Gehört wenigstens eine der zu lesenden PAM-Seiten zur Datei, setzt UPAM den Basisprozess fort oder startet einen Contingency-Prozess (siehe Abschnitt „TU-Eventing - ereignisgesteuerte Verarbeitung"). Jetzt enthält das Feld IDECBNPA des FECB (= File Event Control Block, siehe "TU-Eventing - ereignisgesteuerte Verarbeitung") eine Anzeige, wie viele PAM-Seiten übertragen worden sind:X'00'
X'0n'alle zu lesenden PAM-Seiten wurden in den Puffer übertragen
n= Anzahl der PAM-Seiten, die zur Datei gehören und in den Puffer übertragen wurden
Sperren und Freigeben von PAM-Seiten
Es genügt, die Erste einer Reihe zu sperrender/freizugebender PAM-Seiten in einem PAM-Makroaufruf anzugeben; die Anzahl der zu sperrenden/freizugebenden Seiten ergibt sich aus dem Operanden LEN. Es ist jedoch zu beachten, dass der Dateizeiger nach einer LOCK- bzw. UNLOCK-Operation auf die letzte PAM-Seite verweist, die gesperrt/freigegeben wurde. Sie kann außerhalb der Datei liegen (s.o. „Dateiende-Verarbeitung“).
Eine LOCK- bzw. UNLOCK-Operation auf eine SHARUPD=NO oder SHARUPD=WEAK eröffnete Datei ist eine Nulloperation: Es wird lediglich der Zeiger auf die zuletzt bearbeitete Seite aktualisiert, dabei wird der LEN-Operand ausgewertet.
Verarbeitung von PAM-Schlüsseln
Für die Verarbeitung von PAM-Schlüsseln gibt es zwei Möglichkeiten:
Der Benutzer liest/schreibt jeden einzelnen Schlüssel einer Reihe von PAM-Seiten:
PAM-Makro-Operand MKEY=YES; Operand KEYFLD muss die Adresse eines genügend großen Bereichs angeben.Der Benutzer liest/schreibt nur den ersten Schlüssel einer Reihe von PAM-Seiten. Beim Schreiben wird den folgenden Blöcken derselbe Schlüssel zugeordnet wie dem ersten Block, lediglich die logische Blocknummer wird jeweils um 1 weitergezählt.
Hinweise zur UPAM-Verarbeitung von Plattendateien
Da ein Block erst bei einem expliziten Aktionsmakroaufruf in den Anwenderpuffer übertragen wird, entsteht eine Verzögerung. Deshalb muss eine asynchrone Ein-/Ausgabe mit dem Aktionsmakroaufruf WT beendet werden. Bei TU-Eventing sollte man den Makro SOLSIG (asynchron oder synchron) verwenden.
Bei jedem nicht erfolgreichen Sprung in die UPAM-Routinen wird die Steuerung an die Routine übertragen, die im EXIT-Operanden des FCB angegeben ist bzw. an die entsprechende EXLST-Routine. Im FCB wird ein Kennzeichen gespeichert.
Bei jeder von UPAM veranlassten Programmbeendigung versorgt UPAM die Register 0, 1 und 15, die in Speicherauszügen leicht auszuwerten sind.
Register 0 Register 1 | Adresse, an der der Abbruch auftrat Adresse des Elements einer UPAM-Operandenlistenkette, in dem der Fehler entdeckt wurde |
Register 15 | UPAM-Fehlercode |
Enthält Register 1 beim ersten Aufruf des PAM-Makros eine ungültige Adresse, wird im Speicherauszug das Register 0 diese ungültige Adresse und Register 1 Nullen enthalten (d.h. der Fehler trat auf, bevor das erste Element der Operandenlistenkette gefunden wurde).
UPAM verwendet folgende EXLST-Ausgänge:
ERRADDR USERERR | Hardwarefehler oder abnormale Ein-/Ausgabebeendigung Unzulässige Makroanwendung im Programm oder Lesezugriff auf eine nicht zur Datei gehörende PAM-Seite (Dateiende) |
EOFADDR PGLOCK | Versuch, eine *DUMMY-Datei zu lesen Nicht alle angeforderten Sperren sind innerhalb der gegebenen Zeit verfügbar, und der Auftrag hält momentan keine Sperren |
DLOCK | Die Anforderung einer Sperre wird abgewiesen und der Auftrag hält bereits Sperren |
PAM-Seiten, die einer Datei zugewiesen, aber vom Eigentümer dieser Datei noch nicht geschrieben wurden, sind an ihrem systemintern verschlüsselten Dateinamen (CFID=Coded File ID, Byte 0-3 des PAM-Schlüssels bzw. des Blockkontrollfeldes) zu erkennen, der dann mit dem aktuellen Dateinamen nicht übereinstimmt. Der Vergleich ist vom Benutzer durchzuführen, wobei Folgendes zu beachten ist (siehe auch Operand KEYFLD im PAM-Makroaufruf, "PAM - UPAM-Aktionen ausführen"):
Zum OPEN-Zeitpunkt wird die aktuelle CFID in das erste Wort im Feld ID1KEY1 des FCB geschrieben.
Die folgenden Punkte gelten nur bei der Verarbeitung von K-PAM-Dateien (BLK-CONTR=PAMKEY):
Nach Ausführung einer RDWT-, LRDWT- oder RDEQU-Operation steht die CFID des gelesenen Blocks im ersten Wort des FCB-Feldes ID1KEY2.
Nach Ausführung einer der Operationen WRT, WRTWT, WRTWU, WT steht die CFID der betreffenden PAM-Seite im ersten Wort des FCB-Feldes ID1KEY1. Der von OPEN erstellte Eintrag wird überschrieben; er sollte daher vor der Verarbeitung für spätere Vergleiche sichergestellt werden.
Nach Ausführung der Operationen LRD und RD ist der Inhalt der Felder ID1KEY1 und ID1KEY2 unverändert.
Bei ereignisgesteuerter Verarbeitung steht nach dem Abschluss einer Ein-/Ausgabeoperation die CFID der betreffenden PAM-Seite im ersten Wort des FCB-Feldes ID1KEY1.
Die Felder ID1LWB (PARMOD=24) bzw. ID1LWBPT (PARMOD=31) im FCB enthalten die Adresse des letzten Blocks, auf dem von UPAM eine Ein-/Ausgabeoperation erfolgreich durchgeführt wurde. Als Anzeige für einen evtl. noch ausstehenden WT wird das linke Byte des Feldes ID1LWB verwendet.
War die letzte UPAM-Operation für die Datei ein erfolgreicher WT, erhält die Anzeige in ID1LWB den Wert X'00' und die drei niederwertigen Byte des Feldes ID1LWB bzw. das Feld ID1LWBPT enthalten die Adresse des Blocks, auf den der WT sich bezog. Dabei spielt es keine Rolle, ob die den WT auslösende Operation erfolgreich abgeschlossen wurde.
Hat die letzte UPAM-Operation für die Datei keinen WT ausgelöst, wird die Anzeige in ID1LWB auf den Wert X'FF' gesetzt. Der Inhalt der rechten drei Byte von ID1LWB bzw. ID1LWBPT ist dann ohne Bedeutung.