/**
*
*/
package org.reldb.rel.v0.vm.instructions.relvar;
import org.reldb.rel.exceptions.*;
import org.reldb.rel.v0.storage.relvars.RelvarGlobal;
import org.reldb.rel.v0.storage.relvars.RelvarHeading;
import org.reldb.rel.v0.types.Heading;
import org.reldb.rel.v0.values.ValueRelation;
import org.reldb.rel.v0.vm.Context;
import org.reldb.rel.v0.vm.Instruction;
public final class OpRelvarGlobalSet extends Instruction {
private Heading definedHeading;
// private RelvarHeading definedKeyDefinition;
private String relvarName;
public OpRelvarGlobalSet(String relvarName, RelvarHeading headingDefinition) {
this.relvarName = relvarName;
definedHeading = headingDefinition.getHeading();
// definedKeyDefinition = keydef;
}
public final void execute(Context context) {
// Set value of relvar
//
// POP - ValueRelation
RelvarGlobal relvar = context.getVirtualMachine().getRelDatabase().openGlobalRelvar(relvarName);
if (relvar == null)
throw new ExceptionSemantic("RS0283: Relation-valued variable " + relvarName + " no longer exists.");
if (!definedHeading.canAccept(relvar.getHeadingDefinition().getHeading()))
throw new ExceptionSemantic("RS0284: Relation-valued variable " + relvarName + " has heading " + relvar.getHeadingDefinition().getHeading() + " but " + definedHeading + " was expected.");
// TODO - check for inconsistency between relvar.getKeyDefinition() and definedKeyDefinition.
relvar.setValue((ValueRelation)context.pop());
}
public String toString() {
return getName() + " " + relvarName;
}
}