convert named parameters to numbered v_0
authorFrantišek Kučera <franta-hg@frantovo.cz>
Wed, 08 Jan 2014 12:44:18 +0100
branchv_0
changeset 143 1336bb9a4499
parent 142 da1e38386d84
child 144 d273d7c6dc0c
convert named parameters to numbered
java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java
java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNumbered.java
--- a/java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java	Tue Jan 07 21:54:59 2014 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNamed.java	Wed Jan 08 12:44:18 2014 +0100
@@ -17,7 +17,6 @@
  */
 package info.globalcode.sql.dk;
 
-import static info.globalcode.sql.dk.Functions.notNull;
 import static info.globalcode.sql.dk.Functions.findByName;
 import java.sql.Connection;
 import java.sql.PreparedStatement;
@@ -43,6 +42,7 @@
 	private List<NamedParameter> parametersUsed = new ArrayList<>();
 	private StringBuilder updatedQuery;
 	private Pattern pattern;
+	private SQLCommandNumbered numbered;
 
 	public SQLCommandNamed(String query, List<NamedParameter> parameters, String namePrefix, String nameSuffix) {
 		super(query);
@@ -54,6 +54,15 @@
 
 	@Override
 	public PreparedStatement prepareStatement(Connection c) throws SQLException {
+		return getSQLCommandNumbered().prepareStatement(c);
+	}
+
+	@Override
+	public void parametrize(PreparedStatement ps) throws SQLException {
+		getSQLCommandNumbered().parametrize(ps);
+	}
+
+	private void prepare() throws SQLException {
 		try {
 			buildPattern();
 			placeParametersAndUpdateQuery();
@@ -61,22 +70,25 @@
 		} catch (PatternSyntaxException e) {
 			throw new SQLException("Name prefix „" + namePrefix + "“ or suffix „" + nameSuffix + "“ contain a wrong regular expression. " + e.getLocalizedMessage(), e);
 		}
-		return c.prepareStatement(updatedQuery.toString());
 	}
 
-	@Override
-	public void parametrize(PreparedStatement ps) throws SQLException {
-		int i = 1;
-		for (Parameter p : notNull(parametersUsed)) {
-			ps.setObject(i++, p.getValue(), p.getType().getCode());
+	/**
+	 * @return SQL command with named parameters converted to SQL command with numbered parameters
+	 */
+	public SQLCommandNumbered getSQLCommandNumbered() throws SQLException {
+		if (numbered == null) {
+			prepare();
+			numbered = new SQLCommandNumbered(updatedQuery.toString(), parametersUsed);
 		}
+
+		return numbered;
 	}
 
 	/**
 	 * Builds a regexp pattern that matches all parameter names (with prefix/suffix) and which has
 	 * one group: parameter name (without prefix/suffix)
 	 */
-	private void buildPattern() {
+	private void buildPattern() throws PatternSyntaxException {
 		StringBuilder patternString = new StringBuilder();
 
 		patternString.append(namePrefix);
@@ -93,7 +105,7 @@
 		pattern = Pattern.compile(patternString.toString());
 	}
 
-	private void placeParametersAndUpdateQuery() throws SQLException {
+	private void placeParametersAndUpdateQuery() {
 		final String originalQuery = getQuery();
 		Matcher m = pattern.matcher(originalQuery);
 
--- a/java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNumbered.java	Tue Jan 07 21:54:59 2014 +0100
+++ b/java/sql-dk/src/info/globalcode/sql/dk/SQLCommandNumbered.java	Wed Jan 08 12:44:18 2014 +0100
@@ -28,9 +28,9 @@
  */
 public class SQLCommandNumbered extends SQLCommand {
 
-	private List<Parameter> parameters;
+	private List<? extends Parameter> parameters;
 
-	public SQLCommandNumbered(String query, List<Parameter> parameters) {
+	public SQLCommandNumbered(String query, List<? extends Parameter> parameters) {
 		super(query);
 		this.parameters = parameters;
 	}
@@ -44,7 +44,7 @@
 	}
 
 	@Override
-	public List<Parameter> getParameters() {
+	public List<? extends Parameter> getParameters() {
 		return parameters;
 	}
 }