package dbfit.util.oracle;
import java.util.List;
import static dbfit.util.oracle.OraclePlSqlGenerateUtils.callExpr;
import static dbfit.util.oracle.OraclePlSqlGenerateUtils.getSpCallLeftSide;
import static dbfit.util.oracle.OracleBooleanConversions.*;
public class OracleBooleanSpCommand extends OracleBooleanSpCommandBase {
public static OracleBooleanSpCommand newInstance(String spName,
List<OracleSpParameter> args) {
return newInstance(spName, args, null);
}
public static OracleBooleanSpCommand newInstance(String spName,
List<OracleSpParameter> args,
OracleSpParameter returnValue) {
return new OracleBooleanSpCommand(spName, args, returnValue);
}
protected OracleBooleanSpCommand(String spName,
List<OracleSpParameter> args, OracleSpParameter returnValue) {
super(spName, args, returnValue);
}
private boolean needsWrapperSp() {
return hasBooleanOutOrInout();
}
private boolean needsChr2Bool() {
return hasBooleanInOrInout();
}
private boolean needsBool2Chr() {
return hasBooleanOutOrInoutOrReturn();
}
public OracleBooleanSpInnerWrapperGenerator getWrapper() {
return new OracleBooleanSpInnerWrapperGenerator(this);
}
/**
* Generate the whole database call on the configured SpGeneratorOutput
*/
public void generate() {
append("declare\n");
genBool2Chr();
genChr2Bool();
genWrapperSp();
append("begin\n");
append(" ");
genCall();
append(";\n");
append("end;\n");
append("\n");
}
private void genWrapperSp() {
if (needsWrapperSp()) {
getWrapper().generate();
}
}
private void genChr2Bool() {
if (needsChr2Bool()) {
append(getChr2Bool(getPrefix()));
}
}
private void genBool2Chr() {
if (needsBool2Chr()) {
append(getBool2Chr(getPrefix()));
}
}
public String getCallArguments() {
StringBuilder sb = new StringBuilder();
String separator = "";
for (OracleSpParameter arg: arguments) {
sb.append(separator);
sb.append(arg.getCallArgument());
separator = ", ";
}
return sb.toString();
}
public void genCall() {
append(getSpCallLeftSide(isFunction() ? "?" : null));
String callText = callExpr(getCallName(), getCallArguments());
if (hasBooleanReturn()) {
callText = callExpr(getPrefix() + "_bool2chr", callText);
}
append(callText);
}
private String getCallName() {
if (needsWrapperSp()) {
return getWrapper().getWrapperName();
} else {
// no need of real wrapper sp
return procName;
}
}
}