72 * one group: parameter name (without prefix/suffix) |
72 * one group: parameter name (without prefix/suffix) |
73 */ |
73 */ |
74 private void buildPattern() { |
74 private void buildPattern() { |
75 StringBuilder patternString = new StringBuilder(); |
75 StringBuilder patternString = new StringBuilder(); |
76 |
76 |
77 patternString.append(Pattern.quote(namePrefix)); |
77 patternString.append(namePrefix); |
78 patternString.append("("); |
78 patternString.append("(?<paramName>"); |
79 for (int i = 0; i < parameters.size(); i++) { |
79 for (int i = 0; i < parameters.size(); i++) { |
80 patternString.append(Pattern.quote(parameters.get(i).getName())); |
80 patternString.append(Pattern.quote(parameters.get(i).getName())); |
81 if (i < parameters.size() - 1) { |
81 if (i < parameters.size() - 1) { |
82 patternString.append("|"); |
82 patternString.append("|"); |
83 } |
83 } |
84 } |
84 } |
85 patternString.append(")"); |
85 patternString.append(")"); |
86 patternString.append(Pattern.quote(nameSuffix)); |
86 patternString.append(nameSuffix); |
87 |
87 |
88 pattern = Pattern.compile(patternString.toString()); |
88 pattern = Pattern.compile(patternString.toString()); |
89 } |
89 } |
90 |
90 |
91 private void placeParametersAndUpdateQuery() throws SQLException { |
91 private void placeParametersAndUpdateQuery() throws SQLException { |
92 final String originalQuery = getQuery(); |
92 final String originalQuery = getQuery(); |
93 Matcher m = pattern.matcher(originalQuery); |
93 Matcher m = pattern.matcher(originalQuery); |
94 |
94 |
95 int lastPosition = 0; |
95 int lastPosition = 0; |
96 while (m.find(lastPosition)) { |
96 while (m.find(lastPosition)) { |
97 String name = m.group(1); |
97 String name = m.group("paramName"); |
98 |
98 |
99 updatedQuery.append(originalQuery.substring(lastPosition, m.start())); |
99 updatedQuery.append(originalQuery.substring(lastPosition, m.start())); |
100 updatedQuery.append("?"); |
100 updatedQuery.append("?"); |
101 |
101 |
102 parametersUsed.add(findByName(parameters, name)); |
102 parametersUsed.add(findByName(parameters, name)); |
105 } |
105 } |
106 updatedQuery.append(originalQuery.substring(lastPosition, originalQuery.length())); |
106 updatedQuery.append(originalQuery.substring(lastPosition, originalQuery.length())); |
107 |
107 |
108 for (NamedParameter definedParameter : parameters) { |
108 for (NamedParameter definedParameter : parameters) { |
109 if (findByName(parametersUsed, definedParameter.getName()) == null) { |
109 if (findByName(parametersUsed, definedParameter.getName()) == null) { |
110 throw new SQLException("Parameter „" + definedParameter.getName() + "“ is defined but not used in the query: „" + originalQuery + "“"); |
110 /** |
|
111 * User can have predefined set of parameters and use them with different SQL |
|
112 * queries that use only subset of these parameters → just warning, not exception. |
|
113 */ |
|
114 log.log(Level.WARNING, "Parameter „{0}“ is defined but not used in the query: „{1}“", new Object[]{definedParameter.getName(), originalQuery}); |
111 } |
115 } |
112 } |
116 } |
113 } |
117 } |
114 |
118 |
115 private void logPossiblyMissingParameters() { |
119 private void logPossiblyMissingParameters() { |
116 Pattern p = Pattern.compile(Pattern.quote(namePrefix) + ".*?" + Pattern.quote(nameSuffix)); |
120 Pattern p = Pattern.compile(namePrefix + "(?<paramName>.*?)" + nameSuffix); |
117 Matcher m = p.matcher(updatedQuery); |
121 Matcher m = p.matcher(updatedQuery); |
118 int lastPosition = 0; |
122 int lastPosition = 0; |
119 while (m.find(lastPosition)) { |
123 while (m.find(lastPosition)) { |
120 |
124 /** |
121 log.log(Level.WARNING, "Possibly missing parameter: {0}", m.group()); |
125 * We have not parsed and understood the SQL query; the parameter-like looking string |
|
126 * could be inside a literal part of the query → just warning, not exception. |
|
127 */ |
|
128 log.log(Level.WARNING, "Possibly missing parameter „{0}“ in the query: „{1}“", new Object[]{m.group("paramName"), getQuery()}); |
122 lastPosition = m.end(); |
129 lastPosition = m.end(); |
123 } |
130 } |
124 } |
131 } |
125 |
132 |
126 @Override |
133 @Override |