java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java
branchv_0
changeset 54 53020d0bd2e4
parent 51 6730214fab41
child 61 deba1f6600f8
equal deleted inserted replaced
53:eb30ad93ca8b 54:53020d0bd2e4
    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