提交 d1c791cd authored 作者: Thomas Mueller's avatar Thomas Mueller

The database upgrade (to upgrade from H2 version 1.1.x) has been simplified. The…

The database upgrade (to upgrade from H2 version 1.1.x) has been simplified. The setting NO_UPGRADE is no longer supported, instead use the database URL jdbc:h2v1_1:
上级 c9bc84d0
......@@ -1446,14 +1446,14 @@ renamed from
by default. Also, the temporary script will be written to the database directory instead of a temporary directory.
Both defaults can be customized via
<ul>
<li><code>org.h2.upgrade.DbUpgradeNonPageStoreToCurrent.setDeleteOldDb(boolean)</code>
</li><li><code>org.h2.upgrade.DbUpgradeNonPageStoreToCurrent.setScriptInTmpDir(boolean)</code>
<li><code>org.h2.upgrade.DbUpgrade.setDeleteOldDb(boolean)</code>
</li><li><code>org.h2.upgrade.DbUpgrade.setScriptInTmpDir(boolean)</code>
</li></ul>
prior opening a database connection.
</p>
<p>
Since version 1.2.140 it is possible to let the old h2 classes (v 1.2.128) connect to the database. The automatic upgrade .jar file must be present, and the url
must contain NO_UPGRADE=TRUE.
Since version 1.2.140 it is possible to let the old h2 classes (v 1.2.128) connect to the database.
The automatic upgrade .jar file must be present, and the URL must start with <code>jdbc:h2v1_1:</code>.
</p>
<h2 id="limits_limitations">Limits and Limitations</h2>
......
......@@ -18,7 +18,10 @@ Change Log
<h1>Change Log</h1>
<h2>Next Version (unreleased)</h2>
<ul><li>When starting the H2 Console, the properties file can now be completely disabled.
<ul><li>The database upgrade (to upgrade from H2 version 1.1.x) has been simplified.
The setting NO_UPGRADE is no longer supported, instead use the database URL jdbc:h2v1_1:
</li><li>The feature to log all errors (system properties h2.logAllErrors and h2.logAllErrorsFile) has been removed.
</li><li>When starting the H2 Console, the properties file can now be completely disabled.
</li><li>Server.openBrowser no longer writes to System.out directly if opening the URL failed.
</li><li>The INSERT optimizations (INSERT ... DIRECT SORTED SELECT) were not parsed correctly when using a column list.
</li><li>H2 Console: the tables and columns are now listed for SQLite as well.
......
......@@ -180,7 +180,7 @@ public class ConnectionInfo implements Cloneable {
*
* @return true if it is
*/
boolean isPersistent() {
public boolean isPersistent() {
return persistent;
}
......
......@@ -10,14 +10,16 @@ import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Collections;
import java.util.Hashtable;
import java.util.Map;
import java.sql.Statement;
import java.util.Properties;
import java.util.UUID;
import org.h2.engine.ConnectionInfo;
import org.h2.engine.Database;
import org.h2.jdbc.JdbcConnection;
import org.h2.message.DbException;
import org.h2.store.fs.FileSystem;
import org.h2.store.fs.FileSystemDisk;
import org.h2.util.StringUtils;
import org.h2.upgrade.v1_1.util.StringUtils;
import org.h2.util.IOUtils;
import org.h2.util.Utils;
/**
......@@ -27,11 +29,11 @@ import org.h2.util.Utils;
public class DbUpgrade {
private static boolean upgradeClassesPresent;
private static Map<String, DbUpgradeFromVersion1> runningConversions;
private static boolean scriptInTempDir;
private static boolean deleteOldDb;
static {
upgradeClassesPresent = Utils.isClassPresent("org.h2.upgrade.v1_1.Driver");
runningConversions = Collections.synchronizedMap(new Hashtable<String, DbUpgradeFromVersion1>(1));
}
/**
......@@ -44,82 +46,127 @@ public class DbUpgrade {
* @param info the properties
* @return the connection if NO_UPGRADE is set
*/
public static synchronized Connection connectOrUpgrade(String url, Properties info) throws SQLException {
public static Connection connectOrUpgrade(String url, Properties info) throws SQLException {
if (!upgradeClassesPresent) {
return null;
}
if (StringUtils.toUpperEnglish(url).indexOf(";NO_UPGRADE=TRUE") >= 0) {
url = StringUtils.replaceAllIgnoreCase(url, ";NO_UPGRADE=TRUE", "");
return connectWithOldVersion(url, info);
Properties i2 = new Properties();
i2.putAll(info);
// clone so that the password (if set as a char array) is not cleared
Object o = info.get("password");
if (o != null && o instanceof char[]) {
i2.put("password", StringUtils.cloneCharArray((char[]) o));
}
info = i2;
ConnectionInfo ci = new ConnectionInfo(url, info);
if (ci.isRemote() || !ci.isPersistent()) {
return null;
}
String name = ci.getName();
if (Database.exists(name)) {
return null;
}
if (!IOUtils.exists(name + ".data.db")) {
return null;
}
synchronized (DbUpgrade.class) {
upgrade(ci, info);
return null;
}
upgrade(url, info);
return null;
}
/**
* Connects to an old (version 1.1) database.
* The conversion script file will per default be created in the db
* directory. Use this method to change the directory to the temp
* directory.
*
* @param url The connection string
* @param info The connection properties
* @return the connection via the upgrade classes
* @throws SQLException
* @param scriptInTempDir true if the conversion script should be
* located in the temp directory.
*/
private static Connection connectWithOldVersion(String url, Properties info) throws SQLException {
try {
String oldStartUrlPrefix = (String) Utils.getStaticField("org.h2.upgrade.v1_1.engine.Constants.START_URL");
url = StringUtils.replaceAll(url, org.h2.engine.Constants.START_URL, oldStartUrlPrefix);
url = StringUtils.replaceAllIgnoreCase(url, ";IGNORE_UNKNOWN_SETTINGS=TRUE", "");
url = StringUtils.replaceAllIgnoreCase(url, ";IGNORE_UNKNOWN_SETTINGS=FALSE", "");
url = StringUtils.replaceAllIgnoreCase(url, ";PAGE_STORE=TRUE", "");
url += ";IGNORE_UNKNOWN_SETTINGS=TRUE";
Object ci = Utils.newInstance("org.h2.upgrade.v1_1.engine.ConnectionInfo", url, info);
boolean isRemote = (Boolean) Utils.callMethod(ci, "isRemote");
boolean isPersistent = (Boolean) Utils.callMethod(ci, "isPersistent");
String dbName = (String) Utils.callMethod(ci, "getName");
// remove stackable file systems
int colon = dbName.indexOf(':');
while (colon != -1) {
String fileSystemPrefix = dbName.substring(0, colon+1);
FileSystem fs = FileSystem.getInstance(fileSystemPrefix);
if (fs == null || fs instanceof FileSystemDisk) {
break;
}
dbName = dbName.substring(colon+1);
colon = dbName.indexOf(':');
}
File oldDataFile = new File(dbName + ".data.db");
if (!isRemote && isPersistent && oldDataFile.exists()) {
Utils.callStaticMethod("org.h2.upgrade.v1_1.Driver.load");
Connection connection = DriverManager.getConnection(url, info);
return connection;
} else {
return null;
}
} catch (Exception e) {
throw DbException.toSQLException(e);
}
public static void setScriptInTempDir(boolean scriptInTempDir) {
DbUpgrade.scriptInTempDir = scriptInTempDir;
}
/**
* Starts the conversion if the respective classes are found. Is automatically
* called on connect.
* Old files will be renamed to .backup after a successful conversion. To
* delete them after the conversion, use this method with the parameter
* 'true'.
*
* @param url The connection string
* @param info The connection properties
* @throws SQLException
* @param deleteOldDb if true, the old db files will be deleted.
*/
private static synchronized void upgrade(String url, Properties info) throws SQLException {
if (runningConversions.containsKey(url)) {
// do not migrate, because we are currently migrating, and this is
// the connection where "runscript from" will be executed
return;
}
public static void setDeleteOldDb(boolean deleteOldDb) {
DbUpgrade.deleteOldDb = deleteOldDb;
}
private static void upgrade(ConnectionInfo ci, Properties info) throws SQLException {
String name = ci.getName();
String data = name + ".data.db";
String index = name + ".index.db";
String lobs = name + ".lobs.db";
String backupData = data + ".backup";
String backupIndex = index + ".backup";
String backupLobs = lobs + ".backup";
String script = null;
try {
DbUpgradeFromVersion1 instance = new DbUpgradeFromVersion1(url, info);
runningConversions.put(url, instance);
instance.upgrade();
if (scriptInTempDir) {
script = File.createTempFile("h2dbmigration", "backup.sql").getAbsolutePath();
} else {
script = name + ".script.sql";
}
String oldUrl = "jdbc:h2v1_1:" + name + ";UNDO_LOG=0;LOG=0;LOCK_MODE=0";
String cipher = ci.getProperty("CIPHER", null);
if (cipher != null) {
oldUrl += ";CIPHER=" + cipher;
}
Connection conn = DriverManager.getConnection(oldUrl, info);
Statement stat = conn.createStatement();
String uuid = UUID.randomUUID().toString();
if (cipher != null) {
stat.execute("script to '" + script + "' cipher aes password '" + uuid + "' --hide--");
} else {
stat.execute("script to '" + script + "'");
}
conn.close();
IOUtils.rename(data, backupData);
IOUtils.rename(index, backupIndex);
if (IOUtils.exists(lobs)) {
IOUtils.rename(lobs, backupLobs);
}
ci.removeProperty("IFEXISTS", false);
conn = new JdbcConnection(ci, true);
stat = conn.createStatement();
if (cipher != null) {
stat.execute("runscript from '" + script + "' cipher aes password '" + uuid + "' --hide--");
} else {
stat.execute("runscript from '" + script + "'");
}
stat.execute("analyze");
stat.execute("shutdown compact");
stat.close();
conn.close();
if (deleteOldDb) {
IOUtils.delete(backupData);
IOUtils.delete(backupIndex);
IOUtils.delete(backupData);
FileSystem.getInstance(name).deleteRecursive(backupLobs, false);
}
} catch (Exception e) {
if (IOUtils.exists(backupData)) {
IOUtils.rename(backupData, data);
}
if (IOUtils.exists(backupData)) {
IOUtils.rename(backupData, data);
}
if (IOUtils.exists(backupData)) {
IOUtils.rename(backupData, data);
}
IOUtils.delete(name + ".h2.db");
throw DbException.toSQLException(e);
} finally {
runningConversions.remove(url);
if (script != null) {
IOUtils.delete(script);
}
}
}
......
/*
* Copyright 2004-2010 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.upgrade;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import java.util.UUID;
import org.h2.message.DbException;
import org.h2.store.fs.FileSystem;
import org.h2.store.fs.FileSystemDisk;
import org.h2.util.StringUtils;
import org.h2.util.Utils;
/**
* Class to convert a 1.1 database (non page store) to the 1.2 (page store)
* format. Conversion is done via "script to" and "runscript from".
*/
public class DbUpgradeFromVersion1 {
private static boolean scriptInTempDir;
private static boolean deleteOldDb;
private String url;
private Properties info;
private boolean mustBeConverted;
private String newName;
private String newUrl;
private String oldUrl;
private File oldDataFile;
private File oldIndexFile;
private File oldLobsDir;
private File newFile;
private File backupDataFile;
private File backupIndexFile;
private File backupLobsDir;
private boolean successful;
/**
* Converts a database from a 1.1 DB (non page store) to a 1.2 DB
* (page store) format.
*
* @param url The connection string
* @param info The connection properties
* @throws SQLException if an exception occurred
*/
public DbUpgradeFromVersion1(String url, Properties info) throws SQLException {
this.url = url;
this.info = info;
init();
}
private void init() throws SQLException {
try {
newUrl = url;
newUrl = StringUtils.replaceAllIgnoreCase(newUrl, ";UNDO_LOG=1", "");
newUrl = StringUtils.replaceAllIgnoreCase(newUrl, ";UNDO_LOG=0", "");
newUrl = StringUtils.replaceAllIgnoreCase(newUrl, ";LOG=0", "");
newUrl = StringUtils.replaceAllIgnoreCase(newUrl, ";LOG=1", "");
newUrl = StringUtils.replaceAllIgnoreCase(newUrl, ";LOG=2", "");
newUrl = StringUtils.replaceAllIgnoreCase(newUrl, ";LOCK_MODE=0", "");
newUrl = StringUtils.replaceAllIgnoreCase(newUrl, ";LOCK_MODE=1", "");
newUrl = StringUtils.replaceAllIgnoreCase(newUrl, ";LOCK_MODE=2", "");
newUrl = StringUtils.replaceAllIgnoreCase(newUrl, ";LOCK_MODE=3", "");
newUrl = StringUtils.replaceAllIgnoreCase(newUrl, ";IFEXISTS=TRUE", "");
newUrl += ";UNDO_LOG=0;LOG=0;LOCK_MODE=0";
String oldStartUrlPrefix = (String) Utils.getStaticField("org.h2.upgrade.v1_1.engine.Constants.START_URL");
oldUrl = url;
oldUrl = StringUtils.replaceAll(oldUrl, org.h2.engine.Constants.START_URL, oldStartUrlPrefix);
oldUrl = StringUtils.replaceAllIgnoreCase(oldUrl, ";IGNORE_UNKNOWN_SETTINGS=TRUE", "");
oldUrl = StringUtils.replaceAllIgnoreCase(oldUrl, ";IGNORE_UNKNOWN_SETTINGS=FALSE", "");
oldUrl = StringUtils.replaceAllIgnoreCase(oldUrl, ";PAGE_STORE=TRUE", "");
oldUrl += ";IGNORE_UNKNOWN_SETTINGS=TRUE";
Object ci = Utils.newInstance("org.h2.upgrade.v1_1.engine.ConnectionInfo", oldUrl, info);
boolean isRemote = (Boolean) Utils.callMethod(ci, "isRemote");
boolean isPersistent = (Boolean) Utils.callMethod(ci, "isPersistent");
String dbName = (String) Utils.callMethod(ci, "getName");
// remove stackable file systems
int colon = dbName.indexOf(':');
while (colon != -1) {
String fileSystemPrefix = dbName.substring(0, colon+1);
FileSystem fs = FileSystem.getInstance(fileSystemPrefix);
if (fs == null || fs instanceof FileSystemDisk) {
break;
}
dbName = dbName.substring(colon+1);
colon = dbName.indexOf(':');
}
if (!isRemote && isPersistent) {
String oldDataName = dbName + ".data.db";
String oldIndexName = dbName + ".index.db";
String oldLobsName = dbName + ".lobs.db";
newName = dbName + ".h2.db";
oldDataFile = new File(oldDataName).getAbsoluteFile();
oldIndexFile = new File(oldIndexName).getAbsoluteFile();
oldLobsDir = new File(oldLobsName).getAbsoluteFile();
newFile = new File(newName).getAbsoluteFile();
backupDataFile = new File(oldDataFile.getAbsolutePath() + ".backup");
backupIndexFile = new File(oldIndexFile.getAbsolutePath() + ".backup");
backupLobsDir = new File(oldLobsDir.getAbsolutePath() + ".backup");
mustBeConverted = oldDataFile.exists() && !newFile.exists();
}
} catch (Exception e) {
throw DbException.toSQLException(e);
}
}
/**
* Returns if a database must be converted by this class.
*
* @return if the conversion classes were found and the database must be
* converted
* @throws SQLException
*/
public boolean mustBeConverted() throws SQLException {
return mustBeConverted;
}
/**
* Converts the database from 1.1 (non page store) to current (page store).
*
* @throws SQLException
*/
public void upgrade() throws SQLException {
successful = true;
if (!mustBeConverted) {
return;
}
File scriptFile = null;
try {
if (scriptInTempDir) {
scriptFile = File.createTempFile("h2dbmigration", "backup.sql");
} else {
scriptFile = new File(oldDataFile.getAbsolutePath() + "_script.sql");
}
Utils.callStaticMethod("org.h2.upgrade.v1_1.Driver.load");
Connection connection = DriverManager.getConnection(oldUrl, info);
Statement stmt = connection.createStatement();
boolean isEncrypted = StringUtils.toUpperEnglish(url).indexOf(";CIPHER=") >= 0;
String uuid = UUID.randomUUID().toString();
if (isEncrypted) {
stmt.execute("script to '" + scriptFile + "' CIPHER AES PASSWORD '" + uuid + "' --hide--");
} else {
stmt.execute("script to '" + scriptFile + "'");
}
stmt.close();
connection.close();
oldDataFile.renameTo(backupDataFile);
oldIndexFile.renameTo(backupIndexFile);
oldLobsDir.renameTo(backupLobsDir);
connection = DriverManager.getConnection(newUrl, info);
stmt = connection.createStatement();
if (isEncrypted) {
stmt.execute("runscript from '" + scriptFile + "' CIPHER AES PASSWORD '" + uuid + "' --hide--");
} else {
stmt.execute("runscript from '" + scriptFile + "'");
}
stmt.execute("analyze");
stmt.execute("shutdown compact");
stmt.close();
connection.close();
if (deleteOldDb) {
backupDataFile.delete();
backupIndexFile.delete();
FileSystem.getInstance(backupLobsDir.getAbsolutePath()).deleteRecursive(backupLobsDir.getAbsolutePath(), false);
}
} catch (Exception e) {
successful = false;
if (backupDataFile.exists()) {
backupDataFile.renameTo(oldDataFile);
}
if (backupIndexFile.exists()) {
backupIndexFile.renameTo(oldIndexFile);
}
if (backupLobsDir.exists()) {
backupLobsDir.renameTo(oldLobsDir);
}
newFile.delete();
throw DbException.toSQLException(e);
} finally {
if (scriptFile != null) {
scriptFile.delete();
}
}
}
/**
* Returns if the database upgrade was successful.
*
* @return if the database upgrade was successful
*/
public boolean wasSuccessful() {
return successful;
}
/**
* The conversion script file will per default be created in the db
* directory. Use this method to change the directory to the temp
* directory.
*
* @param scriptInTempDir true if the conversion script should be
* located in the temp directory.
*/
public static void setScriptInTempDir(boolean scriptInTempDir) {
DbUpgradeFromVersion1.scriptInTempDir = scriptInTempDir;
}
/**
* Old files will be renamed to .backup after a successful conversion. To
* delete them after the conversion, use this method with the parameter
* 'true'.
*
* @param deleteOldDb if true, the old db files will be deleted.
*/
public static void setDeleteOldDb(boolean deleteOldDb) {
DbUpgradeFromVersion1.deleteOldDb = deleteOldDb;
}
}
......@@ -715,24 +715,7 @@ public class StringUtils {
* @return the string with the before string replaced
*/
public static String replaceAll(String s, String before, String after) {
return replaceAll(s, s, before, after);
}
/**
* Replace all occurrences of the "before" string with the "after" string.
* A case-insensitive comparison is made.
*
* @param s the string
* @param before the old text
* @param after the new text
* @return the string with the before string replaced
*/
public static String replaceAllIgnoreCase(String s, String before, String after) {
return replaceAll(s, toUpperEnglish(s), toUpperEnglish(before), after);
}
private static String replaceAll(String s, String test, String before, String after) {
int next = test.indexOf(before);
int next = s.indexOf(before);
if (next < 0) {
return s;
}
......@@ -741,7 +724,7 @@ public class StringUtils {
while (true) {
buff.append(s.substring(index, next)).append(after);
index = next + before.length();
next = test.indexOf(before, index);
next = s.indexOf(before, index);
if (next < 0) {
buff.append(s.substring(index));
break;
......
......@@ -6,7 +6,6 @@
*/
package org.h2.test.db;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
......@@ -43,12 +42,15 @@ public class TestUpgrade extends TestBase {
deleteDb("upgrade");
Connection conn = getConnection("upgrade");
conn.close();
assertTrue(new File("data/test/upgrade.h2.db").exists());
assertTrue(IOUtils.exists(getBaseDir() + "/upgrade.h2.db"));
deleteDb("upgrade");
conn = getConnection("upgrade;NO_UPGRADE=TRUE");
conn = getConnection("jdbc:h2v1_1:" + getBaseDir() + "/upgrade");
conn.close();
assertTrue(new File("data/test/upgrade.h2.db").exists());
conn = getConnection("upgrade");
conn.close();
assertTrue(IOUtils.exists(getBaseDir() + "/upgrade.h2.db"));
deleteDb("upgrade");
}
......@@ -59,49 +61,39 @@ public class TestUpgrade extends TestBase {
// Create old db
Utils.callStaticMethod("org.h2.upgrade.v1_1.Driver.load");
Connection connOld = DriverManager.getConnection("jdbc:h2v1_1:data/test/upgradeOld;PAGE_STORE=FALSE" + additionalParameters);
Connection connOld = DriverManager.getConnection("jdbc:h2v1_1:" + getBaseDir() + "/upgradeOld;PAGE_STORE=FALSE" + additionalParameters);
// Test auto server, too
Connection connOld2 = DriverManager.getConnection("jdbc:h2v1_1:data/test/upgradeOld;PAGE_STORE=FALSE" + additionalParameters);
Connection connOld2 = DriverManager.getConnection("jdbc:h2v1_1:" + getBaseDir() + "/upgradeOld;PAGE_STORE=FALSE" + additionalParameters);
Statement statOld = connOld.createStatement();
statOld.execute("create table testOld(id int)");
connOld.close();
connOld2.close();
Utils.callStaticMethod("org.h2.upgrade.v1_1.Driver.unload");
assertTrue(new File("data/test/upgradeOld.data.db").exists());
// Connect to old DB without upgrade
Connection connOldViaNew = DriverManager.getConnection("jdbc:h2:data/test/upgradeOld;NO_UPGRADE=TRUE" + additionalParameters);
// Test auto server, too
Connection connOldViaNew2 = DriverManager.getConnection("jdbc:h2:data/test/upgradeOld;NO_UPGRADE=TRUE" + additionalParameters);
Statement statOldViaNew = connOldViaNew.createStatement();
statOldViaNew.executeQuery("select * from testOld");
connOldViaNew.close();
connOldViaNew2.close();
assertTrue(new File("data/test/upgradeOld.data.db").exists());
assertTrue(IOUtils.exists(getBaseDir() + "/upgradeOld.data.db"));
// Create new DB
Connection connNew = DriverManager.getConnection("jdbc:h2:data/test/upgrade" + additionalParameters);
Connection connNew2 = DriverManager.getConnection("jdbc:h2:data/test/upgrade" + additionalParameters);
Connection connNew = DriverManager.getConnection("jdbc:h2:" + getBaseDir() + "/upgrade" + additionalParameters);
Connection connNew2 = DriverManager.getConnection("jdbc:h2:" + getBaseDir() + "/upgrade" + additionalParameters);
Statement statNew = connNew.createStatement();
statNew.execute("create table test(id int)");
// Link to old DB without upgrade
statNew.executeUpdate("CREATE LOCAL TEMPORARY LINKED TABLE linkedTestOld('org.h2.Driver', 'jdbc:h2:data/test/upgradeOld;NO_UPGRADE=TRUE" + additionalParameters + "', '', '', 'TestOld')");
statNew.executeUpdate("CREATE LOCAL TEMPORARY LINKED TABLE linkedTestOld('org.h2.Driver', 'jdbc:h2v1_1:" + getBaseDir() + "/upgradeOld" + additionalParameters + "', '', '', 'TestOld')");
statNew.executeQuery("select * from linkedTestOld");
connNew.close();
connNew2.close();
assertTrue(new File("data/test/upgradeOld.data.db").exists());
assertTrue(new File("data/test/upgrade.h2.db").exists());
assertTrue(IOUtils.exists(getBaseDir() + "/upgradeOld.data.db"));
assertTrue(IOUtils.exists(getBaseDir() + "/upgrade.h2.db"));
connNew = DriverManager.getConnection("jdbc:h2:data/test/upgrade" + additionalParameters);
connNew2 = DriverManager.getConnection("jdbc:h2:data/test/upgrade" + additionalParameters);
connNew = DriverManager.getConnection("jdbc:h2:" + getBaseDir() + "/upgrade" + additionalParameters);
connNew2 = DriverManager.getConnection("jdbc:h2:" + getBaseDir() + "/upgrade" + additionalParameters);
statNew = connNew.createStatement();
// Link to old DB with upgrade
statNew.executeUpdate("CREATE LOCAL TEMPORARY LINKED TABLE linkedTestOld('org.h2.Driver', 'jdbc:h2:data/test/upgradeOld" + additionalParameters + "', '', '', 'TestOld')");
statNew.executeUpdate("CREATE LOCAL TEMPORARY LINKED TABLE linkedTestOld('org.h2.Driver', 'jdbc:h2:" + getBaseDir() + "/upgradeOld" + additionalParameters + "', '', '', 'TestOld')");
statNew.executeQuery("select * from linkedTestOld");
connNew.close();
connNew2.close();
assertTrue(new File("data/test/upgradeOld.h2.db").exists());
assertTrue(new File("data/test/upgrade.h2.db").exists());
assertTrue(IOUtils.exists(getBaseDir() + "/upgradeOld.h2.db"));
assertTrue(IOUtils.exists(getBaseDir() + "/upgrade.h2.db"));
deleteDb("upgrade");
deleteDb("upgradeOld");
......@@ -110,24 +102,23 @@ public class TestUpgrade extends TestBase {
private void testIfExists() throws Exception {
deleteDb("upgrade");
// Create old db
// Create old
Utils.callStaticMethod("org.h2.upgrade.v1_1.Driver.load");
Connection connOld = DriverManager.getConnection("jdbc:h2v1_1:data/test/upgrade;PAGE_STORE=FALSE");
Connection connOld = DriverManager.getConnection("jdbc:h2v1_1:" + getBaseDir() + "/upgrade;PAGE_STORE=FALSE");
// Test auto server, too
Connection connOld2 = DriverManager.getConnection("jdbc:h2v1_1:data/test/upgrade;PAGE_STORE=FALSE");
Connection connOld2 = DriverManager.getConnection("jdbc:h2v1_1:" + getBaseDir() + "/upgrade;PAGE_STORE=FALSE");
Statement statOld = connOld.createStatement();
statOld.execute("create table test(id int)");
connOld.close();
connOld2.close();
Utils.callStaticMethod("org.h2.upgrade.v1_1.Driver.unload");
assertTrue(new File("data/test/upgrade.data.db").exists());
assertTrue(IOUtils.exists(getBaseDir() + "/upgrade.data.db"));
// Connect to old DB with upgrade
Connection connOldViaNew = DriverManager.getConnection("jdbc:h2:data/test/upgrade;ifexists=true");
// Upgrade
Connection connOldViaNew = DriverManager.getConnection("jdbc:h2:" + getBaseDir() + "/upgrade;ifexists=true");
Statement statOldViaNew = connOldViaNew.createStatement();
statOldViaNew.executeQuery("select * from test");
connOldViaNew.close();
assertTrue(new File("data/test/upgrade.h2.db").exists());
assertTrue(IOUtils.exists(getBaseDir() + "/upgrade.h2.db"));
deleteDb("upgrade");
}
......@@ -137,19 +128,18 @@ public class TestUpgrade extends TestBase {
// Create old db
Utils.callStaticMethod("org.h2.upgrade.v1_1.Driver.load");
Connection conn = DriverManager.getConnection("jdbc:h2v1_1:data/test/upgrade;PAGE_STORE=FALSE;CIPHER=AES", "abc", "abc abc");
Connection conn = DriverManager.getConnection("jdbc:h2v1_1:" + getBaseDir() + "/upgrade;PAGE_STORE=FALSE;CIPHER=AES", "abc", "abc abc");
Statement stat = conn.createStatement();
stat.execute("create table test(id int)");
conn.close();
Utils.callStaticMethod("org.h2.upgrade.v1_1.Driver.unload");
assertTrue(new File("data/test/upgrade.data.db").exists());
assertTrue(IOUtils.exists(getBaseDir() + "/upgrade.data.db"));
// Connect to old DB with upgrade
conn = DriverManager.getConnection("jdbc:h2:data/test/upgrade;CIPHER=AES", "abc", "abc abc");
conn = DriverManager.getConnection("jdbc:h2:" + getBaseDir() + "/upgrade;CIPHER=AES", "abc", "abc abc");
stat = conn.createStatement();
stat.executeQuery("select * from test");
conn.close();
assertTrue(new File("data/test/upgrade.h2.db").exists());
assertTrue(IOUtils.exists(getBaseDir() + "/upgrade.h2.db"));
deleteDb("upgrade");
}
......@@ -157,11 +147,12 @@ public class TestUpgrade extends TestBase {
public void deleteDb(String dbName) throws SQLException {
super.deleteDb(dbName);
try {
Utils.callStaticMethod("org.h2.upgrade.v1_1.tools.DeleteDbFiles.execute", "data/test", dbName, true);
Utils.callStaticMethod("org.h2.upgrade.v1_1.tools.DeleteDbFiles.execute", getBaseDir(), dbName, true);
} catch (Exception e) {
throw new SQLException(e.getMessage());
}
IOUtils.delete("data/test/" + dbName + ".data.db.backup");
IOUtils.delete("data/test/" + dbName + ".index.db.backup");
IOUtils.delete(getBaseDir() + "/" + dbName + ".data.db.backup");
IOUtils.delete(getBaseDir() + "/" + dbName + ".index.db.backup");
}
}
\ No newline at end of file
......@@ -178,10 +178,6 @@ public class TestStringUtils extends TestBase {
assertEquals("abc def", StringUtils.replaceAll("abc def", "xyz", "abc"));
assertEquals("", StringUtils.replaceAll("abcabcabc", "abc", ""));
assertEquals("abcabcabc", StringUtils.replaceAll("abcabcabc", "aBc", ""));
assertEquals("d", StringUtils.replaceAllIgnoreCase("abcd", "aBc", ""));
assertEquals("d", StringUtils.replaceAllIgnoreCase("abcd", "abc", ""));
assertEquals("D", StringUtils.replaceAllIgnoreCase("abcD", "aBc", ""));
assertEquals("D", StringUtils.replaceAllIgnoreCase("abcD", "abc", ""));
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论