/**
*
*/
package org.reldb.rel.v0.vm.instructions.relvar;
import org.reldb.rel.exceptions.ExceptionSemantic;
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.vm.Context;
import org.reldb.rel.v0.vm.Instruction;
public final class OpRelvarGlobalGet extends Instruction {
private Heading definedHeading;
// private RelvarHeading definedKeyDefinition;
private String relvarName;
public OpRelvarGlobalGet(String relvarName, RelvarHeading headingDefinition) {
this.relvarName = relvarName;
definedHeading = headingDefinition.getHeading();
// definedKeyDefinition = keydef;
}
public final void execute(Context context) {
// Get value of relvar
//
// PUSH - ValueRelation
RelvarGlobal relvar = context.getVirtualMachine().getRelDatabase().openGlobalRelvar(relvarName);
if (relvar == null)
throw new ExceptionSemantic("RS0281: Relation-valued variable " + relvarName + " no longer exists.");
if (!definedHeading.canAccept(relvar.getHeadingDefinition().getHeading()))
throw new ExceptionSemantic("RS0282: Relation-valued variable " + relvarName + " has heading " + relvar.getHeadingDefinition().getHeading() + " but " + definedHeading + " was expected.");
// TODO - check for inconsistency between relvar.getKeyDefinition() and definedKeyDefinition.
context.push(relvar.getValue(context.getGenerator()));
}
public String toString() {
return getName() + " " + relvarName;
}
}