You are viewing a plain text version of this content. The canonical link for it is here.
Posted to jmeter-dev@jakarta.apache.org by se...@apache.org on 2006/03/26 17:50:56 UTC

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

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:jeremy_a@bigfoot.com">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: jmeter-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: jmeter-dev-help@jakarta.apache.org