-- File: VLTest2Impl.mesa -- Contents: Simple test program (2nd of 2) for DB.mesa -- Created by: Rick Cattell, 18-Dec-81 13:59:57 -- Last Edited by: Cattell, January 16, 1983 2:37 pm DIRECTORY DB, IO, Rope; VLTest2Impl: PROGRAM IMPORTS DB, IO, Rope = BEGIN OPEN IO, DB; INT: TYPE = LONG INTEGER; tty: IO.Handle← CreateViewerStreams["VLTest2Impl.log"].out; mySeg: DB.Segment = $Test; Person, Frog, Thing: Domain; Friend: Relation; friendOf, friendIs: Attribute; Phone: Relation; phoneOf, phoneIs: Attribute; ageProp, heightProp: Attribute; wsh, rick: --Person-- Entity; george: --Frog-- Entity; rock, pebble: --Thing-- Entity; Initialize: PROC = BEGIN tty.Put[rope["Defining data dictionary..."], char[CR]]; -- Declare domains and make Persons and Frogs be subtypes of Things: Person← DeclareDomain["Person", mySeg]; Thing← DeclareDomain["Thing", mySeg]; Frog← DeclareDomain["Frog", mySeg]; --DeclareSubType[of: Thing, is: Person]; --DeclareSubType[of: Thing, is: Frog]; -- Declare phone age and height property of Things ageProp← DeclareProperty["Age", Thing, IntType, mySeg]; heightProp← DeclareProperty["Height", Thing, StringType, mySeg]; -- Declare Friend relation between Persons Friend← DeclareRelation["Friend", mySeg]; friendOf← DeclareAttribute[Friend, "of", Person]; friendIs← DeclareAttribute[Friend, "is", Person,,, FALSE]; -- Declare Phone relation between Persons and integers Phone← DeclareRelation["Phone", mySeg]; phoneOf← DeclareAttribute[Phone, "of", Person]; phoneIs← DeclareAttribute[Phone, "is", IntType]; []← DeclareIndex[Phone, LIST[phoneIs], NewOrOld]; END; InsertMoreData: PROCEDURE = BEGIN t: Relship; flag: BOOL← FALSE; tty.Put[rope["Creating data..."], char[CR]]; wsh← CreateEntity[Person]; rick← FetchEntity[Person, "Rick Cattell"]; rock← CreateEntity[Thing, "Harry the rock"]; pebble← CreateEntity[Thing, "Fred the pebble"]; george← CreateEntity[Frog, "George the frog"]; []← CreateEntity[Frog, "Harry the frog"]; SetName[wsh, "Willie-Sue H"]; SetPW[wsh, heightProp, S2V["medium"]]; SetPW[rick, heightProp, S2V["medium"]]; SetPW[rock, heightProp, S2V["big"]]; SetPW[pebble, heightProp, S2V["little"]]; SetPW[george, heightProp, S2V["little"]]; SetPW[george, heightProp, I2V[10000] ! Error => IF code=MismatchedAttributeValueType THEN {flag← TRUE; CONTINUE}]; IF NOT flag THEN ERROR; t← CreateRelship[Friend]; SetF[t, friendOf, rick]; SetF[t, friendIs, wsh]; flag← FALSE; SetF[t, friendOf, george ! Error => IF code=MismatchedAttributeValueType THEN {flag← TRUE; CONTINUE}]; IF NOT flag THEN ERROR; END; DestroySomeData: PROCEDURE = BEGIN flag: BOOL← FALSE; tty.Put[char[CR], rope["Deleting some data: Willie-Sue and the frogs..."], char[CR]]; DestroyEntity[FetchEntity[Person, "Willie-Sue"]]; DestroyDomain[Frog]; END; PrintEveryone: PROCEDURE = BEGIN thing: -- Thing -- Entity; es: EntitySet; r: ROPE; tty.PutF["\nThings:\n\n"]; tty.PutF["Type Name Height\n"]; es← DomainSubset[Thing]; WHILE (thing← NextEntity[es])#NIL DO tty.Put[rope[GetName[DomainOf[thing]]], char[TAB]]; tty.Put[rope[GetName[thing]], char[TAB]]; r← V2S[GetP[thing, heightProp]]; tty.Put[rope[IF r.Length[]=0 THEN "[unknown]" ELSE r], char[CR]]; ENDLOOP; ReleaseEntitySet[es]; tty.PutF["\nPeople Names:\n\n"]; es← DomainSubset[Person]; WHILE (thing← NextEntity[es])#NIL DO tty.Put[rope[GetName[thing]], char[CR]]; ENDLOOP; ReleaseEntitySet[es]; END; PrintFriends: PROCEDURE = BEGIN friendRS: --Friend-- Relship; friendName: --Person-- ROPE; rs: RelshipSet; harry: Entity← FetchEntity[Person, "Harry Q. Bovik"]; tty.Put[char[CR], rope["Harry's friends:"], char[CR]]; rs← RelationSubset[Friend, LIST[[friendIs, harry]]]; WHILE (friendRS← NextRelship[rs])#NIL DO friendName← GetFS[friendRS, friendOf]; tty.Put[rope[friendName], rope[" "], char[CR]]; ENDLOOP; ReleaseRelshipSet[rs]; END; tty.Put[rope["Creating database..."], char[CR]]; DB.Initialize[]; DB.DeclareSegment["[Local]Test.segment", mySeg]; DB.OpenTransaction[mySeg]; Initialize[]; PrintFriends[]; InsertMoreData[]; DestroySomeData[]; CloseTransaction[TransactionOf[mySeg]]; tty.Close[]; END.