1 package info.globalcode.sql.dk;
4 import java.util.ArrayList;
5 import java.util.Collections;
6 import java.util.HashMap;
12 * @author Ing. František Kučera (frantovo.cz)
14 public class CLIStarter {
16 public static final String TYPE_NAME_SEPARATOR = ":";
17 private static final Map<String, Integer> types;
20 Map<String, Integer> m = new HashMap<>();
21 m.put("int", Types.INTEGER);
22 m.put("string", Types.VARCHAR);
23 m.put("boolean", Types.BOOLEAN);
27 types = Collections.unmodifiableMap(m);
30 public static void main(String[] args) {
32 args = new String[]{"--sql", "SELECT * FROM tabulka;", "--db", "databáze_1", "--types", "int,bbb,omfg:int,omg:boolean", "--data", "xxx", ":omfg", "hodnota omfg", ":omg", "true"};
34 CLIOptions options = parseOptions(args);
37 private static CLIOptions parseOptions(String[] args) {
38 CLIOptions options = new CLIOptions();
40 List<Integer> numberedTypes = new ArrayList<>();
41 Map<String, Integer> namedTypes = new HashMap<>();
43 for (int i = 0; i < args.length; i++) {
47 String typesString = args[++i];
49 for (String oneType : typesString.split("\\s*,\\s*")) {
50 int sepatratorIndex = oneType.indexOf(TYPE_NAME_SEPARATOR);
51 if (sepatratorIndex == -1) {
52 numberedTypes.add(getType(oneType));
54 String namePart = oneType.substring(0, sepatratorIndex);
55 String typePart = oneType.substring(sepatratorIndex + TYPE_NAME_SEPARATOR.length(), oneType.length());
56 namedTypes.put(namePart, getType(typePart));
60 case Tokens.NAME_PREFIX:
61 options.setNamePrefix(args[++i]);
64 options.setDatabaseName(args[++i]);
67 options.setSql(args[++i]);
68 options.setCommandType(CLIOptions.COMMAND_TYPE.QUERY);
70 case Tokens.SQL_UPDATE:
71 case Tokens.SQL_INSERT:
72 options.setSql(args[++i]);
73 options.setCommandType(CLIOptions.COMMAND_TYPE.UPDATE);
76 options.setBatch(true);
78 case Tokens.DATA: // --data is the last option
79 for (i++; i < args.length; i++) {
82 if (arg.startsWith(options.getNamePrefix())) {
83 String paramName = arg.substring(options.getNamePrefix().length());
84 String paramValue = args[++i];
85 options.addNamedParameter(new NamedParameter(paramName, paramValue, namedTypes.get(paramName)));
87 int paramIndex = options.getNumberedParameters().size();
90 paramType = numberedTypes.get(paramIndex);
91 } catch (IndexOutOfBoundsException e) {
92 throw new IllegalArgumentException("Missing type for parameter #" + paramIndex, e);
93 } catch (NullPointerException e) {
94 throw new IllegalArgumentException("Invalid type definition for parameter #" + paramIndex, e);
96 options.addNumberedParameter(new Parameter(arg, paramType));
101 throw new IllegalArgumentException("Unknown option: " + arg);
111 public static class Tokens {
113 public static final String DB = "--db";
114 public static final String SQL = "--sql";
115 public static final String SQL_UPDATE = "--sql-update";
116 public static final String SQL_INSERT = "--sql-insert";
117 public static final String BATCH = "--batch";
118 public static final String DATA = "--data";
119 public static final String NAME_PREFIX = "--name-prefix";
120 public static final String TYPES = "--types";
126 private static Integer getType(String typeString) {
127 return types.get(typeString);