package org.n3r.eql.impl;
import com.google.common.collect.Lists;
import lombok.AllArgsConstructor;
import lombok.SneakyThrows;
import org.n3r.eql.map.EqlRun;
import org.n3r.eql.param.EqlParamPlaceholder;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.util.List;
@AllArgsConstructor
public class EqlProc {
private final EqlRun eqlRun;
private final EqlRsRetriever rsRetriever;
public Object dealProcedure(PreparedStatement ps) {
return execAndRetrieveProcedureRet(eqlRun, (CallableStatement) ps);
}
@SneakyThrows
private Object execAndRetrieveProcedureRet(EqlRun subSql, CallableStatement cs) {
cs.execute();
if (subSql.getOutCount() == 0) return null;
if (subSql.getOutCount() == 1)
for (int i = 0, ii = subSql.getPlaceHolders().length; i < ii; ++i)
if (subSql.getPlaceHolders()[i].getInOut() != EqlParamPlaceholder.InOut.IN)
return cs.getObject(i + 1);
switch (subSql.getPlaceHolderOutType()) {
case AUTO_SEQ:
return retrieveAutoSeqOuts(subSql, cs);
case VAR_NAME:
return rsRetriever.getCallableReturnMapper().mapResult(subSql, cs);
default:
break;
}
return null;
}
@SneakyThrows
private Object retrieveAutoSeqOuts(EqlRun subSql, CallableStatement cs) {
List<Object> objects = Lists.newArrayList();
for (int i = 0, ii = subSql.getPlaceHolders().length; i < ii; ++i)
if (subSql.getPlaceHolders()[i].getInOut() != EqlParamPlaceholder.InOut.IN)
objects.add(cs.getObject(i + 1));
return objects;
}
}