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/22 07:06:30 UTC
svn commit: r687946 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main:
java/org/apache/ibatis/migration/ scripts/ scripts/drivers/
Author: cbegin
Date: Thu Aug 21 22:06:29 2008
New Revision: 687946
URL: http://svn.apache.org/viewvc?rev=687946&view=rev
Log:
Introduced migration utilities.
Added:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/CommandLine.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationException.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationReader.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/Migrator.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_changelog.sql
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_environment.properties
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_migration.sql
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/drivers/
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/migrate (with props)
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/migrate.cmd
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/ScriptRunner.java
Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/CommandLine.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/CommandLine.java?rev=687946&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/CommandLine.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/CommandLine.java Thu Aug 21 22:06:29 2008
@@ -0,0 +1,175 @@
+package org.apache.ibatis.migration;
+
+import java.util.Arrays;
+import java.util.Set;
+import java.util.Collections;
+import java.util.HashSet;
+import java.io.File;
+import java.io.PrintStream;
+import java.math.BigInteger;
+
+public class CommandLine {
+
+ private static final String PATH_PREFIX = "--path=";
+ private static final String ENV_PREFIX = "--env=";
+ private static final String FORCE = "--force";
+ private static final String INIT = "init";
+ private static final String NEW = "new";
+ private static final String RUN = "run";
+ private static final String VERSION = "version";
+ private static final String UNDO = "undo";
+ private static final Set<String> KNOWN_COMMANDS = Collections.unmodifiableSet(
+ new HashSet<String>(Arrays.asList(INIT, NEW, RUN, VERSION, UNDO)));
+
+ private String repository;
+ private String environment;
+ private String command;
+ private String params;
+ private String parseError;
+ private boolean help;
+ private boolean force;
+
+ public CommandLine(String[] args) {
+ parse(args);
+ validate();
+ }
+
+ public String getRepository() {
+ return repository;
+ }
+
+ public String getEnvironment() {
+ return environment;
+ }
+
+ public String getCommand() {
+ return command;
+ }
+
+ public String getParams() {
+ return params;
+ }
+
+ public boolean isHelp() {
+ return help;
+ }
+
+ public boolean isValid() {
+ return parseError == null;
+ }
+
+ public String toString() {
+ return repository + " " + environment + " " + command + " " + (params == null ? "" : params);
+ }
+
+ public void execute() {
+ if (isHelp()) {
+ printUsage();
+ } else if (!isValid()) {
+ printError();
+ printUsage();
+ } else {
+ try {
+ runCommand();
+ } catch (MigrationException e) {
+ System.err.println(e.getMessage());
+ printUsage();
+ }
+ }
+ }
+
+ private void runCommand() {
+ Migrator migrator = new Migrator(repository, environment, force);
+ if (INIT.equals(command)) {
+ migrator.initialize();
+ } else if (NEW.equals(command)) {
+ migrator.newMigration(params);
+ } else if (RUN.equals(command)) {
+ migrator.runPendingMigrations();
+ } else if (VERSION.equals(command)) {
+ BigInteger version = null;
+ try {
+ version = new BigInteger(params);
+ } catch(Exception e) {
+ System.err.println("Invalid version number specified: " + params);
+ printUsage();
+ }
+ migrator.migrateToVersion(version);
+ } else if (UNDO.equals(command)) {
+ migrator.undoLastMigration();
+ } else {
+ throw new RuntimeException("Attempt to execute unkown command.");
+ }
+ }
+
+ public void printError() {
+ PrintStream out = System.err;
+ out.println(parseError);
+ out.flush();
+ }
+
+ public void printUsage() {
+ PrintStream out = System.out;
+ out.println();
+ out.println("Usage: migrate command [parameter] [--path=<directory>] [--env=<environment>]");
+ out.println();
+ out.println("--path=<directory> Path to repository. Default current working directory.");
+ out.println("--env=<environment> Environment to configure. Default environment is 'development'.");
+ out.println("--env=<environment> Environment to configure. Default environment is 'development'.");
+ out.println("--force Forces script to continue even if SQL errors are encountered.");
+ out.println("--help Displays this usage message.");
+ out.println();
+ out.println("Commands:");
+ out.println(" init Creates (if necessary) and initializes a migration path.");
+ out.println(" new <description> Creates a new migration with the provided description.");
+ out.println(" run Run all unapplied migrations.");
+ out.println(" version <version> Migrates the database up or down to the specified version.");
+ out.println(" undo Undoes the last migration applied to the database.");
+ out.println();
+ out.flush();
+ }
+
+ private void parse(String[] args) {
+ for (String arg : args) {
+ if (arg.startsWith(PATH_PREFIX) && arg.length() > PATH_PREFIX.length()) {
+ repository = arg.split("=")[1];
+ } else if (arg.startsWith(ENV_PREFIX) && arg.length() > ENV_PREFIX.length()) {
+ environment = arg.split("=")[1];
+ } else if (arg.startsWith("--force")) {
+ force = true;
+ } else if (arg.startsWith("--help")) {
+ help = true;
+ } else if (command == null) {
+ command = arg;
+ } else if (params == null){
+ params = arg;
+ } else {
+ params += " ";
+ params += arg;
+ }
+ }
+ }
+
+ private void validate() {
+ if (repository == null) {
+ repository = "./";
+ }
+ if (environment == null) {
+ environment = "development";
+ }
+ File f = new File(repository);
+ if (f.exists() && !f.isDirectory()) {
+ parseError = ("Migrations path must be a directory: " + f.getAbsolutePath());
+ } else {
+ repository = f.getAbsolutePath();
+ if (command == null) {
+ parseError = "No command specified.";
+ } else {
+ if (!KNOWN_COMMANDS.contains(command)) {
+ parseError = "Unknown command: " + command;
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file
Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationException.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationException.java?rev=687946&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationException.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationException.java Thu Aug 21 22:06:29 2008
@@ -0,0 +1,20 @@
+package org.apache.ibatis.migration;
+
+public class MigrationException extends RuntimeException {
+
+ public MigrationException() {
+ super();
+ }
+
+ public MigrationException(String message) {
+ super(message);
+ }
+
+ public MigrationException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public MigrationException(Throwable cause) {
+ super(cause);
+ }
+}
Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationReader.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationReader.java?rev=687946&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationReader.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/MigrationReader.java Thu Aug 21 22:06:29 2008
@@ -0,0 +1,46 @@
+package org.apache.ibatis.migration;
+
+import java.io.Reader;
+import java.io.IOException;
+import java.io.BufferedReader;
+import java.io.StringReader;
+
+public class MigrationReader extends Reader {
+
+ private Reader target;
+
+ public MigrationReader(Reader source, boolean undo) throws IOException {
+ try {
+ BufferedReader reader = new BufferedReader(source);
+ StringBuilder doBuilder = new StringBuilder();
+ StringBuilder undoBuilder = new StringBuilder();
+ StringBuilder currentBuilder = doBuilder;
+ String line;
+ while ((line = reader.readLine()) != null) {
+ if (line != null) {
+ if (line.trim().startsWith("--//@UNDO")) {
+ currentBuilder = undoBuilder;
+ }
+ currentBuilder.append(line);
+ currentBuilder.append("\n");
+ }
+ }
+ if (undo) {
+ target = new StringReader(undoBuilder.toString());
+ } else {
+ target = new StringReader(doBuilder.toString());
+ }
+ } finally {
+ source.close();
+ }
+ }
+
+ public int read(char[] cbuf, int off, int len) throws IOException {
+ return target.read(cbuf, off, len);
+ }
+
+ public void close() throws IOException {
+ target.close();
+ }
+
+}
Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/Migrator.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/Migrator.java?rev=687946&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/Migrator.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/Migrator.java Thu Aug 21 22:06:29 2008
@@ -0,0 +1,217 @@
+package org.apache.ibatis.migration;
+
+import org.apache.ibatis.io.Resources;
+
+import java.math.BigInteger;
+import java.io.*;
+import java.text.SimpleDateFormat;
+import java.sql.Date;
+import java.util.*;
+
+public class Migrator {
+
+ private File repository;
+ private String environment;
+ private boolean force;
+
+ public Migrator(String repository, String environment, boolean force) {
+ this.repository = new File(repository);
+ this.environment = environment;
+ this.force = force;
+ }
+
+ public static void main(String[] args) throws Exception {
+ new CommandLine(args).execute();
+ }
+
+ public void initialize() {
+ createIfNecessary(repository);
+ ensureEmpty(repository);
+ System.out.println("Initializing: " + repository);
+ copyResourceTo("org/apache/ibatis/migration/template_environment.properties", environmentFile(environment));
+ copyResourceTo("org/apache/ibatis/migration/template_changelog.sql", repositoryFile(getTimestamp() + "_create_changelog.sql"));
+ copyResourceTo("org/apache/ibatis/migration/template_migration.sql", repositoryFile(getTimestamp() + "_first_migration.sql"));
+ System.out.println("Done!");
+ }
+
+ public void newMigration(String description) {
+ if (description == null) {
+ throw new MigrationException("No description specified for new migration.");
+ }
+ Map<String,String> variables = new HashMap<String,String>();
+ variables.put("description",description);
+ ensureEnvironment(environment);
+ String filename = getTimestamp() + "_" + description.replace(' ', '_') + ".sql";
+ copyResourceTo("org/apache/ibatis/migration/template_migration.sql", repositoryFile(filename), variables);
+ System.out.println("Done!");
+ }
+
+ public void runPendingMigrations() {
+ try {
+ String[] filenames = repository.list();
+ Arrays.sort(filenames);
+ for(String filename : filenames) {
+ if (filename.endsWith(".sql")) {
+ System.out.println(horizontalLine("Applying: " + filename,80));
+ ScriptRunner runner = getScriptRunner();
+ runner.runScript(new MigrationReader(new FileReader(repositoryFile(filename)),false));
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("<Description>. Cause: " + e, e);
+ }
+ }
+
+ public void migrateToVersion(BigInteger version) {
+ System.out.println("Migrating to: " + version);
+ }
+
+ public void undoLastMigration() {
+ try {
+ String[] filenames = repository.list();
+ Arrays.sort(filenames,new Comparator(){
+ public int compare(Object o1, Object o2) {
+ return ((Comparable)o2).compareTo(o1);
+ }
+ });
+ for(String filename : filenames) {
+ if (filename.endsWith(".sql")) {
+ System.out.println(horizontalLine("Undoing: " + filename,80));
+ ScriptRunner runner = getScriptRunner();
+ runner.runScript(new MigrationReader(new FileReader(repositoryFile(filename)),true));
+ }
+ }
+ } catch (Exception e) {
+ throw new RuntimeException("<Description>. Cause: " + e, e);
+ }
+ }
+
+ private String horizontalLine(String caption, int length) {
+ StringBuilder builder = new StringBuilder();
+ builder.append("========== ");
+ builder.append(caption);
+ builder.append(" ");
+ for (int i=0; i < length - caption.length() - 2; i++) {
+ builder.append("=");
+ }
+ return builder.toString();
+ }
+
+ private String getTimestamp() {
+ try {
+ // Ensure that two subsequent calls are less likely to return the same value.
+ Thread.sleep(1000);
+ } catch (InterruptedException e) {
+ //ignore
+ }
+ return new SimpleDateFormat("yyyyMMddHHmmss").format(new Date(System.currentTimeMillis()));
+ }
+
+ private File repositoryFile(String fileName) {
+ return new File(repository.getAbsolutePath()+File.separator+fileName);
+ }
+
+ private void copyResourceTo(String resource, File toFile) {
+ copyResourceTo(resource,toFile,null);
+ }
+
+ private void copyResourceTo(String resource, File toFile, Map<String,String> variables) {
+ System.out.println("Creating: " + toFile.getName());
+ try {
+ LineNumberReader reader = new LineNumberReader(Resources.getResourceAsReader(this.getClass().getClassLoader(), resource));
+ try {
+ PrintWriter writer = new PrintWriter(new FileWriter(toFile));
+ try {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ line = parsePlaceholders(line,variables);
+ writer.println(line);
+ }
+ } finally {
+ writer.close();
+ }
+ } finally {
+ reader.close();
+ }
+ } catch (IOException e) {
+ throw new MigrationException("Error copying " + resource + " to " + toFile.getAbsolutePath() + ". Cause: " + e, e);
+ }
+ }
+
+ private void ensureEmpty(File path) {
+ String[] list = path.list();
+ if (list.length != 0) {
+ for (String entry : list) {
+ if (!entry.startsWith(".")) {
+ throw new MigrationException("Directory must be empty (.svn etc allowed): " + path.getAbsolutePath());
+ }
+ }
+ }
+ }
+
+ private void ensureEnvironment(String environment) {
+ File envFile = environmentFile(environment);
+ if (!envFile.exists()) {
+ throw new MigrationException("Environment file missing: " + envFile.getAbsolutePath());
+ }
+ }
+
+ private File environmentFile(String environment) {
+ return repositoryFile(environment+".properties");
+ }
+
+ private void createIfNecessary(File path) {
+ if (!path.exists()) {
+ File parent = new File(path.getParent());
+ createIfNecessary(parent);
+ if (!path.mkdir()) {
+ throw new MigrationException("Could not create directory path for an unknown reason. Make sure you have access to the directory.");
+ }
+ }
+ }
+
+ private String parsePlaceholders(String string, Map<String,String> variables) {
+ final String OPEN = "${";
+ final String CLOSE = "}";
+ String newString = string;
+ if (newString != null && variables != null) {
+ int start = newString.indexOf(OPEN);
+ int end = newString.indexOf(CLOSE);
+
+ while (start > -1 && end > start) {
+ String prepend = newString.substring(0, start);
+ String append = newString.substring(end + CLOSE.length());
+ String propName = newString.substring(start + OPEN.length(), end);
+ String propValue = variables.get(propName);
+ if (propValue == null) {
+ newString = prepend + append;
+ } else {
+ newString = prepend + propValue + append;
+ }
+ start = newString.indexOf(OPEN);
+ end = newString.indexOf(CLOSE);
+ }
+ }
+ return newString;
+ }
+
+ private ScriptRunner getScriptRunner() {
+ try {
+ Properties props = new Properties();
+ String filename = repository + File.separator + environment + ".properties";
+ File file = new File(filename);
+ if (!file.exists()) {
+ throw new MigrationException("Could not find environment properties file: " + filename);
+ }
+ props.load(new FileInputStream(file));
+ String driver = props.getProperty("driver");
+ String url = props.getProperty("url");
+ String username = props.getProperty("username");
+ String password = props.getProperty("password");
+ return new ScriptRunner(driver,url,username,password,false,!force);
+ } catch (Exception e) {
+ throw new MigrationException("Error creating ScriptRunner. Cause: " + e, e);
+ }
+ }
+
+}
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/ScriptRunner.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/ScriptRunner.java?rev=687946&r1=687945&r2=687946&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/ScriptRunner.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/ScriptRunner.java Thu Aug 21 22:06:29 2008
@@ -69,7 +69,11 @@
try {
configureAutoCommitAndRun(reader);
} finally {
- connection.close();
+ try {
+ connection.close();
+ } finally {
+ connection = null;
+ }
}
} else if (connection != null) {
configureAutoCommitAndRun(reader);
@@ -93,6 +97,8 @@
throw e;
} catch (Exception e) {
throw new RuntimeException("Error running script. Cause: " + e, e);
+ } finally {
+ flush();
}
}
@@ -120,19 +126,17 @@
throws IOException, SQLException {
StringBuffer command = null;
try {
- LineNumberReader lineReader = new LineNumberReader(reader);
+ BufferedReader lineReader = new BufferedReader(reader);
String line;
while ((line = lineReader.readLine()) != null) {
if (command == null) {
command = new StringBuffer();
}
String trimmedLine = line.trim();
- if (trimmedLine.startsWith("--")) {
+ if (trimmedLine.length() < 1) {
+ // do nothing
+ } else if (trimmedLine.startsWith("//") || trimmedLine.startsWith("--")) {
println(trimmedLine);
- } else if (trimmedLine.length() < 1 || trimmedLine.startsWith("//")) {
- //Do nothing
- } else if (trimmedLine.length() < 1 || trimmedLine.startsWith("--")) {
- //Do nothing
} else if (!fullLineDelimiter && trimmedLine.endsWith(getDelimiter())
|| fullLineDelimiter && trimmedLine.equals(getDelimiter())) {
command.append(line.substring(0, line.lastIndexOf(getDelimiter())));
@@ -158,21 +162,23 @@
conn.commit();
}
- ResultSet rs = statement.getResultSet();
- if (hasResults && 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()) {
+ 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 value = rs.getString(i + 1);
- print(value + "\t");
+ 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("");
+ }
}
}
@@ -213,7 +219,7 @@
private void print(Object o) {
if (logWriter != null) {
- System.out.print(o);
+ logWriter.print(o);
}
}
Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_changelog.sql
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_changelog.sql?rev=687946&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_changelog.sql (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_changelog.sql Thu Aug 21 22:06:29 2008
@@ -0,0 +1,23 @@
+--// Create Changelog
+
+-- Default DDL for changelog table that will keep
+-- a record of the migrations that have been run.
+
+-- You can modify this to suit your database before
+-- running your first migration.
+
+-- Be sure that ID and DESCRIPTION fields exist in
+-- BigInteger and String compatible fields respectively.
+
+CREATE TABLE CHANGELOG (
+ ID NUMERIC(20,0) NOT NULL,
+ DESCRIPTION VARCHAR(255) NOT NULL
+);
+
+ALTER TABLE CHANGELOG
+ ADD CONSTRAINT PK_CHANGELOG
+ PRIMARY KEY (id);
+
+--//@UNDO
+
+DROP TABLE CHANGELOG;
\ No newline at end of file
Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_environment.properties
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_environment.properties?rev=687946&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_environment.properties (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_environment.properties Thu Aug 21 22:06:29 2008
@@ -0,0 +1,15 @@
+## JDBC connection properties.
+driver=
+url=
+username=
+password=
+
+## The table containing the changelog. Defaults to 'changelog'
+#changelog.table=
+
+## The schema the changelog can be found in. Default is null.
+#changelog.schema=
+
+## The catalog the changelog can be found in. Default is null.
+#changelog.catalog=
+
Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_migration.sql
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_migration.sql?rev=687946&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_migration.sql (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/migration/template_migration.sql Thu Aug 21 22:06:29 2008
@@ -0,0 +1,9 @@
+--// ${description}
+-- Migration SQL that makes the change goes here.
+
+
+
+--//@UNDO
+-- SQL to undo the change goes here.
+
+
Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/migrate
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/migrate?rev=687946&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/migrate (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/migrate Thu Aug 21 22:06:29 2008
@@ -0,0 +1,9 @@
+#!/bin/sh
+
+IBATIS_LIB=/home/clinton/Development/ibatis-3/ibatis-3-core/target/classes
+CURDIR=$(dirname $0)
+JARS=$CURDIR/drivers/
+MYCP=$(ls $JARS/ | sed "s#^#$JARS&#" | sed "s/$/:/" | xargs echo | sed 's/: */:/')
+MYCP="$MYCP:$IBATIS_LIB"
+
+java -cp $MYCP org.apache.ibatis.migration.Migrator $*
Propchange: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/migrate
------------------------------------------------------------------------------
svn:executable = *
Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/migrate.cmd
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/migrate.cmd?rev=687946&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/migrate.cmd (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/scripts/migrate.cmd Thu Aug 21 22:06:29 2008
@@ -0,0 +1,5 @@
+@ECHO off
+
+set IBATIS_LIB=/home/clinton/Development/ibatis-3/ibatis-3-core/target/classes
+
+java -cp %IBATIS_LIB% org.apache.ibatis.migration.Migrator %*