<> <> <> <<(The interface to read and write the log file used to record actions to be performed. The log file is used solely to recover from crashes of the server or the workstation -- if the server is unavailable when an operation is attempted it will persist in the log file over crashes of the workstation)>> <> <<>> DIRECTORY BasicTime USING [GMT], FingerOps, Rope USING [ROPE]; <<>> FingerLog: CEDAR DEFINITIONS = BEGIN LogEntry: TYPE = REF LogEntryObject; LogEntryObject: TYPE = RECORD[SELECT type: * FROM StateChange => [event: FingerOps.StateChange, user: Rope.ROPE, time: BasicTime.GMT, machine: Rope.ROPE], UserPropChange => [user, name, val: Rope.ROPE, time: BasicTime.GMT], <> MachinePropChange => [machine, name, val: Rope.ROPE], <> AddMachineProp => [name: Rope.ROPE, version: INT], <> AddUserProp => [name: Rope.ROPE, version: INT], DeleteUserProp => [name: Rope.ROPE, version: INT], DeleteMachineProp => [name: Rope.ROPE, version: INT], Nothing => [] ENDCASE ] _ [Nothing[]]; -- to keep Lupine happy FlushLog: PROC[]; <> Log: PROC[ logEntry: LogEntry ]; <> ParseLog: PROC[] RETURNS[ stateLog: LIST OF LogEntry ]; <> END.