-- Schema.mesa
-- edited by Maxwell, May 26, 1982 8:18 am
-- Last Edited by: Willie-Sue, February 22, 1983 3:46 pm
-- Last Edited by: Donahue, May 11, 1983 4:12 pm

DIRECTORY
Buttons USING[ ButtonProc, Button ],
DB USING [DataType, Domain, Relation, Attribute, Segment],
Rope USING [ROPE],
Labels, ViewerClasses;

Schema: CEDAR DEFINITIONS =
BEGIN OPEN DB, Rope, ViewerClasses;

AttributeInfo: TYPE = REF AttributeInfoRecord;
AttributeInfoRecord: TYPE =
  RECORD[ relation: Relation, segment: Segment,
     nameLabel: Buttons.Button, name: Viewer,
     typeLabel: Labels.Label, type: Viewer,
     lengthLabel: Labels.Label, length: Viewer,
     uniqueness: Buttons.Button ];
     
DomainInfo: TYPE = REF DomainInfoRecord;
DomainInfoRecord: TYPE = RECORD[
name: Viewer,
dName: ROPE,
domain: Domain,
segment: Segment,
subTypes: Viewer,
superTypes: Viewer,
deleted: LIST OF Relation, -- deleted properties
properties: LIST OF AttributeInfo];

RelationInfo: TYPE = REF RelationInfoRecord;
RelationInfoRecord: TYPE = RECORD[
name: Viewer,
rName: ROPE,
segment: Segment,
relation: Relation, -- NIL indicates a new relation
attributes: LIST OF AttributeInfo];



--*******************************************************
-- copy the elements of a schemata
-- coerce the data on a per-attribute data
--*******************************************************

CopyDomainContents: PROCEDURE[oldD, newD: DB.Domain];
CopyRelships: PROCEDURE[oldR, newR: DB.Relation];


--*******************************************************
-- useful routines
--*******************************************************

GetRelationsOf: PROC[d: DB.Domain] RETURNS[relations: LIST OF DB.Relation];
SubType: PROC[sub, super: DB.Domain] RETURNS[BOOLEAN];
GetDataType: PROC[type: ROPE, segment: DB.Segment] RETURNS[dt: DB.DataType];
Optimized: PROCEDURE [d: Domain] RETURNS [opt: BOOLEAN];
SaveProperty: PROCEDURE [d: Domain, info: AttributeInfo];
NewAttribute: Buttons.ButtonProc;
AddAttribute: PROC[ button: Viewer, segment: DB.Segment, oldList: LIST OF AttributeInfo ]
    RETURNS[ newList: LIST OF AttributeInfo ];
RemoveAttribute: PROCEDURE[button: Viewer, oldList: LIST OF AttributeInfo]
RETURNS[newList: LIST OF AttributeInfo, relation: Relation];
DisplayAttribute: PROC[r: Relation, a: Attribute,
      lastV: Viewer, segment: Segment ← NIL] RETURNS[info: AttributeInfo];
CheckProperty: PROCEDURE[d: Domain, info: AttributeInfo, deleted: LIST OF Relation]
RETURNS[ok: BOOLEANTRUE];
Reverse: PROCEDURE[old: LIST OF AttributeInfo] RETURNS[new: LIST OF AttributeInfo];
RemoveDeleted: PROCEDURE[info: AttributeInfo, relations: LIST OF Relation]
RETURNS[LIST OF Relation];
NextName: PROCEDURE[list: ROPE] RETURNS[token, newList: ROPE, ok: BOOLEANTRUE];

END . .