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]>