-- File: DBStorageImplD.mesa
-- Last edited by:
-- MBrown on May 22, 1983 10:27 pm,
-- Cattell on November 4, 1983 2:28 am
-- Willie-Sue on February 3, 1983 11:13 am
DIRECTORY
DBCommon,
DBSegment,
DBIndex USING [InitializeIndex, CallAfterFinishTransaction],
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: 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;
-- 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] = {
DBSegment.OpenTransaction[s, useTrans, noLog];
};
FinishTransaction: PUBLIC PROC [t: Trans, abort: BOOL, continue: BOOL] = {
IF abort OR NOT continue THEN {
-- Yes, we call DBIndex.CallAfterFinishTransaction BEFORE calling
--DBSegment.FinishTransaction! This is a work-around: otherwise,
--we try to "Unlock" a cache page that was already discarded by
--DBSegment.FinishTransaction.)
DBIndex.CallAfterFinishTransaction[];
};
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[];
-- Call tuple manager last, since others may release tuples.
DBStorageTuple.CallAfterFinishTransaction[];
};
};
-- Segment interface
AttachSegment: PUBLIC PROC [
fileName: ROPE, s: Segment, segmentIndex: SegmentIndex, readonly: BOOL,
version: VersionOptions, initializeExistingFile: BOOL,
nBytesInitial, nBytesPerExtent: INT] = {
DBSegment.AttachSegment[fileName, s, segmentIndex, readonly, version,
initializeExistingFile, nBytesInitial, nBytesPerExtent];
};
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, nBytesInitial, nBytesPerExtent: INT] = {
[filePath, number, trans, readOnly, nBytesInitial, nBytesPerExtent]←
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.