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
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: 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] = {
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"];
};