Regeln zur logischen Dateiverlängerung:
Eine Datei wird bis zur letzten Seite im Zustand MODIFIED verlängert, die hinter der bisher logisch letzten Seite liegt und im SAVE-Bereich und in einem Fenster enthalten ist.
Seiten, die im neuen Dateibereich liegen, um den die Datei verlängert wird, werden in die Datei geschrieben, wenn sie sowohl im SAVE-Bereich als auch in einem Fenster enthalten sind.
Nicht-modifizierte Seiten im neuen Dateibereich werden mit X'00' geschrieben.
Seiten, die nicht gleichermaßen im SAVE-Bereich und in einem Fenster enthalten sind, werden nicht in die Datei geschrieben.
Das DISPOS-Attribut des Fensters (bzw. der Fenster) spielt bei einer Dateiverlängerung keine Rolle.
Die logisch letzte Dateiseite ist die logisch letzte Dateiseite aus der Sicht der eigenen Task. Eine andere Task kann (bei SHARUPD=*YES) die logisch letzte Seite verändert haben, ohne dass die Veränderung der eigenen Task bekannt wurde.
Auf diese Weise kann eine Dateiverlängerung einer parallelen Task wieder rückgängig gemacht werden.
Beispiel 1: Datei logisch verlängern
Legende
1...10 | Seiten-Nummer (Datei/Fenster) |
aI | alter Inhalt |
bllS | bisher logisch letzte Seite |
M | modifiziert |
nI | neuer Inhalt |
nllS | neue logisch letzte Seite |
-- | undefinierter Inhalt |
Erläuterung
Die Datei ist physikalisch 10 Seiten (1 Seite = 4 KB) lang. Das logische Dateiende ist die Seite 5. Der SAVE-Bereich umfasst die Seiten 1-10. Die letzte modifizierte Fensterseite des SAVE-Bereiches ist die Seite 8.
Unabhängig von der DISPOS-Eigenschaft des Fensters werden zwischen der bisher logisch letzten Seite und der neuen logisch letzten Seite alle modifizierten Seiten in die Datei auf Platte geschrieben und alle nicht-modifizierten Seiten mit X'00' in der Plattendatei initialisiert.
Für den übrigen Bereich (Seite 1 bis bisher logisch letzte Seite) ist zu unterscheiden:
DISPOS=*OBJECT:
Es werden nur die modifizierten Seiten in die Datei geschrieben.DISPOS=*UNCHNG:
Modifizierte Seiten werden ebenfalls in Datei auf Platte geschrieben.
Nicht-modifizierte Seiten, die noch nicht (durch SAVE) in die Datei geschrieben wurden, werden in der Datei mit X'00' initialisiert (Seite 5). Sie erhalten danach den Seitenzustand SAVED.
Im Beispiel wird angenommen, dass die Seiten 2 und 3 schon einmal durch SAVE in die Datei geschrieben wurden. Für nicht-modifizierte Seiten, die schon einmal durch SAVE in die Datei geschrieben wurden (Seite 2 und Seite 3), werden keine Aktionen durchgeführt.
Beispiel 2: Datei logisch verlängern
Legende
1...10 | Seiten-Nummer (Datei/Fenster) |
aI | alter Inhalt |
bllS | bisher logisch letzte Seite |
M | modifiziert |
nI | neuer Inhalt |
nllS | neue logisch letzte Seite |
-- | undefinierter Inhalt |
Erläuterung
Die Datei ist 10 Seiten lang. Das logische Dateiende ist die Seite 2. Die Dateiseiten 1-3 werden dem Fenster 1 zugeordnet, die Seiten 6-10 dem Fenster 2.
Es wird ein 8 Seiten langer SAVE-Bereich definiert. Er erstreckt sich über Fenster 1 und die ersten drei Seiten von Fenster 2.
Die letzte modifizierte Fensterseite des SAVE-Bereichs ist die Seite 8. Seite 8 liegt hinter dem bisher logischen Dateiende und wird daher zum neuen logischen Dateiende (neue letzte logische Seite).
Unabhängig von der DISPOS-Eigenschaft des Fensters werden zwischen der bisherigen logisch letzten Seite und der neuen logisch letzten Seite alle modifizierten Seiten in die Datei auf Platte geschrieben (Seite 6 und 8) und alle nicht-modifizierten Fensterseiten mit X'00' in der Plattendatei initialisiert (Seite 3 und 7).
Für den übrigen Bereich (Seite 1 bis bisherige logisch letzte Seite) ist zu unterscheiden:
DISPOS=*OBJECT:
Es werden nur die modifizierten Seiten in die Datei geschrieben (Seite 1).DISPOS=*UNCHNG:
Modifizierte Seiten werden ebenfalls in Datei auf Platte geschrieben.
Nicht-modifizierte Seiten, die noch nicht (durch SAVE) in die Datei geschrieben wurden, werden in der Datei mit X'00' initialisiert (Seite 2). Sie erhalten danach den Seitenzustand SAVED.
(Für nicht-modifizierte Seiten, die schon einmal durch SAVE in die Datei geschrieben wurden, werden keine Aktionen durchgeführt, siehe auch vorhergehendes Beispiel).
Die Seiten 4 und 5 bleiben in der Datei unverändert, da für sie kein Fenster existiert. Da sie hinter dem bisherigen logischen Dateiende liegen, ist ihr Inhalt undefiniert.
Die Änderungen auf Seite 9 und 10 in Fenster 2 werden nicht auf die Platte zurückgeschrieben, da diese Seiten nicht im SAVE-Bereich liegen.