<> <> <> <> <> <> <> <> DIRECTORY IO, DB, DBCommon, DBModel, DBModelPrivate, DBModelSchema, DBShow, DBDefs, Rope, AMTypes; DBShowImpl: CEDAR PROGRAM IMPORTS IO, DB, DBModelSchema, DBModel, DBModelPrivate, AMTypes EXPORTS DBShow = BEGIN OPEN DB, DBCommon, DBDefs, DBModelPrivate, DBModel, IO; fh: IO.STREAM; es: EntitySet _ NEW[DBDefs.EntitySetObject]; rs: RelshipSet _ NEW[DBDefs.RelshipSetObject]; word: PROC [u: UNSPECIFIED] RETURNS [IO.Value] = <> INLINE {RETURN[[integer[LOOPHOLE[u, INTEGER]]]]}; Show: PUBLIC PROC [huh: REF ANY] RETURNS [ROPE] = <> BEGIN ENABLE DB.InternalError => GOTO GiveUp; d: Domain; r: Relation; flag: BOOL; t: TupleHandle; t_ NARROW[huh ! AMTypes.Error => IF reason=typeFault THEN {t_ NIL; CONTINUE}]; IF t=NIL THEN RETURN["* not a relship or entity *"]; flag_ FALSE; d_ GetCachedEntityInfo[SegmentOf[t], t ! DB.Error => IF code=IllegalEntity THEN {flag_ TRUE; CONTINUE}].domain; IF flag THEN BEGIN flag_ FALSE; r_ QRelationOf[t ! DB.Error => IF code=NullifiedArgument THEN {flag_ TRUE; CONTINUE}]; IF flag THEN RETURN["* deleted *"]; RETURN[ShowRelship[t]]; END; SELECT d FROM DomainDomain => RETURN[ShowDomain[t]]; RelationDomain => RETURN[ShowRelation[t]]; AttributeDomain => RETURN[ShowAttribute[t]] ENDCASE => RETURN[ShowEntity[t]]; EXITS GiveUp => RETURN["**Internal error, cannot display**"] END; ShowEntity: PUBLIC PROC [e: Entity] RETURNS [ROPE] = <> BEGIN fh_ IO.ROS[]; WriteEntity[e]; RETURN[FinishOutput[]] END; ShowRelship: PUBLIC PROC [r: Relship] RETURNS [ROPE] = <> BEGIN fh_ IO.ROS[]; WriteRelship[r]; RETURN[FinishOutput[]] END; ShowDomain: PUBLIC PROC [d: TupleHandle] RETURNS [ROPE] = <> BEGIN e: Entity; count: INT_ 0; fh_ IO.ROS[]; WriteSystemEntity[d]; fh.Put[rope[" ... domain elements are:\n"]]; es_ QDomainSubset[d: DBModelSchema.TupleToDomain[d], es: es]; UNTIL NullEntity[e_ QNextEntity[es]] DO WriteEntity[e]; fh.PutF["\n"]; IF (count_count+1)>5 THEN {fh.PutF["...more\n"]; EXIT}; ENDLOOP; QReleaseEntitySet[es]; fh.PutF[".................."]; RETURN[FinishOutput[]] END; ShowRelation: PUBLIC PROC [r: TupleHandle] RETURNS [ROPE] = <> BEGIN t: Relship; count: INT_ 0; fh_ IO.ROS[]; WriteSystemEntity[r]; fh.Put[rope[" ... relation elements are:\n"]]; rs_ QRelationSubset[r: DBModelSchema.TupleToRelation[r], rs: rs]; UNTIL NullRelship[t_ QNextRelship[rs]] DO WriteRelship[t]; fh.PutF["\n"]; IF (count_count+1)>5 THEN {fh.PutF["...more\n"]; EXIT}; ENDLOOP; QReleaseRelshipSet[rs]; fh.PutF[".................."]; RETURN[FinishOutput[]] END; ShowAttribute: PROC [a: Entity] RETURNS [ROPE] = BEGIN fh_ IO.ROS[]; WriteSystemEntity[a]; RETURN[FinishOutput[]] END; ShowAll: PUBLIC PROC [huh: REF ANY] RETURNS [ROPE] = <> BEGIN count: INT_ 0; e: Entity; t: Relship; r: Relation; al: LIST OF 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 r_ alT.first.relation; rs_ QRelationSubset[r, LIST[[alT.first, E2V[e]]], First, rs]; UNTIL NullRelship[t_ QNextRelship[rs]] DO IF (count_count+1)>5 THEN {fh.PutF["...more\n"]; EXIT}; WriteRelship[t]; fh.Put[char[CR]] ENDLOOP; QReleaseRelshipSet[rs]; ENDLOOP; fh.PutF["....................."]; RETURN[FinishOutput[]] END; FinishOutput: PROC RETURNS [ROPE] = {RETURN[IO.RopeFromROS[fh]]}; <> WriteEntity: PROC[e: Entity] = <> BEGIN name: ROPE; d: Domain; [name, d] _ GetCachedEntityInfo[SegmentOf[e], e]; fh.Put[char['/], rope[d.name], char['\\]]; fh.Put[rope[name], char['\\]]; END; WriteRelship: PROC[t: Relship] = <> BEGIN ts: Relation _ QRelationOf[t]; fh.Put[char['\\], rope[ts.name]]; fh.Put[char['\\]]; FOR al: LIST OF Attribute _ ts.attributes, al.rest UNTIL al=NIL DO field: Attribute _ al.first; fh.Put[rope[field.name], char[':]]; fh.Put[rope[QGetFS[t, field]], char['\\] ]; ENDLOOP; END; WriteSystemEntity: PROC [e: Entity] = <> <> BEGIN name: ROPE; type: Domain; [name, type] _ GetCachedEntityInfo[SegmentOf[e], e]; SELECT type FROM DomainDomain => fh.Put[rope["/Domain\\"], rope[name], char['\\]]; RelationDomain => fh.Put[ rope["/Relation\\"], rope[name], char['\\] ]; AttributeDomain => { fh.Put[rope["/Attribute\\"], rope[QEntityInfo[V2E[QGetP[e, aRelationIs]]].name], char['\\]]; fh.Put[rope[name], char['\\]]; fh.Put[rope[QEntityInfo[V2E[QGetP[e, aTypeIs]]].name], char['\\]]; fh.Put[word[V2U[QGetP[e, aUniquenessIs]]], char['\\]]; fh.Put[int[V2I[QGetP[e, aLengthIs]]], char['\\]] }; ENDCASE; fh.Put[char[CR]]; END; END.