Browse Source

Modified <sql> task to accept #PCDATA and added autocommit attribute.

Submitted by:	Jeff Martin <jeff.martin@synamic.co.uk>


git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@267838 13f79535-47bb-0310-9956-ffa450edef68
master
Stefan Bodewig 25 years ago
parent
commit
4f46532c94
1 changed files with 100 additions and 41 deletions
  1. +100
    -41
      src/main/org/apache/tools/ant/taskdefs/SQLExec.java

+ 100
- 41
src/main/org/apache/tools/ant/taskdefs/SQLExec.java View File

@@ -72,6 +72,21 @@ import java.sql.*;
*/ */
public class SQLExec extends Task { public class SQLExec extends Task {


/**
* Database connection
*/
private Connection conn = null;
/**
* Autocommit flag. Default value is false
*/
private boolean autocommit=false;
/**
* SQL statement
*/
private Statement statement = null;

/** /**
* DB driver. * DB driver.
*/ */
@@ -95,25 +110,25 @@ public class SQLExec extends Task {
/** /**
* SQL input file * SQL input file
*/ */
private File inputFile = null;
private File srcFile = null;


/** /**
* SQL input command * SQL input command
*/ */
private String sqlCommand = null;
private String sqlCommand = "";
/** /**
* Set the name of the sql file to be run. * Set the name of the sql file to be run.
*/ */
public void setInputfile(File inputFile) {
this.inputFile = inputFile;
public void setSrc(File srcFile) {
this.srcFile = srcFile;
} }
/** /**
* Set the name of the sql file to be run. * Set the name of the sql file to be run.
*/ */
public void setSQL(String sql) {
this.sqlCommand = sql;
public void addText(String sql) {
this.sqlCommand += sql;
} }
/** /**
@@ -144,72 +159,79 @@ public class SQLExec extends Task {
this.password = password; this.password = password;
} }
/**
* Set the autocommit flag for the DB connection.
*/
public void setAutocommit(boolean autocommit) {
this.autocommit = autocommit;
}
/** /**
* Load the sql file and then execute it * Load the sql file and then execute it
*/ */
public void execute() throws BuildException { public void execute() throws BuildException {
Connection conn = null; Connection conn = null;


if (inputFile == null && sqlCommand == null) {
throw new BuildException("Input file or sql attribute must be set!");
sqlCommand = sqlCommand.trim();

if (srcFile == null && sqlCommand.length() == 0) {
throw new BuildException("Source file or sql statement must be set!", location);
} }
if (driver == null) { if (driver == null) {
throw new BuildException("Driver attribute must be set!");
throw new BuildException("Driver attribute must be set!", location);
} }
if (userId == null) { if (userId == null) {
throw new BuildException("User Id attribute must be set!");
throw new BuildException("User Id attribute must be set!", location);
} }
if (password == null) { if (password == null) {
throw new BuildException("Password attribute must be set!");
throw new BuildException("Password attribute must be set!", location);
} }
if (url == null) { if (url == null) {
throw new BuildException("Url attribute must be set!");
throw new BuildException("Url attribute must be set!", location);
} }
if (inputFile != null && !inputFile.exists()) {
throw new BuildException("Input file does not exist!");
if (srcFile != null && !srcFile.exists()) {
throw new BuildException("Source file does not exist!", location);
} }


try{ try{
Class.forName(driver); Class.forName(driver);
}catch(ClassNotFoundException e){ }catch(ClassNotFoundException e){
throw new BuildException("JDBC driver " + driver + " could not be loaded");
throw new BuildException("JDBC driver " + driver + " could not be loaded", location);
} }


String line = "";
String sql = "";
Statement statement = null;

try{ try{
conn.setAutoCommit(autocommit);

log("connecting to " + url, Project.MSG_VERBOSE ); log("connecting to " + url, Project.MSG_VERBOSE );
conn = DriverManager.getConnection(url, userId, password); conn = DriverManager.getConnection(url, userId, password);
statement = conn.createStatement(); statement = conn.createStatement();


if (sqlCommand != null) {
execSQL(statement, sqlCommand);
if (sqlCommand.length() != 0) {
runStatements(new StringReader(sqlCommand));
} }
if (inputFile != null) {
BufferedReader in = new BufferedReader(new FileReader(inputFile));
while ((line=in.readLine()) != null){
if (line.trim().startsWith("//")) continue;
if (line.trim().startsWith("--")) continue;
sql += " " + line;
if (sql.trim().endsWith(";")){
log("SQL: " + sql, Project.MSG_VERBOSE);
execSQL(statement, sql.substring(0, sql.length()-1));
sql = "";
}
}
if (srcFile != null) {
runStatements(new FileReader(srcFile));
}

if (!autocommit) {
conn.commit();
} }
conn.commit();
} catch(IOException e){ } catch(IOException e){
throw new BuildException(e);
if (!autocommit) {
try {
conn.rollback();
} catch (SQLException ex) {}
}
throw new BuildException(e, location);
} catch(SQLException e){ } catch(SQLException e){
log("Failed to execute: " + sql, Project.MSG_ERR);
throw new BuildException(e);
if (!autocommit) {
try {
conn.rollback();
} catch (SQLException ex) {}
}
throw new BuildException(e, location);
} }
finally { finally {
try { try {
@@ -226,14 +248,51 @@ public class SQLExec extends Task {
log("SQL statements executed successfully", Project.MSG_VERBOSE); log("SQL statements executed successfully", Project.MSG_VERBOSE);
} }


private void runStatements(Reader reader) throws SQLException, IOException {
String sql = "";
String line = "";
BufferedReader in = new BufferedReader(reader);
try{
while ((line=in.readLine()) != null){
if (line.trim().startsWith("//")) continue;
if (line.trim().startsWith("--")) continue;
sql += " " + line;
if (sql.trim().endsWith(";")){
log("SQL: " + sql, Project.MSG_VERBOSE);
execSQL(sql.substring(0, sql.length()-1));
sql = "";
}
}
// Catch any statements not followed by ;
if(!sql.trim().equals("")){
execSQL(sql);
}
}catch(SQLException e){
log("Failed to execute: " + sql, Project.MSG_ERR);
throw e;
}
}

/** /**
* Exec the sql statement. * Exec the sql statement.
*/ */
private void execSQL(Statement statement, String sql) throws SQLException{
private void execSQL(String sql) throws SQLException{
if (!statement.execute(sql)) { if (!statement.execute(sql)) {
log(statement.getUpdateCount()+" row affected",
log(statement.getUpdateCount()+" rows affected",
Project.MSG_VERBOSE); Project.MSG_VERBOSE);
} }

SQLWarning warning = conn.getWarnings();
while(warning!=null){
log(warning + " sql warnging", Project.MSG_VERBOSE);
warning=warning.getNextWarning();
}
conn.clearWarnings();
} }


} }

Loading…
Cancel
Save