java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java
branchv_0
changeset 8 4507cb9a0cf1
parent 5 26223eb63851
child 9 2ec52027b97f
--- a/java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java	Sun Dec 15 23:54:37 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/CLIParser.java	Sun Dec 15 23:54:51 2013 +0100
@@ -37,7 +37,7 @@
 			String arg = args[i];
 			switch (arg) {
 				case Tokens.TYPES:
-					String typesString = args[++i];
+					String typesString = fetchNext(args, ++i);
 
 					for (String oneType : typesString.split("\\s*,\\s*")) {
 						int sepatratorIndex = oneType.indexOf(TYPE_NAME_SEPARATOR);
@@ -51,18 +51,18 @@
 					}
 					break;
 				case Tokens.NAME_PREFIX:
-					options.setNamePrefix(args[++i]);
+					options.setNamePrefix(fetchNext(args, ++i));
 					break;
 				case Tokens.DB:
-					options.setDatabaseName(args[++i]);
+					options.setDatabaseName(fetchNext(args, ++i));
 					break;
 				case Tokens.SQL:
-					options.setSql(args[++i]);
+					options.setSql(fetchNext(args, ++i));
 					options.setCommandType(CLIOptions.COMMAND_TYPE.QUERY);
 					break;
 				case Tokens.SQL_UPDATE:
 				case Tokens.SQL_INSERT:
-					options.setSql(args[++i]);
+					options.setSql(fetchNext(args, ++i));
 					options.setCommandType(CLIOptions.COMMAND_TYPE.UPDATE);
 					break;
 				case Tokens.BATCH:
@@ -72,21 +72,27 @@
 					for (i++; i < args.length; i++) {
 						arg = args[i];
 
-						if (arg.startsWith(options.getNamePrefix())) {
+						if (arg.startsWith(options.getNamePrefix())) { // Named parameters:
 							String paramName = arg.substring(options.getNamePrefix().length());
-							String paramValue = args[++i];
+							String paramValue = fetchNext(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);
+						} else { // Numbered parameters:
+							Parameter parameter;
+							if (numberedTypes.isEmpty()) {
+								parameter = new Parameter(arg, null);
+							} 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);
+								}
+								parameter = new Parameter(arg, paramType);
 							}
-							options.addNumberedParameter(new Parameter(arg, paramType));
+							options.addNumberedParameter(parameter);
 						}
 					}
 					break;
@@ -94,11 +100,15 @@
 					throw new IllegalArgumentException("Unknown option: " + arg);
 			}
 		}
-
-
+		return options;
+	}
 
-		return options;
-
+	private String fetchNext(String[] args, int index) {
+		if (index < args.length) {
+			return args[index];
+		} else {
+			throw new IllegalArgumentException("Expecting value for option: " + args[index - 1]);
+		}
 	}
 
 	public static class Tokens {
@@ -116,7 +126,12 @@
 		}
 	}
 
-	private Integer getType(String typeString) {
-		return types.get(typeString);
+	private int getType(String typeString) {
+		Integer type = types.get(typeString);
+		if (type == null) {
+			throw new IllegalArgumentException("Unsupported type: " + typeString);
+		} else {
+			return type;
+		}
 	}
 }