You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2008/08/23 08:49:44 UTC

svn commit: r688266 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands: BaseCommand.java NewCommand.java RunCommand.java UndoCommand.java VersionCommand.java

Author: cbegin
Date: Fri Aug 22 23:49:43 2008
New Revision: 688266

URL: http://svn.apache.org/viewvc?rev=688266&view=rev
Log:
Implemented version command

Modified:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/NewCommand.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/RunCommand.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/UndoCommand.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/VersionCommand.java

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java?rev=688266&r1=688265&r2=688266&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/BaseCommand.java Fri Aug 22 23:49:43 2008
@@ -34,6 +34,18 @@
     this.force = force;
   }
 
+  protected void reverse(Comparable[] comparable) {
+    Arrays.sort(comparable, new Comparator() {
+      public int compare(Object o1, Object o2) {
+        return ((Comparable) o2).compareTo(o1);
+      }
+    });
+  }
+  
+  protected boolean paramsEmpty(String... params) {
+    return params == null || params.length < 1 || params[0] == null || params[0].length() < 1;
+  }
+
   protected Change parseChangeFromFilename(String filename) {
     try {
       Change change = new Change();
@@ -67,7 +79,7 @@
     }
   }
 
-  protected Change getLastChange() {
+  protected Change getLastAppliedChange() {
     List<Change> changelog = getChangelog();
     return changelog.get(changelog.size() - 1);
   }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/NewCommand.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/NewCommand.java?rev=688266&r1=688265&r2=688266&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/NewCommand.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/NewCommand.java Fri Aug 22 23:49:43 2008
@@ -25,9 +25,4 @@
     out.println("Done!");
   }
 
-  protected boolean paramsEmpty(String... params) {
-    return params == null || params.length < 1 || params[0] == null || params[0].length() < 1;
-  }
-  
-
 }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/RunCommand.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/RunCommand.java?rev=688266&r1=688265&r2=688266&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/RunCommand.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/RunCommand.java Fri Aug 22 23:49:43 2008
@@ -13,8 +13,15 @@
 
 public class RunCommand extends BaseCommand {
 
+  private boolean runOneStepOnly = false;
+
   public RunCommand(File repository, String environment, boolean force) {
+    super(repository,environment,force);
+  }
+
+  public RunCommand(File repository, String environment, boolean force, boolean runOneStepOnly) {
     super(repository, environment, force);
+    this.runOneStepOnly = runOneStepOnly;
   }
 
   public void execute(String... params) {
@@ -23,7 +30,7 @@
       Arrays.sort(filenames);
       Change lastChange = null; 
       if (changelogExists()) {
-        lastChange = getLastChange();
+        lastChange = getLastAppliedChange();
       }
       for (String filename : filenames) {
         if (filename.endsWith(".sql")) {
@@ -33,6 +40,9 @@
             ScriptRunner runner = getScriptRunner();
             runner.runScript(new MigrationReader(new FileReader(scriptFile(filename)), false));
             insertChangelog(change);
+            if (runOneStepOnly) {
+              break;
+            }
           }
         }
       }

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/UndoCommand.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/UndoCommand.java?rev=688266&r1=688265&r2=688266&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/UndoCommand.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/UndoCommand.java Fri Aug 22 23:49:43 2008
@@ -22,7 +22,7 @@
     try {
       String[] filenames = scriptPath.list();
       reverse(filenames);
-      Change lastChange = getLastChange();
+      Change lastChange = getLastAppliedChange();
       for (String filename : filenames) {
         if (filename.endsWith(".sql")) {
           Change change = parseChangeFromFilename(filename);

Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/VersionCommand.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/VersionCommand.java?rev=688266&r1=688265&r2=688266&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/VersionCommand.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/commands/VersionCommand.java Fri Aug 22 23:49:43 2008
@@ -1,13 +1,9 @@
 package org.apache.ibatis.migration.commands;
 
-import org.apache.ibatis.migration.Change;
-import org.apache.ibatis.migration.ScriptRunner;
-import org.apache.ibatis.migration.MigrationReader;
+import org.apache.ibatis.migration.*;
 
-import java.math.BigInteger;
-import java.io.FileReader;
 import java.io.File;
-import java.util.List;
+import java.math.BigDecimal;
 
 public class VersionCommand extends BaseCommand {
 
@@ -16,7 +12,61 @@
   }
 
   public void execute(String... params) {
-    out.println("not implemented");
+    ensureParamsPassed(params);
+    ensureNumericParam(params);
+    ensureVersionExists(params);
+
+    BigDecimal version = new BigDecimal(params[0]);
+
+    Change change = getLastAppliedChange();
+    if (version.compareTo(change.getId()) > 0) {
+      out.println("Upgrading to: " + version);  
+      Command run = new RunCommand(basePath,environment,force,true);
+      while (!version.equals(change.getId())) {
+        run.execute();
+        change = getLastAppliedChange();
+      }
+    } else if (version.compareTo(change.getId()) < 0) {
+      out.println("Downgrading to: " + version);
+      Command undo = new UndoCommand(basePath,environment,force);
+      while (!version.equals(change.getId())) {
+        undo.execute();
+        change = getLastAppliedChange();
+      }
+    } else {
+      out.println("Already at version: " + version);  
+    }
+  }
+
+  private void ensureParamsPassed(String... params) {
+    if (paramsEmpty(params)) {
+      throw new MigrationException("No target version specified for migration.");
+    }
+  }
+
+  private void ensureNumericParam(String... params) {
+    BigDecimal id;
+    try {
+      id = new BigDecimal(params[0]);
+    } catch (Exception e) {
+      throw new MigrationException("The version number must be a numeric integer.  " + e, e);
+    }
+  }
+
+  private void ensureVersionExists(String... params) {
+    String[] filenames = scriptPath.list();
+    reverse(filenames);
+    boolean found = false;
+    String prefix = params[0] + "_";
+    for (String filename : filenames) {
+      if (filename.startsWith(prefix)) {
+        found = true;
+        break;
+      }
+    }
+    if (!found) {
+      throw new MigrationException("A migration for the specified version number does not exist.");
+    }
   }
 
 }