home *** CD-ROM | disk | FTP | other *** search
- (*------------------------------------------------------------*)
- (* CACHE.INC *)
- (* Cache-Modul fuer die B-Baume der Telefondatei *)
- (*------------------------------------------------------------*)
- (* Der Cache wird auf seine Anfangswerte gesetzt, nach dem *)
- (* Aufruf ist er leer. Eventuell vorhandene Datensaetze *)
- (* werden nicht gerettet. *)
- PROCEDURE init_cache;
-
- VAR cnr: INTEGER;
-
- BEGIN
- FOR cnr := 0 TO cache_anz DO BEGIN
- cache[cnr].update := FALSE;
- cache[cnr].snr := -1;
- cache[cnr].stat := Pred(MaxInt)
- END
- END;
- (*------------------------------------------------------------*)
- (* Alle seit dem letzten Lesezugriff geaenderten und alle *)
- (* neuen Datensaetze werden aus der Cache gerettet. *)
- PROCEDURE save_cache;
-
- VAR nr: INTEGER;
-
- BEGIN
- FOR nr := 0 TO cache_anz DO BEGIN
- IF cache[nr].update THEN BEGIN
- Seek(bbaum, cache[nr].snr);
- Write(bbaum, cache[nr].seite)
- END
- END
- END;
- (*------------------------------------------------------------*)
- (* Cache oeffnen (Parameter = TRUE) bzw. schliessen. *)
- PROCEDURE access(on: BOOLEAN);
- BEGIN
- IF on THEN BEGIN
- ReSet(bbaum); ReSet(freiseiten);
- ReSet(datei); ReSet(freisaetze);
- init_cache
- END
- ELSE BEGIN
- save_cache;
- Close(bbaum); Close(freiseiten);
- Close(datei); Close(freisaetze)
- END
- END;
- (*------------------------------------------------------------*)
- (* Cache-Position der angegebene Seite suchen, wenn nicht *)
- (* vorhanden, wird -1 zurueckgegeben. *)
- PROCEDURE search_cache_nr(seiten_nr: fileindex;
- VAR cache_nr: INTEGER);
-
- VAR cnr: INTEGER;
-
- BEGIN
- cache_nr := -1;
- FOR cnr := 0 TO cache_anz DO
- IF cache[cnr].snr=seiten_nr THEN cache_nr := cnr
- ELSE IF cache[cnr].snr >= 0 THEN
- cache[cnr].stat := Succ(cache[cnr].stat);
- IF cache_nr >= 0 THEN cache[cache_nr].stat := 0
- END;
- (*------------------------------------------------------------*)
- (* Bisher unbenutzte bzw. am laengsten nicht mehr benutzte *)
- (* Cache-Adresse suchen, ggf. Datensatz retten. *)
- PROCEDURE search_unused_cache_nr(VAR cache_nr: INTEGER);
-
- VAR cnr, max_stat: INTEGER;
-
- BEGIN
- max_stat := 0;
- FOR cnr := 0 TO cache_anz DO BEGIN
- IF cache[cnr].stat>max_stat THEN BEGIN
- max_stat := cache[cnr].stat;
- cache_nr := cnr
- END
- END;
- IF cache[cache_nr].update THEN BEGIN
- Seek(bbaum, cache[cache_nr].snr);
- Write(bbaum, cache[cache_nr].seite)
- END;
- cache[cache_nr].stat := 0; cache[cache_nr].update := FALSE
- END;
- (*------------------------------------------------------------*)
- (* Seite unter Beruecksichtigung d. Cache a. Indexdatei lesen *)
- PROCEDURE get_page(seiten_nr: fileindex; VAR seite: Page);
-
- VAR cache_nr: INTEGER;
-
- BEGIN
- search_cache_nr(seiten_nr, cache_nr);
- IF cache_nr >= 0 THEN seite := cache[cache_nr].seite
- ELSE BEGIN
- Seek(bbaum, seiten_nr); Read(bbaum, seite);
- search_unused_cache_nr(cache_nr);
- cache[cache_nr].snr := seiten_nr;
- cache[cache_nr].seite := seite
- END
- END;
- (*------------------------------------------------------------*)
- (* Seite unter Beruecks. d. Cache i.d. Indexdatei speichern *)
- PROCEDURE put_page(seiten_nr: fileindex; VAR seite: Page);
-
- VAR cache_nr: INTEGER;
-
- BEGIN
- search_cache_nr(seiten_nr, cache_nr);
- IF cache_nr < 0 THEN BEGIN
- search_unused_cache_nr(cache_nr);
- cache[cache_nr].snr := seiten_nr
- END;
- cache[cache_nr].seite := seite; cache[cache_nr].update := TRUE
- END;
- (*------------------------------------------------------------*)
- (* Neue Seite erzeugen, vorhandene Freiseite wird verwendet. *)
- PROCEDURE generate_page(seite: Page; VAR seiten_nr: fileindex);
-
- VAR nr: INTEGER;
- folgeseite: Page;
- fs_nr: fileindex;
-
- BEGIN
- seiten_nr := -1; Seek(freiseiten, 0);
- WHILE NOT(Eof(freiseiten)) AND (seiten_nr<0) DO
- Read(freiseiten, seiten_nr);
- IF seiten_nr < 0 THEN BEGIN (*neue Seite anhaengen*)
- seiten_nr := FileSize(bbaum);
- Seek(bbaum, seiten_nr); Write(bbaum, seite)
- END
- ELSE BEGIN (*Freivermerk aus Freiseite-Liste streichen*)
- fs_nr := -1;
- Seek(freiseiten, FilePos(freiseiten)-1);
- Write(freiseiten, fs_nr)
- END;
- put_page(seiten_nr, seite);
- FOR nr := 0 TO seite.anz DO BEGIN
- IF seite.nf[nr] > 0 THEN BEGIN
- get_page(seite.nf[nr], folgeseite);
- folgeseite.vg := seiten_nr;
- put_page(seite.nf[nr], folgeseite)
- END
- END
- END;
- (*------------------------------------------------------------*)
- (* Angegebene Seite freigeben, falls Wurzelseite, wird der *)
- (* Zeiger auf der Nullseite auf 0 fuer "leerer Baum" gesetzt. *)
- PROCEDURE remove_page(seite: Page; seiten_nr: fileindex);
-
- VAR fs_nr: fileindex;
-
- BEGIN
- Seek(freiseiten, 0); fs_nr := -1;
- WHILE NOT(Eof(freiseiten)) AND (fs_nr<>0) DO
- Read(freiseiten, fs_nr);
- IF fs_nr = 0 THEN Seek(freiseiten, FilePos(freiseiten)-1);
- Write(freiseiten, seiten_nr);
- IF seite.vg = 0 THEN put_page(0, seite)
- END;
- (*------------------------------------------------------------*)
- (* Systemdateien auf Diskette ggf. loeschen u. neu erzeugen *)
- PROCEDURE create;
-
- VAR nullseite: Page;
-
- BEGIN
- ReWrite(datei); ReWrite(freisaetze);
- ReWrite(bbaum); ReWrite(freiseiten);
- init_cache; nullseite.vg := 0;
- put_page(0, nullseite);
- access(FALSE)
- END;
- (*------------------------------------------------------------*)
- (* Ende CACHE.INC *)
-