<> <> <> <> <> <> <> DIRECTORY DB, DBCommon USING[CacheHandle, DBPage, NullDBPage, WordsPerPage], DBSegment USING[SegmentIDFromDBPage, UnlockPage, WriteLockedPage], DBStorage, DBStorageConcrete USING[SystemTuplesetObject, FieldObject, FieldType], DBStorageExtTuple USING[SizeOfNullTuple], DBStorageField USING[], DBStoragePrivate USING[GetNWordBase], DBStorageTID USING[TID, DecomposeTID], DBStorageTupleset USING[TuplesetObject], DBStorageTuple USING[TIDOfTuple], Rope USING [ROPE]; DBStorageFieldImpl: CEDAR PROGRAM IMPORTS DB, DBSegment, DBStoragePrivate, DBStorageTID, DBStorageTuple EXPORTS DBStorage, DBStorageField = BEGIN OPEN DBCommon, DBStorageTID; <> <> <> <> <> <> <<>> <> FieldObject: PUBLIC TYPE = DBStorageConcrete.FieldObject; FieldHandle: TYPE = REF FieldObject; ListofFieldHandle: TYPE = LIST OF FieldHandle; SystemTuplesetObject: PUBLIC TYPE = DBStorageConcrete.SystemTuplesetObject; SystemTuplesetHandle: TYPE = REF SystemTuplesetObject; <> tuplesetFieldHandle: FieldHandle; indexFieldHandle: FieldHandle; TuplesetFieldHandle: PUBLIC PROC RETURNS[FieldHandle] = { RETURN[tuplesetFieldHandle] };--TuplesetFieldHandle IndexFieldHandle: PUBLIC PROC RETURNS[FieldHandle] = { RETURN[indexFieldHandle] };--IndexFieldHandle CheckFieldHandleType: PUBLIC PROC[fh: FieldHandle, t: DBStorageConcrete.FieldType] = { <> IF fh.fieldType # t THEN ERROR DB.InternalError; -- [Unknown]; };--CheckFieldHandleType FieldOffset: PUBLIC PROC[fh: FieldHandle] RETURNS[CARDINAL] = { RETURN[fh.offset]; };--FieldOffset NWordsInField: PUBLIC PROC[fh: FieldHandle] RETURNS[CARDINAL] = { RETURN[fh.nWords]; };--NWordsInField GroupIDOfField: PUBLIC PROC[fh: FieldHandle] RETURNS[TID] = { IF fh.fieldType # Group THEN ERROR DB.InternalError; -- [Unknown]; RETURN[fh.groupID]; };--GroupIDOfField <> CreateTupleset: PUBLIC PROC[x: DBStorage.TuplesetHandle] = TRUSTED { <> <> <> <> <> <> <> tsObjPtr: LONG POINTER TO DBStorageTupleset.TuplesetObject; cacheHint: DBCommon.CacheHandle; dbPage: DBPage; [dbPage,] _ DecomposeTID[DBStorageTuple.TIDOfTuple[x]]; [tsObjPtr, cacheHint] _ DBStoragePrivate.GetNWordBase[x, TuplesetFieldHandle[]]; DBSegment.WriteLockedPage[cacheHint]; tsObjPtr^ _ [ wordsForTupleFields: 0, nVarFields: 0, searchList: [tuplesetID: DBStorageTuple.TIDOfTuple[x], next: NullDBPage, prev: NullDBPage], pageAllocator: [segmentID: DBSegment.SegmentIDFromDBPage[dbPage]] ]; DBSegment.UnlockPage[cacheHint]; };--CreateTupleset CreateSystemTupleset: PUBLIC PROC[x: DBStorage.SystemTupleID] RETURNS[SystemTuplesetHandle] = { <> <> <> IF x NOT IN [1..DBStorage.MaxSystemTupleID] THEN ERROR DB.InternalError; -- [Unknown]; RETURN[NEW[SystemTuplesetObject _ [tuplesetID: x, wordsForTupleFields: 0]]]; };--CreateSystemTupleset DestroyTupleset: PUBLIC PROC[x: DBStorage.TuplesetHandle] = { <> <> <> <<(DestroyTupleset has no effect on system tuplesets).>> ERROR; };--DestroyTupleset CreateFieldHandle: PUBLIC PROC RETURNS [FieldHandle] = <> <> {RETURN[NEW[DBStorageConcrete.FieldObject _ [typeDependent: group[]]]]}; MaxWordsPerTuple: CARDINAL = 3*(DBCommon.WordsPerPage/4); <> <> MakeFieldHandle: PROC[y: DBStorage.FieldDescriptor, wordsForTupleFields: CARDINAL] RETURNS[--fh-- FieldHandle, --newWordsInTuple-- CARDINAL] = TRUSTED { <> <> <> <> <> fh: FieldHandle _ NEW[DBStorageConcrete.FieldObject_ [typeDependent: group[]]]; fieldInfo: RECORD[code: DBStorageConcrete.FieldType, length: CARDINAL] _ WITH fd: y SELECT FROM OneWord => [OneWord, 1], TwoWord => [TwoWord, 2], NWord => [NWord, fd.length], VarWord => [VarWord, 1 + fd.lengthHint], VarByte => [VarByte, 1 + (fd.lengthHint+1)/2], Group => [Group, 3*SIZE[TID]], ENDCASE => ERROR DB.InternalError; -- [Unknown]; fh.fieldType _ fieldInfo.code; fh.offset _ DBStorageExtTuple.SizeOfNullTuple + wordsForTupleFields; fh.nWords _ fieldInfo.length; WITH fd: y SELECT FROM Group => fh.groupID _ DBStorageTuple.TIDOfTuple[fd.groupID]; ENDCASE => fh.fill1 _ 0; IF wordsForTupleFields + fieldInfo.length > MaxWordsPerTuple THEN ERROR DB.Failure[$tupleTooLong, "can't make tuple this big"]; RETURN[fh, wordsForTupleFields + fieldInfo.length]; };--MakeFieldHandle AddField: PUBLIC PROC[x: DBStorage.TuplesetHandle, y: DBStorage.FieldDescriptor] RETURNS[FieldHandle] = TRUSTED { <> <> fh: FieldHandle; tsObjPtr: LONG POINTER TO DBStorageTupleset.TuplesetObject; cacheHint: DBCommon.CacheHandle; [tsObjPtr, cacheHint] _ DBStoragePrivate.GetNWordBase[x, TuplesetFieldHandle[]]; <> IF tsObjPtr.allocList#NullDBPage OR tsObjPtr.searchList.next#NullDBPage THEN ERROR DB.Error[NotImplemented]; -- Adding field to existing relation! DBSegment.WriteLockedPage[cacheHint]; [fh, tsObjPtr.wordsForTupleFields] _ MakeFieldHandle[y, tsObjPtr.wordsForTupleFields]; SELECT fh.fieldType FROM VarWord, VarByte => {tsObjPtr.nVarFields _ tsObjPtr.nVarFields + 1; }; ENDCASE => {}; DBSegment.UnlockPage[cacheHint]; RETURN[fh]; };--AddField AddSystemField: PUBLIC PROC[x: SystemTuplesetHandle, y: DBStorage.FieldDescriptor] RETURNS[FieldHandle] = { <> <> fh: FieldHandle; [fh, x.wordsForTupleFields] _ MakeFieldHandle[y, x.wordsForTupleFields]; RETURN[fh]; };--AddSystemField DeleteField: PUBLIC PROC [x: DBStorage.TuplesetHandle, z: ListofFieldHandle, i: INTEGER] RETURNS[ListofFieldHandle] = { <> <> <> <> <> <> ERROR; };--DeleteField <> <> IF DBStorage.FieldObjectSize < SIZE[DBStorageConcrete.FieldObject] OR DBStorage.TuplesetObjectSize < SIZE[DBStorageTupleset.TuplesetObject] THEN ERROR DB.InternalError; -- [Unknown]; [tuplesetFieldHandle,] _ MakeFieldHandle[[NWord[DBStorage.TuplesetObjectSize]], 0]; [indexFieldHandle,] _ MakeFieldHandle[[NWord[DBStorage.IndexObjectSize]], 0]; END.--DBStorageFieldImpl CHANGE LOG Created by MBrown on 2-Feb-80 16:07 <> <> Changed by MBrown on February 3, 1980 3:07 PM <> Changed by MBrown on February 10, 1980 11:41 PM <> Changed by MBrown on February 16, 1980 12:15 AM <> <> Changed by MBrown on February 16, 1980 9:11 PM <> Changed by MBrown on February 16, 1980 11:04 PM <> Changed by MBrown on 17-Feb-80 13:59 <> <> <> <> Changed by MBrown on February 25, 1980 7:45 PM <> <> <> Changed by MBrown on April 9, 1980 10:11 AM <> Changed by MBrown on April 17, 1980 11:02 PM <> Changed by MBrown on June 8, 1980 9:25 PM <> <> <> Changed by MBrown on June 8, 1980 10:19 PM <> Changed by MBrown on June 10, 1980 8:39 PM <> Changed by MBrown on June 24, 1980 11:26 AM <> Changed by MBrown on July 31, 1980 3:11 PM <> Changed by MBrown on August 13, 1980 11:59 AM <> Changed by MBrown on August 25, 1980 1:37 PM <> Changed by MBrown on September 26, 1980 12:28 PM <> Changed by MBrown on February 27, 1981 3:58 PM <> Changed by MBrown on 18-Jun-81 14:47:11 <> Changed by Cattell on November 4, 1983 2:21 am <> <<>> Changed by Willie-Sue February 15, 1985 <>