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