File: DBStorageImplD.mesa
Copyright © 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
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
= 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;
Initialization
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] = {
Called from DBSegmentImpl for the initialization of a segment.
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]];
};
Transaction interface
OpenTransaction:
PUBLIC
PROC [s: Segment, useTrans: Trans, noLog:
BOOL] = {
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.
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 {
Any volatile state that references tuples in nonexistent segments must now
be discarded. DBSegment.IsValidTID is useful in determining what to discard.
DBStorageTuplesetScan.CallAfterFinishTransaction[];
DBStorageGroupScan.CallAfterFinishTransaction[];
};
};
FlushTransaction:
PUBLIC
PROC [t: Trans, abort:
BOOL, continue:
BOOL] = {
DBSegment.FlushTransaction[t, abort, continue];
IF abort
OR
NOT continue
THEN {
Any volatile state that references tuples in nonexistent segments must now
be discarded. DBSegment.IsValidTID is useful in determining what to discard.
DBStorageTuplesetScan.CallAfterFinishTransaction[];
DBStorageGroupScan.CallAfterFinishTransaction[];
};
};
Segment interface
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 CreateDatabase and OpenDatabase to create and use real indexes.
Changed by MBrown on April 18, 1980 11:46 AM
Added calls to DBStorage.CreateIndex so that index is actually initialized (previously
we were testing without the index implementation).
Changed by MBrown on 9-May-80 11:00
InitializeIndex is now called by CreateDatabase and OpenDatabase; FinalizeIndex
is called by CloseDatabase.
Changed by MBrown on June 11, 1980 3:39 PM
Changes due to exported TupleObject and related cleanups.
Changed by MBrown on June 24, 1980 11:51 AM
Make CreateIndexes call FreeFieldObject to release field handle, and DeallocSystemTuplesetObject
to release system tupleset handle.
Changed by MBrown on August 4, 1980 11:54 PM
CloseDatabase now cleans up storage level data structures: DBStorageTuple.ReInitialize,
DBStorageTuplesetScan.NoticeCloseDatabase, DBStorageGroupScan.NoticeCloseDatabase.
Changed by MBrown on August 5, 1980 9:33 PM
Changed CloseDatabase and CloseCommunication to conform to changes in DBStorage (which was
changed because the old scheme was fuzzy and unworkable).
Changed by MBrown on August 11, 1980 8:32 PM
Made CloseDatabase call DBStorageTuple.ReInitialize LAST, so evidence is still around
of the TSID of an open scan.
Changed by MBrown on August 29, 1980 2:41 PM
OpenCommunication returns the welcome text result.
Changed by MBrown on September 12, 1980 1:34 PM
OpenDatabase and CreateDatabase now take nCachePages as a parameter (defaults in DBStorage).
Added Finalize.
Changed by MBrown on December 8, 1980 3:50 PM
CreateSegment now takes nBytesInitial and nBytesPerExtent as parameters.
Changed by MBrown on December 11, 1980 3:07 PM
Filled in a "real" implementation for AbortTransaction (one that should allow an OpenDatabase
to follow an abort).
Changed by MBrown on December 11, 1980 7:08 PM
Flushed RegisterUser, added parms to OpenCommunication. Changed Commit to CommitTransaction.
Flushed SetTransactionNotifyProcedure.
Changed by MBrown on February 26, 1981 9:01 PM
Redefined OpenCommunication: server is used to decide what file system to use.
Transaction is UNSPECIFIED. newTrans parm added.
Changed by MBrown on February 27, 1981 5:21 PM
Pre-Pilot changes: use z.Free.
Changed by MBrown on 18-Jun-81 14:51:09
System tupleset is now collectible, no explicit FREE.
Changed by Cattell on May 4, 1982 12:59 pm
CloseCommunication no longer does CloseDatabase.
Changed by Willie-Sue on June 24, 1982 12:21 pm
Rope.Ref => Rope.ROPE
Changed by MBrown on November 30, 1982 9:44 pm
Changes for new segment scheme.
Changed by Willie-Sue on February 3, 1983
Added noLog arg to OpenTransaction
Changed by MBrown on May 22, 1983 10:23 pm
In FinishTransaction, work around bug in DBIndex.CallAfterFinishTransaction.
Changed by Willie-Sue on February 15, 1985
made Cedar, nBytesXX => nPagesXX. Added Tioga formatting