Repository: camel
Updated Branches:
  refs/heads/camel-2.12.x 563d143d4 -> 4c62b2e4a
  refs/heads/camel-2.13.x b4e769ee3 -> 324669312
  refs/heads/master 236c8e5d9 -> c1522c1a1


CAMEL-7653: camel-sql, set prepared statement arguments using a setter that 
deals with various JDBC driver differences with setObject vs 
setInteger/setString etc. Thanks to Jo Geraerts for the patch.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/c1522c1a
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/c1522c1a
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/c1522c1a

Branch: refs/heads/master
Commit: c1522c1a109ba58891a1e50af05e93a1a5017209
Parents: 236c8e5
Author: Claus Ibsen <davscl...@apache.org>
Authored: Mon Aug 4 09:24:09 2014 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Mon Aug 4 09:24:09 2014 +0200

----------------------------------------------------------------------
 .../sql/DefaultSqlPrepareStatementStrategy.java | 30 ++++++++++++++------
 1 file changed, 21 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/c1522c1a/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
----------------------------------------------------------------------
diff --git 
a/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
 
b/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
index 4b1b2d5..b46714e 100644
--- 
a/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
+++ 
b/components/camel-sql/src/main/java/org/apache/camel/component/sql/DefaultSqlPrepareStatementStrategy.java
@@ -33,6 +33,7 @@ import org.apache.camel.language.simple.SimpleLanguage;
 import org.apache.camel.util.StringQuoteHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.jdbc.core.ArgumentPreparedStatementSetter;
 
 /**
  * Default {@link SqlPrepareStatementStrategy} that supports named query 
parameters as well index based.
@@ -91,19 +92,30 @@ public class DefaultSqlPrepareStatementStrategy implements 
SqlPrepareStatementSt
 
     @Override
     public void populateStatement(PreparedStatement ps, Iterator<?> iterator, 
int expectedParams) throws SQLException {
+        if (expectedParams <= 0) {
+            return;
+        }
+
+        final Object[] args = new Object[expectedParams];
+        int i = 0;
         int argNumber = 1;
-        if (expectedParams > 0) {
-            while (iterator != null && iterator.hasNext()) {
-                Object value = iterator.next();
-                LOG.trace("Setting parameter #{} with value: {}", argNumber, 
value);
-                ps.setObject(argNumber, value);
-                argNumber++;
+
+        while (iterator != null && iterator.hasNext()) {
+            Object value = iterator.next();
+            LOG.trace("Setting parameter #{} with value: {}", argNumber, 
value);
+            if (argNumber <= expectedParams) {
+                args[i] = value;
             }
+            argNumber++;
+            i++;
         }
-
         if (argNumber - 1 != expectedParams) {
-            throw new SQLException("Number of parameters mismatch. Expected: " 
+ expectedParams + ", was:" + (argNumber - 1));
+            throw new SQLException("Number of parameters mismatch. Expected: " 
+ expectedParams + ", was: " + (argNumber - 1));
         }
+
+        // use argument setter as it deals with various JDBC drivers setObject 
vs setLong/setInteger/setString etc.
+        ArgumentPreparedStatementSetter setter = new 
ArgumentPreparedStatementSetter(args);
+        setter.setValues(ps);
     }
 
     protected boolean hasNamedParameters(String query) {
@@ -131,7 +143,7 @@ public class DefaultSqlPrepareStatementStrategy implements 
SqlPrepareStatementSt
 
     private static final class PopulateIterator implements Iterator<Object> {
         private static final String MISSING_PARAMETER_EXCEPTION =
-            "Cannot find key [%s] in message body or headers to use when 
setting named parameter in query [%s]";
+                "Cannot find key [%s] in message body or headers to use when 
setting named parameter in query [%s]";
         private final String query;
         private final NamedQueryParser parser;
         private final Exchange exchange;

Reply via email to