-- 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.