DIRECTORY IO, DB, DBCommon, DBModel, DBModelPrivate, DBShow, DBDefs, Rope, SafeStorage; DBShowImpl: CEDAR PROGRAM IMPORTS IO, DB, DBModel, SafeStorage EXPORTS DBShow = BEGIN fh: IO.STREAM; ROPE: TYPE = Rope.ROPE; word: PROC [u: UNSPECIFIED] RETURNS [IO.Value] = INLINE {RETURN[[integer[LOOPHOLE[u, INTEGER]]]]}; Show: PUBLIC PROC [huh: REF ANY] RETURNS [ROPE] = { ENABLE DB.Error => GOTO GiveUp; ssType: SafeStorage.Type = SafeStorage.GetReferentType[huh]; SELECT TRUE FROM ISTYPE[huh, DBDefs.Entity] => { e: DB.Entity = NARROW[huh]; RETURN[ShowEntity[e]]; }; ISTYPE[huh, DB.Relship] => { relship: DB.Relship = NARROW[huh]; del: BOOL _ FALSE; relation: DB.Relation; relation _ DBModel.RelationOf[ relship ! DB.Error => IF code=NullifiedArgument THEN {del _ TRUE; CONTINUE}]; IF del THEN RETURN["* deleted *"]; RETURN[ShowRelship[relship]]; }; ISTYPE[huh, DB.Domain] => { d: DB.Domain = NARROW[huh]; RETURN[ShowDomain[d]] }; ISTYPE[huh, DB.Relation] => { rel: DB.Relation = NARROW[huh]; RETURN[ShowRelation[rel]] }; ENDCASE => RETURN["Not an entity or a relship or a domain or a relation\n"]; EXITS GiveUp => RETURN["\n***DB.Error - can't display"]; }; ShowEntity: PUBLIC PROC [e: DB.Entity] RETURNS [ROPE] = { fh_ IO.ROS[]; WriteEntity[e]; RETURN[FinishOutput[]] }; ShowRelship: PUBLIC PROC [r: DB.Relship] RETURNS [ROPE] = { fh_ IO.ROS[]; WriteRelship[r]; RETURN[FinishOutput[]] }; ShowDomain: PUBLIC PROC [d: DB.Domain] RETURNS [ROPE] = { e: DB.Entity; count: INT _ 0; es: DB.EntitySet _ DBModel.DomainSubset[d: d, lowName: NIL, highName: NIL, start: First]; fh _ IO.ROS[]; fh.Put[IO.rope["/Domain\\"], IO.rope[d.name], IO.char['\\] ]; fh.Put[IO.rope[" ... domain elements are:\n"] ]; UNTIL DBModel.NullEntity[e _ DBModel.NextEntity[es]] DO WriteEntity[e]; fh.PutF["\n"]; IF (count_count+1)>5 THEN {fh.PutF["...more\n"]; EXIT}; ENDLOOP; DBModel.ReleaseEntitySet[es]; fh.PutF[".................."]; RETURN[FinishOutput[]] }; ShowRelation: PUBLIC PROC [rel: DB.Relation ] RETURNS [ROPE] = { t: DB.Relship; count: INT _ 0; rs: DB.RelshipSet _ DBModel.RelationSubset[r: rel, index: NIL, constraint: NIL, start: First]; fh _ IO.ROS[]; fh.Put[IO.rope["/Relation\\"], IO.rope[rel.name], IO.char['\\] ]; fh.Put[IO.rope[" ... relation elements are:\n"]]; UNTIL DBModel.NullRelship[t _ DBModel.NextRelship[rs]] DO WriteRelship[t]; fh.PutF["\n"]; IF (count_count+1)>5 THEN {fh.PutF["...more\n"]; EXIT}; ENDLOOP; DB.ReleaseRelshipSet[rs]; fh.PutF[".................."]; RETURN[FinishOutput[]] }; FinishOutput: PROC RETURNS [ROPE] = {RETURN[IO.RopeFromROS[fh]]}; WriteEntity: PROC[e: DB.Entity] = { name: ROPE; d: DB.Domain; [name, d] _ DB.EntityInfo[e]; fh.PutF["/%g\\/%g\\", IO.rope[d.name], IO.rope[name]]; }; WriteRelship: PROC[t: DB.Relship] = { ts: DB.Relation _ DB.RelationOf[t]; fh.PutF["\\%g\\", IO.rope[ts.name] ]; FOR i: CARDINAL IN [0..ts.attributes.count) DO field: REF DBDefs.AttributeObject _ ts.attributes[i]; fh.Put[IO.rope[field.name], IO.rope[": "]]; fh.Put[IO.rope[ValueToRopeRep[DBModel.GetF[t, i]] ], IO.char['\\] ]; ENDLOOP; }; ValueToRopeRep: PROC[val: DBDefs.Value] RETURNS[ROPE] = TRUSTED { WITH v: val SELECT FROM boolean => RETURN[IF v.value THEN "TRUE" ELSE "FALSE"]; integer => RETURN[IO.PutFR["%g", IO.int[v.value]] ]; rope => RETURN[v.value]; time => RETURN[IO.PutFR["%g", IO.time[v.value]]]; entity => RETURN[DBModel.EntityInfo[v.value].name]; ENDCASE => RETURN["Unknown value type"]; }; END.  File: DBShowImpl.mesa Copyright c 1985 by Xerox Corporation. All rights reserved. Contents: Procs to print out entities and tuples Last edited by: Rick Cattell on November 4, 1983 11:27 am Willie-Sue, September 16, 1986 4:31:33 pm PDT Donahue, September 5, 1985 3:54:54 pm PDT Widom, September 5, 1985 8:55:34 pm PDT temporary kluge for output of UNSPECIFIED to IO displays an entity, relship, domain, or relation displays the domain and name of an entity displays a relship and its fields displays all elements of a domain displays all elements of a relation ShowAll: PUBLIC PROC [huh: REF ANY] RETURNS [ROPE] = { Displays an entity and its referencing relships count: INT _ 0; e: Entity; t: Relship; r: Relation; al: LIST OF DBDefs.Attribute; e _ NARROW[huh ! AMTypes.Error => TRUSTED {IF reason=typeFault THEN {e _ NIL; CONTINUE}}]; IF e=NIL THEN RETURN["* not an entity *"]; al _ QGetAllRefAttributes[e]; fh _ IO.ROS[]; WriteEntity[e]; fh.PutF[" ... tuples referencing:\n"]; FOR alT: LIST OF Attribute _ al, alT.rest UNTIL alT=NIL DO rs: DBDefs.RelshipSet; r_ alT.first.relation; rs _ DBModel.RelationSubset[r, NIL, LIST[[alT.first, E2V[e]]], First]; UNTIL NullRelship[t _ DB.NextRelship[rs]] DO IF (count_count+1)>5 THEN {fh.PutF["...more\n"]; EXIT}; WriteRelship[t]; fh.Put[char[CR]] ENDLOOP; DB.ReleaseRelshipSet[rs]; ENDLOOP; fh.PutF["....................."]; RETURN[FinishOutput[]] }; The following procedures were stolen from DBDump: Prints an entity in ascii dump form: /domain\name\ fh.Put[char['/], rope[d.name], char['\\]]; fh.Put[rope[name], char['\\]]; Prints a relship in ascii dump form: \relation\a1:v1\...\aN:vN\ fh.Put[char['\\], rope[ts.name]]; fh.Put[char['\\]]; Κ•˜šœ™Jšœ Οmœ1™<—Jšœ0™0šœ™Jšœ)™)Jšœ-™-Icode™)J™'—J˜šΟk ˜ Jšžœ˜Jšžœ˜J˜ Jšœ˜J˜Jšœ˜Jšœ˜Jšœ˜Jšœ ˜ —J˜šœ žœž˜šž˜Jšžœžœ˜Jšžœ ˜—J˜—Jšž˜˜Jšœžœžœ˜Jšžœžœžœ˜J˜š œžœž œžœžœ ˜0Jšœ/™/Jšžœžœ žœžœ˜1—J˜šΟnœžœžœžœžœžœžœ˜3Jšœ0™0Jšžœžœ žœ˜J˜Jšœ<˜<šžœžœž˜šžœ˜Jšœžœ žœ˜Jšžœ˜J˜—šžœžœ˜Jšœ žœ žœ˜"Jšœžœžœ˜Jšœ žœ ˜šœ'˜'Jš œžœ žœžœžœžœ˜E—Jšžœžœžœ˜"Jšžœ˜Jšœ˜—šžœžœ ˜Jšœžœ žœ˜Jšžœ˜J˜—šžœžœ˜Jšœžœ žœ˜Jšžœ˜J˜—Jšžœžœ<˜MJ˜—šž˜Jšœ žœ"˜2—Jšœ˜J˜—š Ÿ œžœžœžœ žœžœ˜9Jšœ)™)Jšœžœžœ˜ J˜Jšžœ˜Jšœ˜J˜—š Ÿ œžœžœžœ žœžœ˜;Jšœ!™!Jšœžœžœ˜ J˜Jšžœ˜Jšœ˜J˜—š Ÿ œžœžœžœ žœžœ˜9Jšœ!™!Jšœžœ˜ Jšœžœ˜Jšœžœ1žœ žœ˜YJšœžœžœ˜Jšœžœžœžœ ˜=Jšœžœ'˜0šžœ0ž˜7J˜Jšžœžœžœ˜7Jšžœ˜—J˜J˜Jšžœ˜Jšœ˜J˜—š Ÿ œžœžœžœ žœžœ˜@Jšœ#™#Jšœžœ ˜Jšœžœ˜Jšœžœ4žœžœ˜^J˜Jšœžœžœ˜Jšœžœžœžœ ˜AJšœžœ(˜1šžœ2ž˜9J˜Jšžœžœžœ˜7Jšžœ˜—Jšžœ˜J˜Jšžœ˜Jšœ˜J˜—šŸœžœžœžœžœžœžœ™6Jšœ/™/Jšœžœ™J™ J™ Jšœ ™ Jšœžœžœ™J™šœžœ™!Jš žœžœžœžœžœ™8—Jšžœžœžœžœ™*J™Jšœžœžœ™J™J™&š žœžœžœžœžœž™:J™J™Jšœžœžœ™Fšžœžœž™,Jšžœžœžœ™7Jšœžœžœ™*—Jšžœ™Jšžœ™—J™!Jšžœ™Jšœ™J™—Jš Ÿ œžœžœžœžœžœ˜A—head2šœ1™1šŸ œžœžœ ˜#Jšœ2™2Jšœžœ˜ Jšœžœ˜ Jšœ žœ˜Jšœžœžœ ˜6J™*J™Jšœ˜J˜—šŸ œžœžœ ˜%Jšœ?™?Jšœžœ žœ˜#J™!J™Jšœžœ˜%šžœžœžœž˜.Jšœžœ+˜5Jšœžœžœ ˜+Jšœžœ,žœ ˜DJšžœ˜—Jšœ˜—J˜š Ÿœžœžœžœžœ˜Ašžœžœž˜Jš œ žœžœ žœžœ ˜8Jšœ žœžœ žœ˜5Jšœžœ ˜Jšœžœžœ žœ˜1Jšœ žœ#˜3Jšžœžœ˜(—J˜J˜——Jšžœ˜J˜—…— p₯