Hi, if I remember correctly someone posted a <connection> datatype so that one could define all the parameters for you <sql> tasks in one place and then refid them to the <sql> task. It seem to me this would be the ideal place to put this additional parameter definitions instead of overflowing the <sql> task with more elements. Just a thought. Jose Alberto
-----Original Message----- From: Paul King [mailto:[EMAIL PROTECTED] Sent: Tue 1/21/2003 8:17 AM To: [EMAIL PROTECTED] Cc: Subject: proposed patch to ANT SQL task Hi, I needed to pass properties in to a type-3 JDBC driver (WebLogic's RMI driver) in a SQL task. Perhaps I missed how this could be done using existing functionality. I also removed the need to have userid and password specified. The JDBC spec doesn't require them and some database drivers such as cloudscape don't need them. Net result is that I can now have databases which don't support user/pw fields (without dummy entries): <target name="test_db_init"> <sql driver="COM.cloudscape.core.JDBCDriver" url="jdbc:cloudscape:${base.dir}/database" onerror="continue" autocommit="true" > DELETE from NAMEAUDIT where NAME='xyzzy'; </sql> </target> And I can support properties: <target name="test_db_init2"> <sql driver="weblogic.jdbc.rmi.Driver" url="jdbc:weblogic:rmi" properties="weblogic.server.url=t3://localhost:7001;weblogic.jdbc.datasource=Testing-ageapp-AgeDS" onerror="continue" autocommit="true" > DELETE from NAMEAUDIT where NAME='xyzzy'; </sql> </target> Obviously you can place the username and password fields into the properties field directly if you want or still use the old style separate elements. I haven't checked that my code meets any style guidelines at this point or checked if it breaks any existing tests - just wanted some feedback first. I am new to this project and am not a commiter so let me know what I need to do now. I also wanted to support datasources directly so that I could have something like: <target name="test_db_init3"> <sql contextFactory="weblogic.jndi.WLInitialContextFactory" url="t3://localhost:7001" datasource="Testing-ageapp-AgeDS" onerror="continue" autocommit="true" > DELETE from NAMEAUDIT where NAME='xyzzy'; </sql> </target> This would let me support the latest best practice of using datasources which would allow me to write more portable ant scripts across different app servers but I wasn't sure how to get the JNDI code to support the SQL's optional classpath element so I wimped out. Regards, Paul. -------->8---------- *** JDBCTask.java.orig Wed Oct 2 11:09:20 2002 --- JDBCTask.java Tue Jan 21 15:47:18 2003 *************** *** 67,72 **** --- 67,73 ---- import java.sql.SQLException; import java.util.Hashtable; import java.util.Properties; + import java.util.StringTokenizer; /** * Handles JDBC configuration needed by SQL type tasks. *************** *** 171,177 **** */ private String password = null; ! /** * RDBMS Product needed for this SQL. **/ private String rdbms = null; --- 172,183 ---- */ private String password = null; ! /** ! * Properties ! */ ! private String properties = null; ! ! /** * RDBMS Product needed for this SQL. **/ private String rdbms = null; *************** *** 233,252 **** this.url = url; } ! /** ! * Sets the password; required. * @param password The password to set */ ! public void setPassword(String password) { this.password = password; } ! /** * Auto commit flag for database connection; * optional, default false. * @param autocommit The autocommit to set */ ! public void setAutocommit(boolean autocommit) { this.autocommit = autocommit; } --- 239,280 ---- this.url = url; } ! /** ! * Set the user name for the connection; ! * optional, but some RDBMSs will require it. ! * @param userId The userId to set ! */ ! public void setUserid(String userId) ! { ! this.userId = userId; ! } ! ! /** ! * Sets the password; ! * optional, but some RDBMSs will require it. * @param password The password to set */ ! public void setPassword(String password) ! { this.password = password; } ! /** ! * Sets the properties; optional. ! * @param properties The properties to set ! */ ! public void setProperties(String properties) ! { ! this.properties = properties; ! } ! ! /** * Auto commit flag for database connection; * optional, default false. * @param autocommit The autocommit to set */ ! public void setAutocommit(boolean autocommit) ! { this.autocommit = autocommit; } *************** *** 317,345 **** return loader; } ! /** * Creates a new Connection as using the driver, url, userid and password specified. * The calling method is responsible for closing the connection. * @return Connection the newly created connection. * @throws BuildException if the UserId/Password/Url is not set or there is no suitable driver or the driver fails to load. */ ! protected Connection getConnection() throws BuildException { ! if (userId == null) { ! throw new BuildException("User Id attribute must be set!", location); ! } ! if (password == null) { ! throw new BuildException("Password attribute must be set!", location); ! } if (url == null) { throw new BuildException("Url attribute must be set!", location); } try { log("connecting to " + getUrl(), Project.MSG_VERBOSE); ! Properties info = new Properties(); ! info.put("user", getUserId()); ! info.put("password", getPassword()); ! Connection conn = getDriver().connect(getUrl(), info); if (conn == null) { // Driver doesn't understand the URL --- 345,391 ---- return loader; } ! /** ! * Creates a new Properties data structure from userid, password and specified properties. ! * @return Properties the newly merged properties. ! * @throws BuildException if the properties string is malformed. ! */ ! protected Propterties getAllProperties() throws BuildException ! { ! Properties info = new Properties(); ! if (userId != null) info.put("user", getUserId()); ! if (password != null) info.put("password", getPassword()); ! if (properties != null) ! { ! StringTokenizer st = new StringTokenizer(getProperties(), ";"); ! while (st.hasMoreTokens()) ! { ! String token = st.nextToken(); ! int keyEnd = token.indexOf('='); ! if (keyEnd < 0 || keyEnd == token.length()-1) ! throw new BuildException("Malformed Property!", location); ! info.put(token.substring(0,keyEnd),token.substring(keyEnd+1)); ! } ! } ! return info; ! } ! ! /** * Creates a new Connection as using the driver, url, userid and password specified. * The calling method is responsible for closing the connection. * @return Connection the newly created connection. * @throws BuildException if the UserId/Password/Url is not set or there is no suitable driver or the driver fails to load. */ ! protected Connection getConnection() throws BuildException ! { if (url == null) { throw new BuildException("Url attribute must be set!", location); } try { + Connection conn=null; log("connecting to " + getUrl(), Project.MSG_VERBOSE); ! conn = getDriver().connect(getUrl(), getAllProperties()); if (conn == null) { // Driver doesn't understand the URL *************** *** 453,466 **** } /** - * Set the user name for the connection; required. - * @param userId The userId to set - */ - public void setUserid(String userId) { - this.userId = userId; - } - - /** * Gets the password. * @return Returns a String */ --- 499,504 ---- *************** *** 468,478 **** return password; } ! /** * Gets the rdbms. * @return Returns a String */ ! public String getRdbms() { return rdbms; } --- 506,526 ---- return password; } ! /** ! * Gets the properties. ! * @return Returns a String ! */ ! public String getProperties() ! { ! return properties; ! } ! ! /** * Gets the rdbms. * @return Returns a String */ ! public String getRdbms() ! { return rdbms; } -------->8---------- -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
<<winmail.dat>>
-- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>