INTERFACEFileInfo ;
file status cache
--------------------------------------------------------------------------
IMPORT Fingerprint, TextSeq, Wr; IMPORT APN, APNSeq, FileStatus, FindExpr, MsgIF; IMPORT TextHashTbl, APNHashTbl AS AbsPathnHashTbl;--------------------------------------------------------------------------
CONST Brand = "FileInfo";--------------------------------------------------------------------------
TYPE T <: Public; (*object type for file status caches*) Public = OBJECT METHODS (*----------------------------------------------------------------------*) init (sizeHint : CARDINAL; base : APN.T; msgif : MsgIF.T := NIL) : T; (*Initialization with a size hint and a base path. The base path is present to make path processing more efficient. All subsequent operations are performed relative to this path. In particular, note that any parameter of p in the methods below is internally concatenated with base. As a consequence, it is inefficient to initialize base to, say, "." and instantiate p to the same path, because this will lead to internal pathnames with a prefix of "././". The right thing to do in this case is to instantiate base to "." and p to "". Generally speaking, one should always make base as long and p as short as possible. If base is NIL or has got an empty text denotation, then it will be ignored in all cache operations. Error Conditions: invalid instantiation of base*) (*----------------------------------------------------------------------*) getBase () : APN.T; (*return the base pathname Error Conditions self = NIL*) (*----------------------------------------------------------------------*) size () : CARDINAL; (*return the number of entries Error Conditions: self = NIL*) (*----------------------------------------------------------------------*) getStatus (p : APN.T) : FileStatus.T; (*Look up the status of the file or directory b/p, where b is the base path. Do not >update< the status. If the cache does not contain any status entry for b/p, then create one and return it. The exists-flag contained in this entry is set to false. Note that getStatus will return exists = false if p is of the form ./q and, at the same time, the status record in the cache is associated not with ./q but with q, and conversely. If p is an absolute pathname or base is undefined, then just p will be used for the operations described above. Error Conditions: self = NIL invalid instantiation of p*) (*----------------------------------------------------------------------*) update (READONLY p : APN.T) : FileStatus.T; (*Update the status of the file b/p, where b is the base path, and return it. If p is an absolute pathname or base is undefined, then just p will be used for the operations described above. Error Conditions: self = NIL invalid instantiation of p*) (*----------------------------------------------------------------------*) updateRec ( p : APN.T; ext : TextSeq.T; ignoreDirs : APNSeq.T; ignoreDirExpr : FindExpr.T := NIL; ignoreFileExpr : FindExpr.T := NIL ); (*Update recursively starting from b/p, where b is the base path. As for files, update an entry for a file only if its extension is in ext, but update an entry for each file if ext is empty; as for directories, do not traverse any directory whose name is in ignoreDirs, or whose name is matched by ignoreDirExpr. Do not cache any file name matched by ignoreFileExpr. If p is an absolute pathname or base is undefined, then just p will be used for the operations described above. Error Conditions: self = NIL invalid instantiation of p Remarks ignoreDirs = NIL is allowed and has the expected effect.*) (*----------------------------------------------------------------------*) updateFlat ( p : APN.T; ext : TextSeq.T; ignoreDirExpr : FindExpr.T := NIL; ignoreFileExpr : FindExpr.T := NIL ) : APNSeq.T ; (*Update non-recursively starting from b/p, where b is the base path, and return a list of all updated entries. As for files, update an entry for a file only if its extension is in ext, but update an entry for each file if ext is empty; as for directories, do not traverse any of them. Do not update any files whose name matches ignoreFileExpr. If p is an absolute pathname or base is undefined, then just p will be used for the operations described above. Error Conditions: self = NIL invalid instantiation of p*) (*----------------------------------------------------------------------*) getDir(READONLY p : APN.T) : APNSeq.T; (* Get all filenames of directory `p' that are contained in the cache. If `p' is not contained in the cache, this method returns NIL. *) (*----------------------------------------------------------------------*) dirList(p : APN.T; long := TRUE) : TEXT; (* Get a listing of directory `p', that is all information of `p' that is contained in the cache. If `long' is true, then the file type and modification time are included; otherweise only the file name is listed. If `p' is not contained in the cache, this method returns NIL. *) (*----------------------------------------------------------------------*) fingerprint( READONLY p : APN.T; READONLY ignoreDirExpr : FindExpr.T := NIL; READONLY ignoreFileExpr : FindExpr.T := NIL ) : REF Fingerprint.T; (* Compute a fingerprint for file or directory `p'. If `p' is a file, the fingerprint is computed based on the name and the modification time of `p'. If `p' is a directory, then the fingerprint is based on the fingerprints of all contained files and directories as well. If `p' is not contained in the cache, this method returns NIL. Do not use any directories matched by `ignoreDirExpr' and any files matched by `ignoreFileExpr' to compute the fingerprint. *) (*----------------------------------------------------------------------*) dump (wr : Wr.T); (* dump the cache contents to wr for debugging purposes *) END (*of Public*);--------------------------------------------------------------------------
PROCEDURE TextSeqToTextHashTbl(s : TextSeq.T) : TextHashTbl.T; PROCEDURE AbsPathnSeqToAbsPathnHashTbl(s : APNSeq.T) : AbsPathnHashTbl.T;
Auxiliary procedures for the conversion of sequences of strings or abstract pathnames to hash tables of strings or abstract pathnames.A NIL argument sequence is allowed and will be converted to a hash table that has been initialized with a size hint of 0.
--------------------------------------------------------------------------
PROCEDURE ComputeFingerprint( self : T; READONLY p : APN.T; READONLY ignoreDirExpr : FindExpr.T := NIL; READONLY ignoreFileExpr : FindExpr.T := NIL) : REF Fingerprint.T; PROCEDURE ComputeFingerprintRec( self : T; READONLY p : APN.T; READONLY ignoreDirExpr : FindExpr.T := NIL; READONLY ignoreFileExpr : FindExpr.T := NIL) : REF Fingerprint.T;--------------------------------------------------------------------------
END FileInfo.