<> <> <> <> <<>> <> <> <> <> <<(Changed ShiftMsgPosition to SetMsgEntryPosition to reflect change in dealing with absolute log positions)>> <<(Added operations to set and get new mail and read archive log information -- used on restart) >> DIRECTORY BasicTime USING [GMT], DB USING [Entity, Relship], RefTab USING [Ref], Rope USING [ROPE, Equal], ViewerTools USING [TiogaContents], WalnutDefs USING [ dontCareDomainVersion, dontCareMsgSetVersion, MsgSet, Segment, ServerInfo], WalnutKernelDefs USING [LogExpungePhase, MsgLogEntry]; WalnutDB: CEDAR DEFINITIONS IMPORTS Rope = BEGIN <> ROPE: TYPE = Rope.ROPE; GMT: TYPE = BasicTime.GMT; Entity: TYPE = DB.Entity; Relship: TYPE = DB.Relship; TiogaContents: TYPE = ViewerTools.TiogaContents; MsgSet: TYPE = WalnutDefs.MsgSet; -- [ROPE, INT] dontCareDomainVersion: INT = WalnutDefs.dontCareDomainVersion; dontCareMsgSetVersion: INT = WalnutDefs.dontCareMsgSetVersion; LogExpungePhase: TYPE = WalnutKernelDefs.LogExpungePhase; <<-- {idle, initializingExpungeLog, writingExpungeLog, swappingLogs};>> ServerInfo: TYPE = WalnutDefs.ServerInfo; LazyEnumerator: TYPE = REF LazyEnumeratorRec; LazyEnumeratorRec: TYPE; CheckReportProc: TYPE = PROC[msg1, msg2, msg3: ROPE _ NIL]; <> activeMsgSet: MsgSet; deletedMsgSet: MsgSet; walnutSegment: ATOM; <> MsgExists: PROC[msg: ROPE] RETURNS [existed: BOOL]; <> <> GetHasBeenRead: PROC[msg: ROPE] RETURNS[BOOL]; <> SetHasBeenRead: PROC[msg: ROPE]; <> AddNewMsg: PROC[msg: WalnutKernelDefs.MsgLogEntry] RETURNS[mExisted: BOOL]; <> GetMsgEntryPosition: PROC[msg: ROPE] RETURNS[pos: INT]; <> <<>> SetMsgEntryPosition: PROC[to: INT]; <> GetMsgDate: PROC[msg: ROPE] RETURNS[date: GMT]; <> GetMsgTextInfo: PROC[msg: ROPE] RETURNS[textStart, textLen, formatLen: INT]; <> GetMsgText: PROC[msg: ROPE] RETURNS[textStart, textLen, formatLen: INT, herald: ROPE, shortNameLen: INT]; <> GetDisplayProps: PROC[msg: ROPE] RETURNS [hasBeenRead: BOOL, TOCentry: ROPE, startOfSubject: INT]; <> GetCategories: PROC[msg: ROPE] RETURNS [ms: LIST OF ROPE]; <> EqMsg: PROC[msg1, msg2: ROPE] RETURNS [BOOL] = INLINE{RETURN[Rope.Equal[msg1, msg2, FALSE]] }; SizeOfDatabase: PROC RETURNS[messages, msgSets: INT]; <> <> MsgSetExists: PROC[name: ROPE, msDomainVersion: INT] RETURNS [existed: BOOL, msVersion: INT]; <> CreateMsgSet: PROC[name: ROPE, msDomainVersion: INT] RETURNS [existed: BOOL, msVersion: INT]; NumInMsgSet: PROC[name: ROPE] RETURNS[num: INT, msVersion: INT]; EmptyMsgSet: PROC[msgSet: MsgSet, report: CheckReportProc] RETURNS[someInDeleted: BOOL]; <> DestroyMsgSet: PROC[msgSet: MsgSet, msDomainVersion: INT, report: CheckReportProc] RETURNS[someInDeleted: BOOL]; <> VerifyMsgSet: PROC[msgSet: MsgSet] RETURNS[exists: BOOL]; <> <<>> VerifyDomainVersion: PROC[msDomainVersion: INT]; <> ExpungeMsgs: PROC[deletedVersion: INT, report: CheckReportProc]; <> MsgsEnumeration: PROC[alphaOrder: BOOL_ TRUE] RETURNS[mL: LIST OF ROPE]; MsgSetsNames: PROC[alphaOrder: BOOL_ TRUE] RETURNS[msL: LIST OF ROPE, msDomainVersion: INT]; MsgsInSetEnumeration: PROC[name: ROPE, fromStart: BOOL_ TRUE] RETURNS [mL: LIST OF ROPE, msVersion: INT]; <> EnumerateMsgSets: PROC [alphaOrder: BOOL _ TRUE, proc: PROC[msgSet: MsgSet]] RETURNS [msDomainVersion: INT]; EnumerateMsgsInSet: PROC [ name: ROPE, fromStart: BOOL _ TRUE, proc: PROC[msg, TOCentry: ROPE, hasBeenRead: BOOL, startOfSubject: INT] ] RETURNS [msVersion: INT]; <<>> <> <> <> EnumerateMsgsInMsgSet: PROC[msgSet: MsgSet] RETURNS [lazyEnum: LazyEnumerator]; <> NextMsgInMsgSet: PROC[lazyEnum: LazyEnumerator] RETURNS[msgID: ROPE, valid: BOOL]; <> EnumerateUnacceptedMsgs: PROC[ activeVersion: INT, proc: PROC[msg, TOCentry: ROPE, startOfSubject: INT] ]; <> <> <<>> EqMsgSets: PROC[msgSet1, msgSet2: ROPE] RETURNS [BOOL] = INLINE{ RETURN[Rope.Equal[msgSet1, msgSet2, FALSE]] }; MsgSetsInfo: PROC RETURNS[version, num: INT]; <<>> <> <> AddMsg: PROC[msg: ROPE, from, to: MsgSet] RETURNS[exists: BOOL]; <<>> <> RemoveMsg: PROC[msg: ROPE, from: MsgSet, deletedVersion: INT] RETURNS[deleted: BOOL]; <<>> <> MoveMsg: PROC[msg: ROPE, from, to: MsgSet] RETURNS [exists: BOOL]; <<>> <> <<>> AcceptNewMail: PROC[pos: INT, activeVersion: INT]; <<>> <> <> DeclareDB: PROC[segment: WalnutDefs.Segment, schemaInvalid: BOOL]; <> InitSchema: PROC[segment: WalnutDefs.Segment, schemaInvalid: BOOL _ TRUE]; <> IsReadOnly: PROC RETURNS[readonly: BOOL]; <> GetDBName: PROC RETURNS[fileName: ROPE]; <> GetRootInfo: PROC RETURNS[rootFileStamp: GMT, rootFileKey, mailFor: ROPE]; <> SetRootInfo: PROC[rootFileStamp: GMT, rootFileKey, mailFor: ROPE]; <> <<>> GetRootFileVersion: PROC RETURNS[rootFileStamp: GMT]; <> SetRootFileVersion: PROC[rootFileStamp: GMT]; GetCurrentLogFileID: PROC RETURNS[currentLogID: INT]; <> SetCurrentLogFileID: PROC[currentLogID: INT]; GetOpInProgressPos: PROC RETURNS[inProgressPos: INT]; SetOpInProgressPos: PROC[inProgressPos: INT]; GetParseLogInProgress: PROC RETURNS[inProgress: BOOL]; SetParseLogInProgress: PROC[inProgress: BOOL]; GetParseLogPos: PROC RETURNS[pos: INT]; SetParseLogPos: PROC[pos: INT]; GetTimeOfLastScavenge: PROC RETURNS[when: BasicTime.GMT]; SetTimeOfLastScavenge: PROC[when: BasicTime.GMT]; <> GetExpungeInfo: PROC RETURNS[firstDestroyedMsgPos, bytesInDestroyedMsgs: INT]; SetExpungeInfo: PROC[firstDestroyedMsgPos, bytesInDestroyedMsgs: INT]; GetLogExpungePhase: PROC RETURNS[expungePhase: LogExpungePhase]; SetLogExpungePhase: PROC[expungePhase: LogExpungePhase]; -- commits GetExpungeProgressInfo: PROC RETURNS[currentLogPos, expungeLogPos: INT]; SetExpungeProgressInfo: PROC[currentLogPos, expungeLogPos: INT]; -- commits SetExpungeFileID: PROC[expungeFileID: INT]; GetExpungeFileID: PROC RETURNS[expungeFileID: INT]; SetTimeOfLastExpunge: PROC[when: BasicTime.GMT]; GetTimeOfLastExpunge: PROC RETURNS[when: BasicTime.GMT]; SetAcceptNewMailPos: PROC[pos: INT]; GetAcceptNewMailPos: PROC RETURNS[pos: INT]; SetAddingServerMsgs: PROC[addingServerMsgs: BOOL]; GetAddingServerMsgs: PROC RETURNS[addingServerMsgs: BOOL]; GetServerInfo: PROC[server: ROPE] RETURNS[num: INT]; <> EnumerateServers: PROC[] RETURNS[serverList: LIST OF ServerInfo]; SetNewMailInfo: PROC[logLen: INT, when: GMT, server: ROPE, num: INT]; <> SetNewMailLogLength: PROC[logLen: INT]; GetNewMailLogLength: PROC[] RETURNS[logLen: INT]; GetLastNewMailTimeStamp: PROC[] RETURNS[when: GMT]; SetCopyMailLogPos: PROC[pos: INT]; GetCopyMailLogPos: PROC[] RETURNS[pos: INT]; SetReadArchivePos: PROC[pos: INT]; GetReadArchivePos: PROC[] RETURNS[pos: INT]; SetCopyReadArchivePos: PROC[pos: INT]; GetCopyReadArchivePos: PROC[] RETURNS[pos: INT]; <<>> <> <> activeMessageSet: READONLY Entity; deletedMessageSet: READONLY Entity; unacceptedEntity: READONLY Entity; <> msgSetsTable: RefTab.Ref; <> ChangeCountInMsgSet: PROC[ms: Entity, inc: INT]; ChangeCountOfMsgs: PROC[delta: INT]; CarefullyApply: PROC[proc: PROC[]]; GetMsgDisplayInfo: PROC[m: Entity] RETURNS[hasBeenRead: BOOL, tocEntry: ROPE, startOfSubject: INT]; CanonicalName: PROC[name: ROPE] RETURNS[aName: ATOM]; <> END.