DIRECTORY BasicTime USING [GMT], DB USING [Aborted, Error, Failure, InternalError, Attribute, AttributeValueList, Entity, GMT, Relship, RelshipSet, Value, DeclareEntity, DeclareRelship, GetF, GetSegmentInfo, Null, SetF, S2V, V2B, V2I, V2S, V2T], DBEnvironment USING [ErrorCode], IO, RefTab USING [Ref], Rope, WalnutDB USING [], WalnutDefs USING [Error, MsgSet, Segment], WalnutDBInternal USING [], WalnutRoot USING [StatsReport], WalnutSchema; WalnutDBOpsImpl: CEDAR PROGRAM IMPORTS DB, IO, WalnutDefs, WalnutRoot, WalnutSchema EXPORTS WalnutDB, WalnutDBInternal = BEGIN OPEN WalnutSchema; GMT: TYPE = BasicTime.GMT; ROPE: TYPE = Rope.ROPE; MsgSet: TYPE = WalnutDefs.MsgSet; Entity: TYPE = DB.Entity; Relship: TYPE = DB.Relship; RelshipSet: TYPE = DB.RelshipSet; walnutSegment: PUBLIC ATOM _ $Walnut; activeMsgSet: PUBLIC MsgSet _ ["Active", -1]; deletedMsgSet: PUBLIC MsgSet _ ["Deleted", -1]; activeMessageSet: PUBLIC DB.Entity; deletedMessageSet: PUBLIC DB.Entity; msgSetsTable: PUBLIC RefTab.Ref _ NIL; DBBoolValue: REF BOOL _ NEW[BOOL]; DBIntValue: REF INT _ NEW[INT]; DBGmtValue: REF DB.GMT _ NEW[DB.GMT]; DeclareDB: PUBLIC PROC[segment: WalnutDefs.Segment, readOnly: BOOL] = { walnutSegment _ segment; msgSetsTable _ NIL; CheckSchema[segment, readOnly]; }; CheckSchema: PUBLIC PROC[segment: WalnutDefs.Segment, readOnly: BOOL] = { IF DB.Null[WalnutSchema.MsgDomain] THEN { IF readOnly THEN WalnutSchema.Initialize[segment, OldOnly] ELSE WalnutSchema.Initialize[segment]; activeMessageSet _ DB.DeclareEntity[MsgSetDomain, activeMsgSet.name]; deletedMessageSet _ DB.DeclareEntity[MsgSetDomain, deletedMsgSet.name]; }; }; InitSchema: PUBLIC PROC[segment: WalnutDefs.Segment] = { walnutSegment _ segment; msgSetsTable _ NIL; WalnutSchema.SetSchemaVersion[walnutSegment]; CheckSchema[segment, FALSE] }; IsReadOnly: PUBLIC PROC RETURNS[readonly: BOOL] = { readonly_ DB.GetSegmentInfo[walnutSegment].readOnly }; GetDBName: PUBLIC PROC RETURNS[fileName: ROPE] = { fileName_ DB.GetSegmentInfo[walnutSegment].filePath }; GetRootInfo: PUBLIC PROC RETURNS[rootFileStamp: GMT, rootFileKey, mailFor: ROPE] = { Gri: PROC = { rootFileStamp _ DB.V2T[DB.GetF[rRootInfo, gRootFileStamp]]; rootFileKey _ DB.V2S[DB.GetF[rRootInfo, gRootFileKey]]; mailFor _ DB.V2S[DB.GetF[rRootInfo, gMailFor]]; }; CarefullyApply[Gri]; }; SetRootInfo: PUBLIC PROC[rootFileStamp: GMT, rootFileKey, mailFor: ROPE] = { Sri: PROC = { DBGmtValue^ _ [rootFileStamp]; DB.SetF[rRootInfo, gRootFileStamp, DBGmtValue]; DB.SetF[rRootInfo, gRootFileKey, DB.S2V[rootFileKey]]; DB.SetF[rRootInfo, gMailFor, DB.S2V[mailFor]]; }; CarefullyApply[Sri]; }; GetRootFileVersion: PUBLIC PROC RETURNS[rootFileStamp: GMT] = { Gri: PROC = { rootFileStamp _ DB.V2T[DB.GetF[rRootInfo, gRootFileStamp]]; }; CarefullyApply[Gri]; }; SetRootFileVersion: PUBLIC PROC[rootFileStamp: GMT] = { Sri: PROC = { DBGmtValue^ _ [rootFileStamp]; DB.SetF[rRootInfo, gRootFileStamp, DBGmtValue]; }; CarefullyApply[Sri]; }; GetOpInProgressPos: PUBLIC PROC RETURNS[inProgressPos: INT] = { Goip: PROC = { inProgressPos_ DB.V2I[DB.GetF[rLogInfo, gOpInProgressPos]] }; CarefullyApply[Goip]; }; SetOpInProgressPos: PUBLIC PROC[inProgressPos: INT] = { Siop: PROC = { DBIntValue^ _ inProgressPos; DB.SetF[rLogInfo, gOpInProgressPos, DBIntValue]; }; CarefullyApply[Siop]; }; GetParseLogInProgress: PUBLIC PROC RETURNS[inProgress: BOOL] = { Gplp: PROC = { inProgress_ DB.V2B[DB.GetF[rParseLogInfo, gParseLogInProgress]] }; CarefullyApply[Gplp]; }; SetParseLogInProgress: PUBLIC PROC[inProgress: BOOL] = { Splp: PROC = { DBBoolValue^ _ inProgress; DB.SetF[rParseLogInfo, gParseLogInProgress, DBBoolValue]; }; CarefullyApply[Splp]; }; GetParseLogPos: PUBLIC PROC RETURNS[pos: INT] = { Gplp: PROC = { pos _ DB.V2I[DB.GetF[rParseLogInfo, gParseLogPos]] }; CarefullyApply[Gplp]; }; SetParseLogPos: PUBLIC PROC[pos: INT] = { Splp: PROC = { DBIntValue^ _ pos; DB.SetF[rParseLogInfo, gParseLogPos, DBIntValue]; }; CarefullyApply[Splp]; }; CarefullyApply: PUBLIC PROC [proc: PROC[]] = { exp: ROPE; eCode: ATOM; BEGIN ENABLE BEGIN DB.Error => { eCode _ $DBError; exp _ RopeForDBError[code]; GOTO Quit}; DB.Failure => { eCode _ $DBFailure; exp _ info; GOTO Quit}; DB.Aborted => { eCode _ $TransactionAbort; GOTO Quit }; DB.InternalError => { eCode _ $DBInternalError; GOTO Quit }; END; proc[]; EXITS Quit => { WalnutRoot.StatsReport[IO.PutFR["\n ***DB error - code: %g, exp: %g ", IO.atom[eCode], IO.rope[exp]]]; ERROR WalnutDefs.Error[$db, eCode, exp]; }; END; }; GetMsgDisplayInfo: PUBLIC PROC[m: Entity] RETURNS[hasBeenRead: BOOL, tocEntry: ROPE, startOfSubject: INT] = { rel: Relship = DB.DeclareRelship[mDisplayInfo, LIST[[mDIOf, m]]]; hasBeenRead_ DB.V2B[DB.GetF[rel, mDIHasBeenRead]]; tocEntry_ DB.V2S[DB.GetF[rel, mDITOCEntry]]; startOfSubject_ DB.V2I[DB.GetF[rel, mDIStartOfSubject]]; }; ChangeCountInMsgSet: PUBLIC PROC[ms: Entity, inc: INT] = { rel: Relship _ DB.DeclareRelship[msBasicInfo, LIST[[msBIOf, ms]]]; DBIntValue^ _ DB.V2I[DB.GetF[rel, msBICount]] + inc; DB.SetF[rel, msBICount, DBIntValue]; DBIntValue^ _ DB.V2I[DB.GetF[rel, msBIVersion]] + 1; DB.SetF[rel, msBIVersion, DBIntValue]; }; ChangeCountOfMsgs: PUBLIC PROC[delta: INT] = { numNow: INT _ DB.V2I[DB.GetF[rVersionInfo, gMsgCount]]; DBIntValue^ _ numNow + delta; DB.SetF[rVersionInfo, gMsgCount, DBIntValue]; }; RopeForDBError: PROC[code: DBEnvironment.ErrorCode] RETURNS[ROPE] = { SELECT code FROM AlreadyExists => RETURN["AlreadyExists"]; IllegalAttribute => RETURN["IllegalAttribute"]; IllegalDomain => RETURN["IllegalDomain"]; IllegalEntity => RETURN["IllegalEntity"]; IllegalRelship => RETURN["IllegalRelship"]; IllegalRelation => RETURN["IllegalRelation"]; IllegalString => RETURN["IllegalString"]; IllegalValue => RETURN["IllegalValue"]; IllegalValueType => RETURN["IllegalValueType"]; MismatchedProperty => RETURN["MismatchedProperty"]; MismatchedAttributeValueType => RETURN["MismatchedAttributeValueType"]; MismatchedExistingAttribute => RETURN["MismatchedExistingAttribute"]; MismatchedPropertyCardinality => RETURN["MismatchedPropertyCardinality"]; MultipleMatch => RETURN["MultipleMatch"]; NILArgument => RETURN["NILArgument"]; NullifiedArgument => RETURN["NullifiedArgument"]; NotFound => RETURN["NotFound"]; TransactionNotOpen => RETURN["TransactionNotOpen"]; TransactionAlreadyOpen => RETURN["TransactionAlreadyOpen"]; QuotaExceeded => RETURN["QuotaExceeded"]; Unknown => RETURN["Unknown"]; ENDCASE => RETURN["Other Error"]; }; END.  WalnutDBOpsImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Willie-Sue, June 13, 1985 2:38:10 pm PDT Donahue, July 17, 1985 3:36:08 pm PDT Contents: types and procedures dealing with the Walnut message database Initiated by Willie-Sue, September 24, 1984 Last Edited by: Willie-Sue, January 9, 1985 11:17:16 am PST Last Edited by: Donahue, December 11, 1984 7:50:08 pm PST Types Public Variables Variables Database initialization Global Values Exported to WalnutDBInternal Internal procedures Κ H˜šΟn™Jšœ Οmœ1™