Author: cbegin
Date: Mon Jun 15 05:12:23 2009
New Revision: 784653

URL: http://svn.apache.org/viewvc?rev=784653&view=rev
Log:
Cleaned up ScriptRunner code

Added:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/RuntimeSqlException.java
Modified:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/ScriptRunner.java
    ibatis/trunk/java/ibatis-3/version.properties

Added: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/RuntimeSqlException.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/RuntimeSqlException.java?rev=784653&view=auto
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/RuntimeSqlException.java
 (added)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/RuntimeSqlException.java
 Mon Jun 15 05:12:23 2009
@@ -0,0 +1,21 @@
+package org.apache.ibatis.jdbc;
+
+public class RuntimeSqlException extends RuntimeException {
+
+  public RuntimeSqlException() {
+    super();
+  }
+
+  public RuntimeSqlException(String message) {
+    super(message);
+  }
+
+  public RuntimeSqlException(String message, Throwable cause) {
+    super(message, cause);
+  }
+
+  public RuntimeSqlException(Throwable cause) {
+    super(cause);
+  }
+  
+}

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/ScriptRunner.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/ScriptRunner.java?rev=784653&r1=784652&r2=784653&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/ScriptRunner.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/ScriptRunner.java
 Mon Jun 15 05:12:23 2009
@@ -1,6 +1,9 @@
 package org.apache.ibatis.jdbc;
 
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.Reader;
 import java.sql.*;
 
 public class ScriptRunner {
@@ -11,6 +14,7 @@
 
   private boolean stopOnError;
   private boolean autoCommit;
+  private boolean sendFullScript;
 
   private PrintWriter logWriter = new PrintWriter(System.out);
   private PrintWriter errorLogWriter = new PrintWriter(System.err);
@@ -30,6 +34,10 @@
     this.autoCommit = autoCommit;
   }
 
+  public void setSendFullScript(boolean sendFullScript) {
+    this.sendFullScript = sendFullScript;
+  }
+
   public void setLogWriter(PrintWriter logWriter) {
     this.logWriter = logWriter;
   }
@@ -46,10 +54,24 @@
     this.fullLineDelimiter = fullLineDelimiter;
   }
 
-  public void runScript(Reader reader) throws IOException, SQLException {
+  public void runScript(Reader reader) {
+    setAutoCommit();
+
+    StringBuffer command = new StringBuffer();
     try {
-      runScriptWithConnection(connection, reader);
+      BufferedReader lineReader = new BufferedReader(reader);
+      String line;
+      while ((line = lineReader.readLine()) != null) {
+        command = handleLine(command, line);
+      }
+      commitConnection();
+      checkForMissingLineTerminator(command);
+    } catch (Exception e) {
+      String message = "Error executing: " + command + ".  Cause: " + e;
+      printlnError(message);
+      throw new RuntimeSqlException(message, e);
     } finally {
+      rollbackConnection();
       flush();
     }
   }
@@ -62,105 +84,113 @@
     }
   }
 
-  /**
-   * Runs an SQL script (read in using the Reader parameter) using the 
connection passed in
-   *
-   * @param conn   - the connection to use for the script
-   * @param reader - the source of the script
-   * @throws java.sql.SQLException if any SQL errors occur
-   * @throws java.io.IOException   if there is an error reading from the Reader
-   */
-  private void runScriptWithConnection(Connection conn, Reader reader)
-      throws IOException, SQLException {
-    StringBuffer command = null;
+  private void setAutoCommit() {
     try {
-      BufferedReader lineReader = new BufferedReader(reader);
-      String line;
-      while ((line = lineReader.readLine()) != null) {
-        if (command == null) {
-          command = new StringBuffer();
-        }
-        String trimmedLine = line.trim();
-        if (trimmedLine.length() < 1) {
-          // do nothing
-        } else if (trimmedLine.startsWith("//") || 
trimmedLine.startsWith("--")) {
-          println(trimmedLine);
-        } else if (!fullLineDelimiter && trimmedLine.endsWith(delimiter)
-            || fullLineDelimiter && trimmedLine.equals(delimiter)) {
-          command.append(line.substring(0, line.lastIndexOf(delimiter)));
-          command.append(" ");
-          Statement statement = conn.createStatement();
-
-          println(command);
-
-          boolean hasResults = false;
-          if (stopOnError) {
-            hasResults = statement.execute(command.toString());
-          } else {
-            try {
-              hasResults = statement.execute(command.toString());
-            } catch (SQLException e) {
-              e.fillInStackTrace();
-              printlnError("Error executing: " + command);
-              printlnError(e);
-            }
-          }
+      if (autoCommit != connection.getAutoCommit()) {
+        connection.setAutoCommit(autoCommit);
+      }
+    } catch (Throwable t) {
+      throw new RuntimeSqlException("Could not set AutoCommit to " + 
autoCommit + ". Cause: " + t, t);
+    }
+  }
 
-          if (autoCommit && !conn.getAutoCommit()) {
-            conn.commit();
-          }
+  private void commitConnection() {
+    try {
+      if (!connection.getAutoCommit()) {
+        connection.commit();
+      }
+    } catch (Throwable t) {
+      throw new RuntimeSqlException("Could not commit transaction. Cause: " + 
t, t);
+    }
+  }
 
-          if (hasResults) {
-            ResultSet rs = statement.getResultSet();
-            if (rs != null) {
-              ResultSetMetaData md = rs.getMetaData();
-              int cols = md.getColumnCount();
-              for (int i = 0; i < cols; i++) {
-                String name = md.getColumnLabel(i + 1);
-                print(name + "\t");
-              }
-              println("");
-              while (rs.next()) {
-                for (int i = 0; i < cols; i++) {
-                  String value = rs.getString(i + 1);
-                  print(value + "\t");
-                }
-                println("");
-              }
-            }
-          }
+  private void rollbackConnection() {
+    try {
+      if (!connection.getAutoCommit()) {
+        connection.rollback();
+      }
+    } catch (Throwable t) {
+      // ignore
+    }
+  }
 
-          command = null;
-          try {
-            statement.close();
-          } catch (Exception e) {
-            // Ignore to workaround a bug in Jakarta DBCP
+  private void checkForMissingLineTerminator(StringBuffer command) {
+    if (command != null && command.toString().trim().length() > 0) {
+      throw new RuntimeSqlException("Line missing end-of-line terminator (" + 
delimiter + ") => " + command);
+    }
+  }
+
+  private StringBuffer handleLine(StringBuffer command, String line) throws 
SQLException {
+    String trimmedLine = line.trim();
+    if (lineIsComment(trimmedLine)) {
+      println(trimmedLine);
+    } else if (commandReadyToExecute(trimmedLine)) {
+      command.append(line.substring(0, line.lastIndexOf(delimiter)));
+      command.append(" ");
+      println(command);
+      executeStatement(command.toString());
+      command.setLength(0);
+    } else if (trimmedLine.length() > 0) {
+      command.append(line);
+      command.append(" ");
+    }
+    return command;
+  }
+
+  private boolean lineIsComment(String trimmedLine) {
+    return trimmedLine.startsWith("//") || trimmedLine.startsWith("--");
+  }
+
+  private boolean commandReadyToExecute(String trimmedLine) {
+    return !fullLineDelimiter && trimmedLine.endsWith(delimiter)
+        || fullLineDelimiter && trimmedLine.equals(delimiter);
+  }
+
+  private void executeStatement(String command) throws SQLException {
+    boolean hasResults = false;
+    Statement statement = connection.createStatement();
+    if (stopOnError) {
+      hasResults = statement.execute(command);
+    } else {
+      try {
+        hasResults = statement.execute(command);
+      } catch (SQLException e) {
+        String message = "Error executing: " + command + ".  Cause: " + e;
+        printlnError(message);
+      }
+    }
+    printResults(statement, hasResults);
+    try {
+      statement.close();
+    } catch (Exception e) {
+      // Ignore to workaround a bug in some connection pools
+    }
+    commitConnection();
+  }
+
+  private void printResults(Statement statement, boolean hasResults) {
+    try {
+      if (hasResults) {
+        ResultSet rs = statement.getResultSet();
+        if (rs != null) {
+          ResultSetMetaData md = rs.getMetaData();
+          int cols = md.getColumnCount();
+          for (int i = 0; i < cols; i++) {
+            String name = md.getColumnLabel(i + 1);
+            print(name + "\t");
+          }
+          println("");
+          while (rs.next()) {
+            for (int i = 0; i < cols; i++) {
+              String value = rs.getString(i + 1);
+              print(value + "\t");
+            }
+            println("");
           }
-          Thread.yield();
-        } else {
-          command.append(line);
-          command.append(" ");
         }
       }
-      if (!autoCommit && !conn.getAutoCommit()) {
-        conn.commit();
-      }
-      if (command != null && command.toString().trim().length() > 0) {
-        throw new IOException("Line missing end-of-line terminator 
("+delimiter+") => " + command);
-      }
     } catch (SQLException e) {
-      e.fillInStackTrace();
-      printlnError("Error executing: " + command);
-      printlnError(e);
-      throw e;
-    } catch (IOException e) {
-      e.fillInStackTrace();
-      printlnError("Error executing: " + command);
-      printlnError(e);
-      throw e;
-    } finally {
-      conn.rollback();
-      flush();
+      printlnError("Error printing results: " + e.getMessage()); 
     }
   }
 

Modified: ibatis/trunk/java/ibatis-3/version.properties
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/version.properties?rev=784653&r1=784652&r2=784653&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/version.properties (original)
+++ ibatis/trunk/java/ibatis-3/version.properties Mon Jun 15 05:12:23 2009
@@ -1,5 +1,5 @@
 #Build version info
-#Tue Jun 09 23:51:33 MDT 2009
+#Wed Jun 10 13:21:15 MDT 2009
 version=3.0.0
-buildDate=2009/06/09 23\:51
-buildNum=177
+buildDate=2009/06/10 13\:21
+buildNum=179


Reply via email to