@@ -72,6 +72,21 @@ import java.sql.*;
*/
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.
*/
@@ -95,25 +110,25 @@ public class SQLExec extends Task {
/**
* SQL input file
*/
private File input File = null;
private File src File = null;
/**
* SQL input command
*/
private String sqlCommand = null ;
private String sqlCommand = "" ;
/**
* Set the name of the sql file to be run.
*/
public void setInputfile(File input File) {
this.inputFile = input File;
public void setSrc(File src File) {
this.srcFile = src File;
}
/**
* 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;
}
/**
* Set the autocommit flag for the DB connection.
*/
public void setAutocommit(boolean autocommit) {
this.autocommit = autocommit;
}
/**
* Load the sql file and then execute it
*/
public void execute() throws BuildException {
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) {
throw new BuildException("Driver attribute must be set!");
throw new BuildException("Driver attribute must be set!", location );
}
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) {
throw new BuildException("Password attribute must be set!");
throw new BuildException("Password attribute must be set!", location );
}
if (url == null) {
throw new BuildException("Url attribute must be set!");
throw new BuildException("Url attribute must be set!", location );
}
if (inputFile != null && !input File.exists()) {
throw new BuildException("Input file does not exist!" );
if (srcFile != null && !src File.exists()) {
throw new BuildException("Source file does not exist!", location );
}
try{
Class.forName(driver);
}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{
conn.setAutoCommit(autocommit);
log("connecting to " + url, Project.MSG_VERBOSE );
conn = DriverManager.getConnection(url, userId, password);
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){
throw new BuildException(e);
if (!autocommit) {
try {
conn.rollback();
} catch (SQLException ex) {}
}
throw new BuildException(e, location);
} 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 {
try {
@@ -226,14 +248,51 @@ public class SQLExec extends Task {
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.
*/
private void execSQL(Statement statement, String sql) throws SQLException{
private void execSQL(String sql) throws SQLException{
if (!statement.execute(sql)) {
log(statement.getUpdateCount()+" row affected",
log(statement.getUpdateCount()+" rows affected",
Project.MSG_VERBOSE);
}
SQLWarning warning = conn.getWarnings();
while(warning!=null){
log(warning + " sql warnging", Project.MSG_VERBOSE);
warning=warning.getNextWarning();
}
conn.clearWarnings();
}
}