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