--- a/java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java Tue Dec 24 14:23:22 2013 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java Tue Dec 24 14:36:14 2013 +0100
@@ -74,8 +74,8 @@
private void buildPattern() {
StringBuilder patternString = new StringBuilder();
- patternString.append(Pattern.quote(namePrefix));
- patternString.append("(");
+ patternString.append(namePrefix);
+ patternString.append("(?<paramName>");
for (int i = 0; i < parameters.size(); i++) {
patternString.append(Pattern.quote(parameters.get(i).getName()));
if (i < parameters.size() - 1) {
@@ -83,7 +83,7 @@
}
}
patternString.append(")");
- patternString.append(Pattern.quote(nameSuffix));
+ patternString.append(nameSuffix);
pattern = Pattern.compile(patternString.toString());
}
@@ -94,7 +94,7 @@
int lastPosition = 0;
while (m.find(lastPosition)) {
- String name = m.group(1);
+ String name = m.group("paramName");
updatedQuery.append(originalQuery.substring(lastPosition, m.start()));
updatedQuery.append("?");
@@ -107,18 +107,25 @@
for (NamedParameter definedParameter : parameters) {
if (findByName(parametersUsed, definedParameter.getName()) == null) {
- throw new SQLException("Parameter „" + definedParameter.getName() + "“ is defined but not used in the query: „" + originalQuery + "“");
+ /**
+ * User can have predefined set of parameters and use them with different SQL
+ * queries that use only subset of these parameters → just warning, not exception.
+ */
+ log.log(Level.WARNING, "Parameter „{0}“ is defined but not used in the query: „{1}“", new Object[]{definedParameter.getName(), originalQuery});
}
}
}
private void logPossiblyMissingParameters() {
- Pattern p = Pattern.compile(Pattern.quote(namePrefix) + ".*?" + Pattern.quote(nameSuffix));
+ Pattern p = Pattern.compile(namePrefix + "(?<paramName>.*?)" + nameSuffix);
Matcher m = p.matcher(updatedQuery);
int lastPosition = 0;
while (m.find(lastPosition)) {
-
- log.log(Level.WARNING, "Possibly missing parameter: {0}", m.group());
+ /**
+ * We have not parsed and understood the SQL query; the parameter-like looking string
+ * could be inside a literal part of the query → just warning, not exception.
+ */
+ log.log(Level.WARNING, "Possibly missing parameter „{0}“ in the query: „{1}“", new Object[]{m.group("paramName"), getQuery()});
lastPosition = m.end();
}
}