DIRECTORY DBCommon, DBSegment, DBIndex USING [InitializeIndex], DBStorage USING[AddSystemField, CreateIndex, CreateSystemPageTuple, CreateSystemTupleset, FieldHandle, IndexHandle, IndexObjectSize, SystemTuplesetHandle, TupleHandle], DBStorageGroupScan USING [Init, CallAfterFinishTransaction], DBStorageTID USING[TID], DBStorageTuple USING[Init, ConsTupleObject, CallAfterFinishTransaction, TIDOfTuple], DBStorageTuplesetScan USING[Init, CallAfterFinishTransaction], Rope USING [ROPE]; DBStorageImplD: CEDAR PROGRAM IMPORTS DBIndex, DBSegment, DBStorage, DBStorageGroupScan, DBStorageTuple, DBStorageTuplesetScan EXPORTS DBStorage = BEGIN FileSystem: TYPE = DBCommon.FileSystem; Segment: TYPE = DBCommon.Segment; SegmentIndex: TYPE = DBCommon.SegmentIndex; SegmentID: TYPE = DBCommon.SegmentID; VersionOptions: TYPE = DBCommon.VersionOptions; Trans: TYPE = DBCommon.Trans; TID: TYPE = DBStorageTID.TID; TupleHandle: TYPE = DBStorage.TupleHandle; ROPE: TYPE = Rope.ROPE; Initialize: PUBLIC PROC [nCachePages: NAT, nFreeTuples: NAT, cacheFileName: ROPE] = { DBSegment.Initialize[nCachePages, cacheFileName, CreateIndexes]; DBStorageGroupScan.Init[]; DBStorageTuplesetScan.Init[]; DBStorageTuple.Init[nFreeTuples]; DBIndex.InitializeIndex[]; }; CreateIndexes: PROC [s: Segment] RETURNS [TID, TID] = { indexTS: DBStorage.SystemTuplesetHandle _ DBStorage.CreateSystemTupleset[1]; indexFH: DBStorage.FieldHandle _ DBStorage.AddSystemField[indexTS, [NWord[DBStorage.IndexObjectSize]]]; indexHandle1: TupleHandle _ DBStorage.CreateSystemPageTuple[indexTS, NIL, s]; indexHandle2: TupleHandle _ DBStorage.CreateSystemPageTuple[indexTS, indexHandle1, s]; DBStorage.CreateIndex[indexHandle1]; DBStorage.CreateIndex[indexHandle2]; RETURN[ DBStorageTuple.TIDOfTuple[indexHandle1], DBStorageTuple.TIDOfTuple[indexHandle2]]; }; OpenTransaction: PUBLIC PROC [s: Segment, useTrans: Trans, noLog: BOOL] = { IF DBSegment.OpenTransaction[s, useTrans] THEN DBStorageTuple.CallAfterFinishTransaction[s]; }; FinishTransaction: PUBLIC PROC [t: Trans, abort: BOOL, continue: BOOL] = { DBSegment.FinishTransaction[t, abort, continue]; IF abort OR NOT continue THEN { DBStorageTuplesetScan.CallAfterFinishTransaction[]; DBStorageGroupScan.CallAfterFinishTransaction[]; }; }; FlushTransaction: PUBLIC PROC [t: Trans, abort: BOOL, continue: BOOL] = { DBSegment.FlushTransaction[t, abort, continue]; IF abort OR NOT continue THEN { DBStorageTuplesetScan.CallAfterFinishTransaction[]; DBStorageGroupScan.CallAfterFinishTransaction[]; }; }; AttachSegment: PUBLIC PROC [ fileName: ROPE, s: Segment, segmentIndex: SegmentIndex, readonly: BOOL, version: VersionOptions, initializeExistingFile: BOOL, nPagesInitial, nPagesPerExtent: NAT] = { DBSegment.AttachSegment[fileName, s, segmentIndex, readonly, version, initializeExistingFile, nPagesInitial, nPagesPerExtent]; }; RootIndicesFromSegment: PUBLIC PROC [s: Segment] RETURNS [index1, index2: DBStorage.IndexHandle] = { indexTID1, indexTID2: TID; [indexTID1, indexTID2] _ DBSegment.RootIndicesFromSegment[s]; RETURN [ DBStorageTuple.ConsTupleObject[tid: indexTID1], DBStorageTuple.ConsTupleObject[tid: indexTID2]]; }; GetSegmentInfo: PUBLIC PROC [s: Segment] RETURNS [ filePath: ROPE, number: NAT, trans: Trans, readOnly: BOOL, nPagesInitial, nPagesPerExtent: INT] = { [filePath, number, trans, readOnly, nPagesInitial, nPagesPerExtent] _ DBSegment.GetSegmentInfo[s]; }; SegmentFromTuple: PUBLIC PROC [x: TupleHandle] RETURNS [s: Segment] = { RETURN [DBSegment.SegmentFromTID[DBStorageTuple.TIDOfTuple[x]]]; }; SegmentIDFromTuple: PUBLIC PROC [x: TupleHandle] RETURNS [segmentID: SegmentID] = { RETURN [DBSegment.SegmentIDFromDBPage[DBStorageTuple.TIDOfTuple[x]]]; }; EnumerateSegments: PUBLIC PROC [ enumProc: PROC [s: Segment, segmentIndex: SegmentIndex] RETURNS [stop: BOOL]] = { DBSegment.EnumerateSegments[enumProc]; }; END.--DBStorageImplD CHANGE LOG Created by MBrown on February 29, 1980 11:26 AM Changed by MBrown on March 3, 1980 3:19 PM Changed by MBrown on April 18, 1980 11:46 AM Changed by MBrown on 9-May-80 11:00 Changed by MBrown on June 11, 1980 3:39 PM Changed by MBrown on June 24, 1980 11:51 AM Changed by MBrown on August 4, 1980 11:54 PM Changed by MBrown on August 5, 1980 9:33 PM Changed by MBrown on August 11, 1980 8:32 PM Changed by MBrown on August 29, 1980 2:41 PM Changed by MBrown on September 12, 1980 1:34 PM Changed by MBrown on December 8, 1980 3:50 PM Changed by MBrown on December 11, 1980 3:07 PM Changed by MBrown on December 11, 1980 7:08 PM Changed by MBrown on February 26, 1981 9:01 PM Changed by MBrown on February 27, 1981 5:21 PM Changed by MBrown on 18-Jun-81 14:51:09 Changed by Cattell on May 4, 1982 12:59 pm Changed by Willie-Sue on June 24, 1982 12:21 pm Changed by MBrown on November 30, 1982 9:44 pm Changed by Willie-Sue on February 3, 1983 Changed by MBrown on May 22, 1983 10:23 pm Changed by Willie-Sue on February 15, 1985 μFile: DBStorageImplD.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Last edited by: MBrown on May 22, 1983 10:27 pm, Cattell on November 4, 1983 2:28 am Willie-Sue on March 25, 1985 9:25:59 am PST Donahue, November 13, 1985 8:04:06 am PST Initialization Called from DBSegmentImpl for the initialization of a segment. Transaction interface Opens a transaction on s. In the case that we are re-opening a transaction that was previously closed, and the file version has changed, we must nullify any tuple handles that were in segment s. Any volatile state that references tuples in nonexistent segments must now be discarded. DBSegment.IsValidTID is useful in determining what to discard. Any volatile state that references tuples in nonexistent segments must now be discarded. DBSegment.IsValidTID is useful in determining what to discard. Segment interface Changed CreateDatabase and OpenDatabase to create and use real indexes. Added calls to DBStorage.CreateIndex so that index is actually initialized (previously we were testing without the index implementation). InitializeIndex is now called by CreateDatabase and OpenDatabase; FinalizeIndex is called by CloseDatabase. Changes due to exported TupleObject and related cleanups. Make CreateIndexes call FreeFieldObject to release field handle, and DeallocSystemTuplesetObject to release system tupleset handle. CloseDatabase now cleans up storage level data structures: DBStorageTuple.ReInitialize, DBStorageTuplesetScan.NoticeCloseDatabase, DBStorageGroupScan.NoticeCloseDatabase. Changed CloseDatabase and CloseCommunication to conform to changes in DBStorage (which was changed because the old scheme was fuzzy and unworkable). Made CloseDatabase call DBStorageTuple.ReInitialize LAST, so evidence is still around of the TSID of an open scan. OpenCommunication returns the welcome text result. OpenDatabase and CreateDatabase now take nCachePages as a parameter (defaults in DBStorage). Added Finalize. CreateSegment now takes nBytesInitial and nBytesPerExtent as parameters. Filled in a "real" implementation for AbortTransaction (one that should allow an OpenDatabase to follow an abort). Flushed RegisterUser, added parms to OpenCommunication. Changed Commit to CommitTransaction. Flushed SetTransactionNotifyProcedure. Redefined OpenCommunication: server is used to decide what file system to use. Transaction is UNSPECIFIED. newTrans parm added. Pre-Pilot changes: use z.Free. System tupleset is now collectible, no explicit FREE. CloseCommunication no longer does CloseDatabase. Rope.Ref => Rope.ROPE Changes for new segment scheme. Added noLog arg to OpenTransaction In FinishTransaction, work around bug in DBIndex.CallAfterFinishTransaction. made Cedar, nBytesXX => nPagesXX. Added Tioga formatting Κ˜šœ™Jšœ Οmœ1™<—Jšœ™Jšœ ™ Jšœ#™#šœ+™+Icode™)—˜šΟk ˜ J˜ J˜ Jšœžœ˜ šœ žœJ˜YJ˜N—Jšœžœ$˜Jšœžœžœ˜J˜——šœžœž˜šž˜J˜J˜ J˜ J˜J˜J˜—šž˜J˜ —J˜Jšœž˜J˜Jšœ žœ˜'Jšœ žœ˜!Jšœžœ˜+Jšœ žœ˜%Jšœžœ˜/Jšœžœ˜Jšžœžœžœ˜Jšœ žœ˜*Jšžœžœžœ˜Ihead1šœ™š Οn œžœžœžœžœžœ˜UJ˜@J˜J˜J˜!J˜J˜J˜—š Ÿ œžœžœžœžœ˜7Jšœ>™>˜)J˜"—˜ J˜F—˜Jšœ)žœ˜1—˜J˜:—J˜$J˜$šžœ˜J˜(J˜)—J˜—Lšœ™šŸœžœžœ&žœ˜KJšœP™PJšœL™LJšœ%™%šžœ(ž˜.J˜-—J˜J˜—š Ÿœžœžœžœ žœ˜JJ˜0šžœžœžœ žœ˜JšœJ™JJšœM™MJ˜3J˜0J˜—J˜—J˜š Ÿœžœžœžœ žœ˜IJ˜/šžœžœžœ žœ˜JšœJ™JJšœM™MJ˜3J˜0J˜—J˜—Lšœ™šŸ œžœžœ˜Jšœ žœ4žœ˜GJšœ1žœ˜6Jšœ žœ˜(˜EJ˜8—J˜J˜—šŸœžœžœ ˜0Jšžœ,˜3Jšœžœ˜J˜=šžœ˜J˜/J˜0—J˜J˜—šŸœžœžœžœ˜2Jšœ žœ žœ˜*Jšœ žœ"žœ˜8˜EJ˜—J˜J˜—šŸœžœžœžœ˜GJšžœ:˜@J˜J˜—šŸœžœžœžœ˜SJšžœ?˜EJ˜J˜—šŸœžœžœ˜ Jšœ žœ*žœžœ˜QJ˜&J˜J˜——JšžœΟc˜J˜J˜Jšžœž˜ J˜Jšœ.ž˜0J˜Jšœ)ž˜+JšœG™GJ˜Jšœ+ž˜-JšœV™VJšœ2™2J˜J˜$JšœO™OJšœ™J˜Jšœ)ž˜+Jšœ9™9J˜Jšœ*ž˜,Jšœ`™`Jšœ"™"J˜Jšœ+ž˜-JšœW™WJšœR™RJ˜Jšœ*ž˜,JšœZ™ZJšœ9™9J˜Jšœ+ž˜-JšœU™UJšœ™J˜Jšœ+ž˜-Jšœ2™2J˜Jšœ.ž˜0Jšœ\™\Jšœ™J˜Jšœ,ž˜.JšœH™HJ˜Jšœ-ž˜/Jšœ]™]Jšœ™J˜Jšœ-ž˜/Jšœ]™]Jšœ'™'J˜Jšœ-ž˜/JšœN™NJšœ1™1J˜Jšœ-ž˜/Jšœ™J˜J˜'Jšœ5™5J˜J˜*Jšœ0™0J˜J˜/Jšœ™J˜J˜.Jšœ™J˜J˜)Jšœ"™"J˜J˜*JšœL™LJ˜J˜*J™9—…—Z$[