-- File DBStorageTSDict.mesa -- Last edited by MBrown on August 12, 1980 4:03 PM DIRECTORY DBCommon USING[DBPage], DBStorageTID USING[TID], DBStorageVec USING[SlotIndexField, VecPage, VecHeader]; DBStorageTSDict: DEFINITIONS = BEGIN OPEN DBCommon, DBStorageTID; -- This interface defines types associated with tupleset dictionaries, and gives some --operations on them. -- TSDicts live in a known slot, which allows operations below to take pointers to pages --rather than pointers to TSDicts. -- The selection of interface operations seems QUITE ad-hoc; hopefully that will be fixed. -- Reserved slot index on tuple pages: TSDictSlotIndex: DBStorageVec.SlotIndexField = 1; -- This slot points to the tupleset dictionary vec. TSDict: TYPE = MACHINE DEPENDENT RECORD[ header: DBStorageVec.VecHeader, -- TSDict is stored in a vec, so prefix is a VecHeader allocLink: DBPage, -- TSDict is stored in a vec, so prefix is a VecHeader seq: ARRAY [1..1) OF TSDictEntry -- sequence of TSDictEntry, length implicit in header.length -- indices in this array are used as slot types; NOTE 1-origin ];--TSDict TSDictEntry: TYPE = MACHINE DEPENDENT RECORD[ tuplesetID: TID, next: DBPage, prev: DBPage -- links in a doubly-linked list of pages that contain tuples from this tupleset ];--TSDictEntry -- In addition to serving as a method of assigning short names to tuple types, the --tupleset dictionary is used to link together all pages that contain tuples of a --given type. This allows a tupleset to be scanned without looking at all pages in --the segment. There is a corresponding cost when tuples are created and destroyed. SizeOfInitialTSDict: CARDINAL = SIZE[TSDict] + SIZE[TSDictEntry]; SizeOfNullTSDict: CARDINAL = SIZE[TSDict]; NEntries: PROC[LONG POINTER TO TSDict] RETURNS[CARDINAL]; -- Returns the number of TSDictEntries in the seq of a TSDict. This can be computed --from the VecHeader. GetIndex: PROC[--p--LONG POINTER TO DBStorageVec.VecPage, --tsID--TID] RETURNS[--index--CARDINAL, --found it--BOOLEAN]; -- Returns index of the TSDictEntry on page p that contains tsID as its tuplesetID field. --Second result is TRUE iff entry was actually found; otherwise we return 1+number of entries in --the TSDict, and FALSE. GetEntry: PROC[--p--LONG POINTER TO DBStorageVec.VecPage, --tsID--TID] RETURNS[LONG POINTER TO TSDictEntry]; -- Returns ptr to the TSDictEntry on page p that contains tsID as its tuplesetID field. --ERRORs InternalBug if no such entry exists. EntryFromIndex: PROC[--p--LONG POINTER TO DBStorageVec.VecPage, --index--CARDINAL] RETURNS[LONG POINTER TO TSDictEntry]; -- Returns ptr to the index-th TSDictEntry on page p. --ERRORs InternalBug if no such entry exists. END.--DBStorageTSDict CHANGE LOG Created by MBrown on June 14, 1980 9:10 PM -- Moved types here from DBStoragePrivateB, made procs accessible. Changed by MBrown on July 24, 1980 9:18 PM -- Added EntryFromIndex, for use in StorageTuplesetScanImpl. Added allocLink field to TSDict. Changed by MBrown on August 12, 1980 4:03 PM -- Moved TSDictSlotIndex here, from DBStoragePrivateB.