File: DBShowImpl.mesa
Copyright © 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
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] =
temporary kluge for output of UNSPECIFIED to IO
INLINE {RETURN[[integer[LOOPHOLE[u, INTEGER]]]]};
Show: PUBLIC PROC [huh: REF ANY] RETURNS [ROPE] = {
displays an entity, relship, domain, or relation
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: BOOLFALSE;
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] = {
displays the domain and name of an entity
fh← IO.ROS[];
WriteEntity[e];
RETURN[FinishOutput[]]
};
ShowRelship: PUBLIC PROC [r: DB.Relship] RETURNS [ROPE] = {
displays a relship and its fields
fh← IO.ROS[];
WriteRelship[r];
RETURN[FinishOutput[]]
};
ShowDomain: PUBLIC PROC [d: DB.Domain] RETURNS [ROPE] = {
displays all elements of a domain
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𡤌ount+1)>5 THEN {fh.PutF["...more\n"]; EXIT};
ENDLOOP;
DBModel.ReleaseEntitySet[es];
fh.PutF[".................."];
RETURN[FinishOutput[]]
};
ShowRelation: PUBLIC PROC [rel: DB.Relation ] RETURNS [ROPE] = {
displays all elements of a relation
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𡤌ount+1)>5 THEN {fh.PutF["...more\n"]; EXIT};
ENDLOOP;
DB.ReleaseRelshipSet[rs];
fh.PutF[".................."];
RETURN[FinishOutput[]]
};
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𡤌ount+1)>5 THEN {fh.PutF["...more\n"]; EXIT};
WriteRelship[t]; fh.Put[char[CR]] ENDLOOP;
DB.ReleaseRelshipSet[rs];
ENDLOOP;
fh.PutF["....................."];
RETURN[FinishOutput[]]
};
FinishOutput: PROC RETURNS [ROPE] = {RETURN[IO.RopeFromROS[fh]]};
The following procedures were stolen from DBDump:
WriteEntity: PROC[e: DB.Entity] = {
Prints an entity in ascii dump form: /domain\name\
name: ROPE;
d: DB.Domain;
[name, d] ← DB.EntityInfo[e];
fh.PutF["/%g\\/%g\\", IO.rope[d.name], IO.rope[name]];
fh.Put[char['/], rope[d.name], char['\\]];
fh.Put[rope[name], char['\\]];
};
WriteRelship: PROC[t: DB.Relship] = {
Prints a relship in ascii dump form: \relation\a1:v1\...\aN:vN\
ts: DB.Relation ← DB.RelationOf[t];
fh.Put[char['\\], rope[ts.name]];
fh.Put[char['\\]];
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.