Author: sebb
Date: Sun Mar 26 07:50:54 2006
New Revision: 388916

URL: http://svn.apache.org/viewcvs?rev=388916&view=rev
Log:
Bug 38682 - add CallableStatement functionality to JDBC Sampler

Modified:
    
jakarta/jmeter/branches/rel-2-1/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSampler.java
    
jakarta/jmeter/branches/rel-2-1/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerBeanInfo.java
    jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml

Modified: 
jakarta/jmeter/branches/rel-2-1/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSampler.java
URL: 
http://svn.apache.org/viewcvs/jakarta/jmeter/branches/rel-2-1/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSampler.java?rev=388916&r1=388915&r2=388916&view=diff
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-1/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSampler.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-1/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSampler.java
 Sun Mar 26 07:50:54 2006
@@ -1,6 +1,5 @@
-// $Header$
 /*
- * Copyright 2001-2005 The Apache Software Foundation.
+ * Copyright 2001-2006 The Apache Software Foundation.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -18,6 +17,7 @@
 
 package org.apache.jmeter.protocol.jdbc.sampler;
 
+import java.sql.CallableStatement;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.ResultSetMetaData;
@@ -25,10 +25,10 @@
 import java.sql.Statement;
 
 import org.apache.avalon.excalibur.datasource.DataSourceComponent;
+import org.apache.jmeter.samplers.AbstractSampler;
 import org.apache.jmeter.samplers.Entry;
 import org.apache.jmeter.samplers.SampleResult;
 import org.apache.jmeter.testbeans.TestBean;
-import org.apache.jmeter.samplers.AbstractSampler;
 import org.apache.jorphan.collections.Data;
 import org.apache.jorphan.logging.LoggingManager;
 import org.apache.log.Logger;
@@ -38,19 +38,22 @@
  * 
  * @author Original author unknown
  * @author <a href="mailto:[EMAIL PROTECTED]">Jeremy Arnold</a>
- * @version $Revision$
  */
 public class JDBCSampler extends AbstractSampler implements TestBean {
-       private static Logger log = LoggingManager.getLoggerForClass();
+       private static final Logger log = LoggingManager.getLoggerForClass();
 
-       public static final String QUERY = "query";
-       public static final String SELECT = "Select Statement";
+    static final String QUERY = "query";
+    
+    // Query types
+       static final String SELECT   = "Select Statement";
+       static final String UPDATE   = "Update Statement";
+       static final String CALLABLE = "Callable Statement";
 
-       public String query = "";
+       private String query = "";
 
-       public String dataSource = "";
+       private String dataSource = "";
 
-       public String queryType = SELECT;
+       private String queryType = SELECT;
 
        /**
         * Creates a JDBCSampler.
@@ -60,15 +63,24 @@
 
        public SampleResult sample(Entry e) {
                log.debug("sampling jdbc");
-               SampleResult res = new SampleResult();
+               
+        SampleResult res = new SampleResult();
                res.setSampleLabel(getName());
                res.setSamplerData(toString());
+        res.setDataType(SampleResult.TEXT);
+        // Bug 31184 - make sure encoding is specified
+        res.setDataEncoding(System.getProperty("file.encoding"));
+
+        // Assume we will be successful
+        res.setSuccessful(true);
+
 
                res.sampleStart();
                DataSourceComponent pool = (DataSourceComponent) 
getThreadContext().getVariables().getObject(getDataSource());
                log.debug("DataSourceComponent: " + pool);
                Connection conn = null;
                Statement stmt = null;
+               CallableStatement cs = null;
 
                try {
 
@@ -80,52 +92,45 @@
                        conn = pool.getConnection();
                        stmt = conn.createStatement();
 
-                       // Based on query return value, get results
-                       if (SELECT.equals(getQueryType())) {
+            // Based on query return value, get results
+            String _queryType = getQueryType();
+            if (SELECT.equals(_queryType)) {
                                ResultSet rs = null;
                                try {
                                        rs = stmt.executeQuery(getQuery());
                                        Data data = getDataFromResultSet(rs);
                                        
res.setResponseData(data.toString().getBytes());
                                } finally {
-                                       if (rs != null) {
-                                               try {
-                                                       rs.close();
-                                               } catch (SQLException exc) {
-                                                       log.warn("Error closing 
ResultSet", exc);
-                                               }
-                                       }
+                                       close(rs);
+                               }
+                       } else if (CALLABLE.equals(_queryType)) {
+                               try {
+                                       cs = conn.prepareCall(getQuery());
+                                       cs.execute();
+                                       String results = "Executed";
+                                       res.setResponseData(results.getBytes());
+                               } finally {
+                                       close(cs);
                                }
-                       } else {
+            } else if (UPDATE.equals(_queryType)) {
                                stmt.execute(getQuery());
                                int updateCount = stmt.getUpdateCount();
                                String results = updateCount + " updates";
                                res.setResponseData(results.getBytes());
+            // TODO add support for PreparedStatments
+            } else { // User provided incorrect query type
+                String results="Unexpected query type: "+_queryType;
+                res.setResponseMessage(results);
+                res.setSuccessful(false);
                        }
 
-                       res.setDataType(SampleResult.TEXT);
-                       // Bug 31184 - make sure encoding is specified
-                       
res.setDataEncoding(System.getProperty("file.encoding"));
-                       res.setSuccessful(true);
                } catch (SQLException ex) {
                        log.error("Error in JDBC sampling", ex);
                        res.setResponseMessage(ex.toString());
                        res.setSuccessful(false);
                } finally {
-                       if (stmt != null) {
-                               try {
-                                       stmt.close();
-                               } catch (SQLException ex) {
-                                       log.warn("Error closing statement", ex);
-                               }
-                       }
-                       if (conn != null) {
-                               try {
-                                       conn.close();
-                               } catch (SQLException ex) {
-                                       log.warn("Error closing connection", 
ex);
-                               }
-                       }
+                       close(stmt);
+                       close(conn);
                }
 
                res.sampleEnd();
@@ -164,12 +169,49 @@
                return data;
        }
 
+       public static void close(Connection c) {
+               try {
+                       if (c != null) c.close();
+               } catch (SQLException e) {
+                       log.warn("Error closing Connection", e);
+               }
+       }
+       
+       public static void close(Statement s) {
+               try {
+                       if (s != null) s.close();
+               } catch (SQLException e) {
+                       log.warn("Error closing Statement", e);
+               }
+       }
+
+       public static void close(CallableStatement cs) {
+               try {
+                       if (cs != null) cs.close();
+               } catch (SQLException e) {
+                       log.warn("Error closing CallableStatement", e);
+               }
+       }
+
+       public static void close(ResultSet rs) {
+               try {
+                       if (rs != null) rs.close();
+               } catch (SQLException e) {
+                       log.warn("Error closing ResultSet", e);
+               }
+       }
+
        public String getQuery() {
                return query;
        }
 
        public String toString() {
-               return getQuery();
+        StringBuffer sb = new StringBuffer(80);
+        sb.append("[");
+        sb.append(getQueryType());
+        sb.append("] ");
+        sb.append(getQuery());
+               return sb.toString();
        }
 
        /**

Modified: 
jakarta/jmeter/branches/rel-2-1/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerBeanInfo.java
URL: 
http://svn.apache.org/viewcvs/jakarta/jmeter/branches/rel-2-1/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerBeanInfo.java?rev=388916&r1=388915&r2=388916&view=diff
==============================================================================
--- 
jakarta/jmeter/branches/rel-2-1/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerBeanInfo.java
 (original)
+++ 
jakarta/jmeter/branches/rel-2-1/src/protocol/jdbc/org/apache/jmeter/protocol/jdbc/sampler/JDBCSamplerBeanInfo.java
 Sun Mar 26 07:50:54 2006
@@ -50,7 +50,7 @@
                p.setValue(NOT_UNDEFINED, Boolean.TRUE);
                p.setValue(DEFAULT, JDBCSampler.SELECT);
                p.setValue(NOT_OTHER,Boolean.TRUE);
-               p.setValue(TAGS,new String[]{JDBCSampler.SELECT,"Update 
Statement"});
+               p.setValue(TAGS,new 
String[]{JDBCSampler.SELECT,JDBCSampler.UPDATE,JDBCSampler.CALLABLE});
 
                p = property("query");
                p.setValue(NOT_UNDEFINED, Boolean.TRUE);

Modified: jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml
URL: 
http://svn.apache.org/viewcvs/jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml?rev=388916&r1=388915&r2=388916&view=diff
==============================================================================
--- jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml (original)
+++ jakarta/jmeter/branches/rel-2-1/xdocs/changes.xml Sun Mar 26 07:50:54 2006
@@ -68,6 +68,7 @@
 <li>Bug 38901 - Add optional SOAPAction header to SOAP Sampler</li>
 <li>New BeanShell test elements: Timer, PreProcessor, PostProcessor, 
Listener</li>
 <li>__split() function now clears next variable, so it can be used with 
ForEach Controller</li>
+<li>Bug 38682 - add CallableStatement functionality to JDBC Sampler</li>
 </ul>
 
 <h4>Bug fixes:</h4>



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to