package info.globalcode.sql.dk;
import static info.globalcode.sql.dk.Functions.isNotEmpty;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
*
* @author Ing. František Kučera (frantovo.cz)
*/
public class CLIOptions {
private String sql;
private String databaseName;
private boolean batch;
public enum MODE {
QUERY_NOW,
PREPARE_BATCH,
EXECUTE_BATCH
}
public enum COMMAND_TYPE {
/** SELECT */
QUERY,
/** INSERT, UPDATE, DELETE */
UPDATE
};
private COMMAND_TYPE commandType;
private final Collection<NamedParameter> namedParameters = new ArrayList<>();
private final List<Parameter> numberedParameters = new ArrayList<>();
public void validate() throws InvalidOptionsException {
InvalidOptionsException e = new InvalidOptionsException();
if (getMode() == null) {
e.addProblem(new InvalidOptionsException.OptionProblem("Invalid combination of DB, SQL and BATCH – please specify just 2 of this 3 options"));
}
if (!namedParameters.isEmpty() && !numberedParameters.isEmpty()) {
e.addProblem(new InvalidOptionsException.OptionProblem("Named and numbered parameters can not be used together in one command."));
}
if (e.hasProblems()) {
throw e;
}
}
private boolean hasSql() {
return isNotEmpty(getSql(), true);
}
private boolean hasDb() {
return isNotEmpty(getDatabaseName(), true);
}
/**
* Depends on options: DB, BATCH, SQL
*
* @return mode | or null if options are not yet initialized or combination of options is
* invalid
*/
public MODE getMode() {
if (hasDb() && !batch && hasSql()) {
return MODE.QUERY_NOW;
} else if (!hasDb() && batch && hasSql()) {
return MODE.PREPARE_BATCH;
} else if (hasDb() && batch && !hasSql()) {
return MODE.EXECUTE_BATCH;
} else {
return null;
}
}
public String getSql() {
return sql;
}
public void setSql(String sql) {
this.sql = sql;
}
public String getDatabaseName() {
return databaseName;
}
public void setDatabaseName(String databaseName) {
this.databaseName = databaseName;
}
public void setBatch(boolean batch) {
this.batch = batch;
}
public COMMAND_TYPE getCommandType() {
return commandType;
}
public void setCommandType(COMMAND_TYPE commandType) {
this.commandType = commandType;
}
public Collection<NamedParameter> getNamedParameters() {
return namedParameters;
}
public List<Parameter> getNumberedParameters() {
return numberedParameters;
}
public void addNumberedParameter(Parameter p) {
numberedParameters.add(p);
}
public void addNamedParameter(NamedParameter p) {
namedParameters.add(p);
}
}