package org.reldb.rel.v0.storage.catalog; import java.util.Vector; import org.reldb.rel.exceptions.ExceptionFatal; import org.reldb.rel.v0.generator.Generator; import org.reldb.rel.v0.storage.*; import org.reldb.rel.v0.storage.relvars.RelvarRealMetadata; import org.reldb.rel.v0.values.*; public class RelvarTypes extends RelvarSystem { public RelvarTypes(String name, RelDatabase database, RelvarRealMetadata metadata) { super(name, database, metadata); } private ValueTuple getTupleFor(Generator generator, String name, String definition, String owner, String language, Vector<String> superTypes) { ValueRelationLiteral superTypesRelation = new ValueRelationLiteral(generator); for (String typeName: superTypes) superTypesRelation.insert(new ValueTuple(generator, new Value[] {ValueCharacter.select(generator, typeName)})); Value[] rawTuple = new Value[] { ValueCharacter.select(generator, name), ValueCharacter.select(generator, definition), ValueCharacter.select(generator, owner), ValueInteger.select(generator, getDatabase().getUniqueID()), ValueCharacter.select(generator, language), new ValueRelationLiteral(generator), // Subtypes (5th attribute) superTypesRelation // Supertypes (6th attribute) }; return new ValueTuple(generator, rawTuple); } protected ValueTuple getKeyTuple(Generator generator, String name) { return getTupleFor(generator, name, "", "", "", new Vector<String>()); } public void insertInternal(Generator generator, String name, String definition, String owner, String language, Vector<String> superTypes) { insertInternal(generator, getTupleFor(generator, name, definition, owner, language, superTypes)); } public void addSubtype(Generator generator, String superTypeName, String subTypeName) { ValueTuple superTypeData = getTupleForKey(generator, superTypeName); if (superTypeData == null) throw new ExceptionFatal("RS0316: Unable to obtain data for " + superTypeName); ValueRelationLiteral subtypes = (ValueRelationLiteral)superTypeData.getValues()[5]; // 5th attribute is Subtypes subtypes.insert(new ValueTuple(generator, new Value[] {ValueCharacter.select(generator, subTypeName)})); deleteInternal(generator, superTypeName); insertInternal(generator, superTypeData); } public void removeSubtype(Generator generator, String superTypeName, String subTypeName) { ValueTuple superTypeData = getTupleForKey(generator, superTypeName); if (superTypeData == null) throw new ExceptionFatal("RS0317: Unable to obtain data for " + superTypeName); ValueRelationLiteral subtypes = (ValueRelationLiteral)superTypeData.getValues()[5]; // 5th attribute is Subtypes subtypes.remove(new ValueTuple(generator, new Value[] {ValueCharacter.select(generator, subTypeName)})); deleteInternal(generator, superTypeName); insertInternal(generator, superTypeData); } }