File DBStorageConcrete.mesa
Copyright © 1985 by Xerox Corporation. All rights reserved.
Last edited by
Cattell on 7-Jul-81 10:13:24
MBrown on December 2, 1982 2:54 pm
Willie-Sue, February 15, 1985 11:07:08 am PST
Donahue, May 23, 1986 9:40:13 am PDT
DIRECTORY
DBCommon USING[CacheHandle, DBPage, NullDBPage, TID],
DBIndex USING[RealIndexHandle],
DBStoragePage USING[VecPage],
DBStorage USING[SystemTupleID, FieldHandle, FirstLast, TupleHandle],
Rope USING[ROPE];
DBStorageConcrete:
CEDAR
DEFINITIONS =
BEGIN
This interface defines the concrete representations of opaque types in DBStorage..
FieldObject:
TYPE =
MACHINE
DEPENDENT
RECORD[
Concrete version of DBStorage.FieldObject. All variants are 5 words long.
fieldType: FieldType ← NULL,
offset: CARDINAL ← NULL,
nWords: CARDINAL ← NULL,
typeDependent:
SELECT
OVERLAID *
FROM
regular => [fill1: LONG CARDINAL ← NULL],
group => [groupID: DBCommon.TID],
ENDCASE
];--FieldObject
FieldType:
TYPE =
MACHINE
DEPENDENT
{OneWord(1), TwoWord, NWord, VarWord, VarByte, Group, (LAST[CARDINAL])};
GroupScanHandle: TYPE = REF GroupScanObject;
GroupScanObject:
TYPE =
RECORD[
tidFieldHandle: DBStorage.FieldHandle,
field handle for Group field being scanned. NIL => invalid handle.
headOfGroup: DBStorage.TupleHandle,
tuple on the "one" side of the group
prevInScan: DBStorage.TupleHandle ←
NIL,
if prevInScan = NIL, then scan is before start of "many" side. After an insertion
(WriteTID), the inserted tuple is here.
nextInScan: DBStorage.TupleHandle ←
NIL,
if nextInScan = NIL, then scan is after end of "many" side
link: GroupScanHandle ←
NIL
used to form singly-linked list of active group scans
];--GroupScanObject
IndexScanHandle: TYPE = REF IndexScanObject;
IndexScanObject:
TYPE =
RECORD [
front, back: IndexScanHandle,
tree: DBIndex.RealIndexHandle,
this: DBCommon.DBPage,
index: CARDINAL,
free: BOOLEAN,
direction: {next, prev, finished} ← next, -- this is set when doing a scan using NextScanKey and PrevScanKey
start: DBStorage.FirstLast,
lowerBound, upperBound: Rope.ROPE,
includeLowerBound, includeUpperBound: BOOLEAN,
lowerBoundInfinity, upperBoundInfinity: BOOLEAN
];--IndexScanObject
SystemTuplesetObject:
TYPE =
RECORD[
tuplesetID: DBStorage.SystemTupleID,
wordsForTupleFields: CARDINAL
];--SystemTuplesetObject
TuplesetScanHandle: TYPE = REF TuplesetScanObject;
TuplesetScanObject:
TYPE =
RECORD[
position: ScanPosition ← invalid,
scan is either between two tuples on a page (middle), before the first page (beforeFirst),
or after the last page (afterLast).
page: DBCommon.DBPage ← DBCommon.NullDBPage,
if scanPosition = middle, this is current page of scan. This page contains at least one
tuple from the tupleset represented by tuplesetID (below).
slotIndex:
CARDINAL ← 0,
if scanPosition = middle, this means that cursor is between slots slotIndex and
slotIndex + 1 of page. I.e, NextScanTupleset goes to slotIndex + 1, Prev goes to slotIndex.
pagePtr:
LONG
POINTER
TO DBStoragePage.VecPage ←
NIL,
if scanPosition = middle, this is pointer to cached version of page, locked for reading.
pageHint: DBCommon.CacheHandle ←
NIL,
if scanPosition = middle, this is locked cache ref to page (guarantees validity of pagePtr).
tupleset: DBStorage.TupleHandle,
tupleset whose tuples are to be returned by the scan.
localTuplesetID:
CARDINAL ← 1,
if scanPosition = middle, this is index (in [1..MaxTuplesetPerPage]) of tupleset's TSDict
entry on this page.
link: TuplesetScanHandle ←
NIL
pointer for singly-linked list of all active tupleset scans.
];--TuplesetScanObject
ScanPosition: TYPE = {middle, beforeFirst, afterLast, invalid};
END.--DBStorageConcrete
CHANGE LOG
Created by Cattell on 7-Jun-81 8:59:10
Moved all type definitions here from:
DBStorageConcreteField.mesa 1039 27-Feb-81 15:56:05
DBStorageConcreteGroupScan.mesa 1323 11-Dec-80 14:19:03
DBStorageConcreteSystemTS.mesa 662 24-Jun-80 11:16:51
DBStorageConcreteTuplesetScan.mesa 2667 27-Feb-81 14:21:24
Changed by MBrown on 17-Jun-81 11:17:59
Scan handles become REFs.
Changed by Cattell on 7-Jul-81 10:13:51
Added IndexScan stuff.
Changed by Willie-Sue on February 15, 1985
made Cedar, added tioga formatting