diff -r f5c3350f3d78 -r 26223eb63851 java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java Sun Dec 15 22:44:11 2013 +0100 @@ -0,0 +1,122 @@ +package info.globalcode.sql.dk; + +import java.sql.Types; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * + * @author Ing. František Kučera (frantovo.cz) + */ +public class CLIParser { + + public static final String TYPE_NAME_SEPARATOR = ":"; + private final Map types; + + public CLIParser() { + Map m = new HashMap<>(); + m.put("int", Types.INTEGER); + m.put("string", Types.VARCHAR); + m.put("boolean", Types.BOOLEAN); + /** + * TODO: more types + */ + types = Collections.unmodifiableMap(m); + } + + public CLIOptions parseOptions(String[] args) { + CLIOptions options = new CLIOptions(); + + List numberedTypes = new ArrayList<>(); + Map namedTypes = new HashMap<>(); + + for (int i = 0; i < args.length; i++) { + String arg = args[i]; + switch (arg) { + case Tokens.TYPES: + String typesString = args[++i]; + + for (String oneType : typesString.split("\\s*,\\s*")) { + int sepatratorIndex = oneType.indexOf(TYPE_NAME_SEPARATOR); + if (sepatratorIndex == -1) { + numberedTypes.add(getType(oneType)); + } else { + String namePart = oneType.substring(0, sepatratorIndex); + String typePart = oneType.substring(sepatratorIndex + TYPE_NAME_SEPARATOR.length(), oneType.length()); + namedTypes.put(namePart, getType(typePart)); + } + } + break; + case Tokens.NAME_PREFIX: + options.setNamePrefix(args[++i]); + break; + case Tokens.DB: + options.setDatabaseName(args[++i]); + break; + case Tokens.SQL: + options.setSql(args[++i]); + options.setCommandType(CLIOptions.COMMAND_TYPE.QUERY); + break; + case Tokens.SQL_UPDATE: + case Tokens.SQL_INSERT: + options.setSql(args[++i]); + options.setCommandType(CLIOptions.COMMAND_TYPE.UPDATE); + break; + case Tokens.BATCH: + options.setBatch(true); + break; + case Tokens.DATA: // --data is the last option + for (i++; i < args.length; i++) { + arg = args[i]; + + if (arg.startsWith(options.getNamePrefix())) { + String paramName = arg.substring(options.getNamePrefix().length()); + String paramValue = args[++i]; + options.addNamedParameter(new NamedParameter(paramName, paramValue, namedTypes.get(paramName))); + } else { + int paramIndex = options.getNumberedParameters().size(); + int paramType; + try { + paramType = numberedTypes.get(paramIndex); + } catch (IndexOutOfBoundsException e) { + throw new IllegalArgumentException("Missing type for parameter #" + paramIndex, e); + } catch (NullPointerException e) { + throw new IllegalArgumentException("Invalid type definition for parameter #" + paramIndex, e); + } + options.addNumberedParameter(new Parameter(arg, paramType)); + } + } + break; + default: + throw new IllegalArgumentException("Unknown option: " + arg); + } + } + + + + return options; + + } + + public static class Tokens { + + public static final String DB = "--db"; + public static final String SQL = "--sql"; + public static final String SQL_UPDATE = "--sql-update"; + public static final String SQL_INSERT = "--sql-insert"; + public static final String BATCH = "--batch"; + public static final String DATA = "--data"; + public static final String NAME_PREFIX = "--name-prefix"; + public static final String TYPES = "--types"; + + private Tokens() { + } + } + + private Integer getType(String typeString) { + return types.get(typeString); + } +}