java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java
branchv_0
changeset 51 6730214fab41
parent 50 074b81e5fa7c
child 54 53020d0bd2e4
     1.1 --- a/java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java	Tue Dec 24 01:42:24 2013 +0100
     1.2 +++ b/java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java	Tue Dec 24 11:54:58 2013 +0100
     1.3 @@ -18,13 +18,14 @@
     1.4  package info.globalcode.sql.dk;
     1.5  
     1.6  import static info.globalcode.sql.dk.Functions.notNull;
     1.7 -import static info.globalcode.sql.dk.Functions.escapeRegEx;
     1.8  import static info.globalcode.sql.dk.Functions.findByName;
     1.9  import java.sql.Connection;
    1.10  import java.sql.PreparedStatement;
    1.11  import java.sql.SQLException;
    1.12  import java.util.ArrayList;
    1.13  import java.util.List;
    1.14 +import java.util.logging.Level;
    1.15 +import java.util.logging.Logger;
    1.16  import java.util.regex.Matcher;
    1.17  import java.util.regex.Pattern;
    1.18  
    1.19 @@ -34,7 +35,7 @@
    1.20   */
    1.21  public class SQLCommandNamed extends SQLCommand {
    1.22  
    1.23 -	private static final String PROBLEM_MARK = "<OMG>";
    1.24 +	private static final Logger log = Logger.getLogger(SQLCommandNamed.class.getName());
    1.25  	private String namePrefix;
    1.26  	private String nameSuffix;
    1.27  	private List<NamedParameter> parameters;
    1.28 @@ -54,6 +55,7 @@
    1.29  	public PreparedStatement prepareStatement(Connection c) throws SQLException {
    1.30  		buildPattern();
    1.31  		placeParametersAndUpdateQuery();
    1.32 +		logPossiblyMissingParameters();
    1.33  		return c.prepareStatement(updatedQuery.toString());
    1.34  	}
    1.35  
    1.36 @@ -72,16 +74,16 @@
    1.37  	private void buildPattern() {
    1.38  		StringBuilder patternString = new StringBuilder();
    1.39  
    1.40 -		patternString.append(escapeRegEx(namePrefix));
    1.41 +		patternString.append(Pattern.quote(namePrefix));
    1.42  		patternString.append("(");
    1.43  		for (int i = 0; i < parameters.size(); i++) {
    1.44 -			patternString.append(escapeRegEx(parameters.get(i).getName()));
    1.45 -			if (i < parameters.size()) {
    1.46 +			patternString.append(Pattern.quote(parameters.get(i).getName()));
    1.47 +			if (i < parameters.size() - 1) {
    1.48  				patternString.append("|");
    1.49  			}
    1.50  		}
    1.51  		patternString.append(")");
    1.52 -		patternString.append(escapeRegEx(nameSuffix));
    1.53 +		patternString.append(Pattern.quote(nameSuffix));
    1.54  
    1.55  		pattern = Pattern.compile(patternString.toString());
    1.56  	}
    1.57 @@ -95,13 +97,6 @@
    1.58  			String name = m.group(1);
    1.59  
    1.60  			updatedQuery.append(originalQuery.substring(lastPosition, m.start()));
    1.61 -
    1.62 -			if (name.isEmpty()) {
    1.63 -				updatedQuery.append(PROBLEM_MARK);
    1.64 -				updatedQuery.append(originalQuery.substring(m.end(), originalQuery.length()));
    1.65 -				throw new SQLException("Named parameter (near " + PROBLEM_MARK + ") is not defined: „" + updatedQuery + "“");
    1.66 -			}
    1.67 -
    1.68  			updatedQuery.append("?");
    1.69  
    1.70  			parametersUsed.add(findByName(parameters, name));
    1.71 @@ -117,6 +112,17 @@
    1.72  		}
    1.73  	}
    1.74  
    1.75 +	private void logPossiblyMissingParameters() {
    1.76 +		Pattern p = Pattern.compile(Pattern.quote(namePrefix) + ".*?" + Pattern.quote(nameSuffix));
    1.77 +		Matcher m = p.matcher(updatedQuery);
    1.78 +		int lastPosition = 0;
    1.79 +		while (m.find(lastPosition)) {
    1.80 +
    1.81 +			log.log(Level.WARNING, "Possibly missing parameter: {0}", m.group());
    1.82 +			lastPosition = m.end();
    1.83 +		}
    1.84 +	}
    1.85 +
    1.86  	@Override
    1.87  	public List<NamedParameter> getParameters() {
    1.88  		return parameters;