package dbfit.util.oracle; import dbfit.util.Direction; public class OracleSpParameter extends OracleSpParameterBase { public static OracleSpParameter newInstance(String paramName, Direction direction, String dataType) { return newInstance(paramName, direction, dataType, "x"); } public static OracleSpParameter newInstance(String paramName, Direction direction, String dataType, String prefix) { return new OracleSpParameter(paramName, direction, dataType, prefix); } protected OracleSpParameter(String paramName, Direction direction, String dataType, String prefix) { super(paramName, direction, dataType, prefix); } private boolean needsArgumentTypeChange() { return isBooleanOutOrInout(); } private String getWrapperArgumentType() { return needsArgumentTypeChange() ? "VARCHAR2" : getDataType(); } public String getShortDirectionName() { switch (getDirection()) { case INPUT_OUTPUT: return "inout"; case OUTPUT: return "out"; case INPUT: return "in"; default: return "ret"; } } private String getWrapperArgumentName() { return direction.isReturnValue() ? "" : prefixed(id); } public String getWrapperVarName() { String varid = direction.isReturnValue() ? "" : id + "_"; return prefixed("v_" + varid + getShortDirectionName()); } private void declareArgumentOrReturnValue() { out.append(getWrapperArgumentName()) .append(" ") .append(getDirectionName()) .append(" ").append(getWrapperArgumentType()); } public void declareArgument() { declareArgumentOrReturnValue(); } public void declareReturnValue() { declareArgumentOrReturnValue(); } private void initializeVariable() { if (getDirection() == Direction.INPUT_OUTPUT) { out.append(" := ").append(chr2bool(getWrapperArgumentName())); } } public void declareVariable() { if (needsArgumentTypeChange() || direction.isReturnValue()) { out.append(" ") .append(getWrapperVarName()) .append(" ").append(getDataType()); initializeVariable(); out.append(";\n"); } } public void assignOutputVariable() { if (needsArgumentTypeChange()) { out.append(" ") .append(getWrapperArgumentName()) .append(" := ") .append(bool2chr(getWrapperVarName())) .append(";\n"); } } public String getCallArgument() { return getCallArgument("?"); } private String getCallArgument(String varname) { StringBuilder sb = new StringBuilder(); if (isBoolean() && direction.isInput()) { sb.append(chr2bool(varname)); } else { sb.append(varname); } return sb.toString(); } public void genSpCallArgumentWithinWrapper() { if (needsArgumentTypeChange()) { out.append(getWrapperVarName()); } else { out.append(getWrapperArgumentName()); } } private String chr2bool(String arg) { return prefixedCallExpr("chr2bool", arg); } private String bool2chr(String arg) { return prefixedCallExpr("bool2chr", arg); } }