<<>> <> <> <> <> <<>> <> <> <<>> DIRECTORY BasicTime USING [GMT, nullGMT], FS USING [nullOpenFile, OpenFile], IO USING [STREAM], Rope USING [ROPE], WalnutDefs USING [CheckReportProc, WalnutOpsHandle], WalnutKernelDefs USING [WhichTempLog]; WalnutRoot: CEDAR DEFINITIONS = BEGIN <<>> <> GMT: TYPE = BasicTime.GMT; ROPE: TYPE = Rope.ROPE; STREAM: TYPE = IO.STREAM; TransactionHandle: TYPE = REF; AlpTHandle: TYPE = TransactionHandle; WhichTempLog: TYPE = WalnutKernelDefs.WhichTempLog; WalnutOpsHandle: TYPE = WalnutDefs.WalnutOpsHandle; CheckReportProc: TYPE = WalnutDefs.CheckReportProc; TransInfo: TYPE = REF; nullTransInfo: TransInfo = NIL; RootHandle: TYPE = REF RootHandleRec; RootHandleRec: PUBLIC TYPE = RECORD [ -- clients are to consider this readOnly baseName: ROPE ¬ NIL, -- full name through directories createDate: GMT ¬ BasicTime.nullGMT, expungeInProgress: BOOL ¬ FALSE, transInfo: TransInfo ¬ nullTransInfo, alpTH: AlpTHandle ¬ NIL, -- current transaction dbTransH: TransactionHandle ¬ NIL, -- form needed by cypress rootOpenFileForLogs: FS.OpenFile ¬ FS.nullOpenFile, currentLog: InternalLogInfo ¬ NIL, -- only one log for now expungeLog: InternalLogInfo ¬ NIL, newMailLog: MiscLogInfo ¬ NIL, readArchiveLog: MiscLogInfo ¬ NIL, statsProc: CheckReportProc ]; TransID: TYPE = REF; InternalLogInfo: TYPE = REF InternalLogInfoObject; InternalLogInfoObject: TYPE = RECORD [ readStream: STREAM, -- not used for expungeLog writeStream: STREAM, name: ROPE ¬ NIL, -- full path name of this log (minus version) shortName: ROPE ¬ NIL, -- short name without server, etc internalFileID: INT ¬ -1, logSeqNo: INT ¬ -1, logSeqNoPos: INT ¬ -1 -- position in rootLog of logSeqNo ]; MiscLogInfo: TYPE = REF MiscLogInfoRec; MiscLogInfoRec: TYPE = RECORD [ stream: STREAM, name: ROPE ¬ NIL, trans: AlpTHandle ¬ NIL, rootOpenFile: FS.OpenFile ¬ FS.nullOpenFile -- may have its own transaction ]; <<>> <> Open: PROC[opsH: WalnutOpsHandle, newSegmentOk: BOOL ¬ FALSE, masquerade: BOOL ¬ FALSE, newHandle: BOOL ¬ FALSE] RETURNS[ok: BOOL]; <> <> Shutdown: PROC[opsH: WalnutOpsHandle]; <> <<>> GetOpsHandleList: PROC RETURNS[LIST OF WalnutOpsHandle]; <> <<>> ExamineHandleList: PROC[proc: PROC[ohL: LIST OF WalnutOpsHandle] RETURNS[LIST OF WalnutOpsHandle] ]; <> <<>> <> <> StartTransaction: PROC[opsH: WalnutOpsHandle, openDB: BOOL ¬ TRUE] RETURNS[schemaInvalid: BOOL]; <> <<>> CloseTransaction: PROC[opsH: WalnutOpsHandle]; <> <<>> CommitAndContinue: PROC[opsH: WalnutOpsHandle]; <> AbortTransaction: PROC[opsH: WalnutOpsHandle]; <> FlushMailStream: PROC[opsH: WalnutOpsHandle]; <> <<>> EraseDB: PROC[opsH: WalnutOpsHandle]; <> <<>> <> AcquireWriteLock: PROC[opsH: WalnutOpsHandle]; <> OpenLogStreams: PROC[opsH: WalnutOpsHandle]; ReleaseWriteLock: PROC[opsH: WalnutOpsHandle]; <> <<>> CloseLogStreams: PROC[opsH: WalnutOpsHandle]; <> <<>> <<>> <> GetQuota: PROC[opsH: WalnutOpsHandle] RETURNS[spaceInUse, quota: INT]; <> GetStreamsForExpunge: PROC[opsH: WalnutOpsHandle, starting: BOOL, pagesWanted: INT]; <> SwapLogs: PROC[opsH: WalnutOpsHandle, expungeFileID: INT, newRootStamp: GMT] RETURNS[newLogLen: INT]; <> <<>> StopExpunge: PROC[opsH: WalnutOpsHandle]; <> <<>> <> PrepareToCopyTempLog: PROC[opsH: WalnutOpsHandle, which: WhichTempLog, pagesAlreadyCopied: INT, reportProc: WalnutDefs.CheckReportProc] RETURNS[ok: BOOL]; <> <<>> GetStreamsForCopy: PROC[opsH: WalnutOpsHandle, which: WhichTempLog] RETURNS[tempStream: STREAM]; <> FinishCopy: PROC[opsH: WalnutOpsHandle, which: WhichTempLog]; <> <<>> AbortTempCopy: PROC[opsH: WalnutOpsHandle, which: WhichTempLog]; <> <<>> <> GetNewMailStream: PROC[opsH: WalnutOpsHandle, lengthRequired: INT, pagesWanted: INT ¬ 200] RETURNS[ok: BOOL, actualLen: INT]; <> ReturnNewMailStream: PROC[opsH: WalnutOpsHandle]; <> <<>> GetReadArchiveStream: PROC[opsH: WalnutOpsHandle, pagesWanted: INT ¬ -1] RETURNS[STREAM]; <> ReturnReadArchiveStream: PROC[opsH: WalnutOpsHandle]; <<>> <> RegisterStatsProc: PROC[opsH: WalnutOpsHandle, proc: CheckReportProc]; UnregisterStatsProc: PROC[opsH: WalnutOpsHandle, proc: CheckReportProc]; StatsReport: CheckReportProc; END.