blob: b70fb1a2532f9ca929756edfe69659f0790a0512 [file] [log] [blame]
/*
Derby - Class org.apache.derbyTesting.functionTests.tests.store.backupRestore1
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package org.apache.derbyTesting.functionTests.tests.store;
import java.io.File;
import java.io.ByteArrayInputStream;
import java.io.RandomAccessFile;
import java.math.BigDecimal;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import org.apache.derby.tools.ij;
import org.apache.derby.tools.JDBCDisplayUtil;
import org.apache.derbyTesting.functionTests.util.TestUtil;
/**
* Test of backup restore through java program JDBC calls.
* Enhanced the test from bug5229 repro.
*/
public class backupRestore1
{
private static final byte[] blob1 = { 1, 2, 3, 4, 5, 6, 7, 8};
private static final byte[] blob2 = new byte[0x4001];
private static final byte[] blob3 = new byte[0x8000];
private static final byte[] blob4 = new byte[32700];
private static final byte[] clob1 = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'};
private static final byte[] clob2 = new byte[0x4001];
private static final byte[] clob3 = new byte[0x8000];
private static final byte[] clob4 = new byte[0x1000];
static
{
for( int i = 0; i < clob2.length; i++)
clob2[i] = 'a';
for( int i = 0; i < clob3.length; i++)
clob3[i] = 'b';
for( int i = 0; i < clob4.length; i++)
clob4[i] = 'c';
}
public static void main( String args[])
{
System.out.println("Test backupRestore starting");
try
{
// use the ij utility to read the property file and
// make the initial connection.
ij.getPropertyArg(args);
Connection conn = ij.startJBMS();
Statement stmt = conn.createStatement();
stmt.execute("CREATE FUNCTION ConsistencyChecker() RETURNS VARCHAR(128) EXTERNAL NAME 'org.apache.derbyTesting.functionTests.util.T_ConsistencyChecker.runConsistencyChecker' LANGUAGE JAVA PARAMETER STYLE JAVA");
stmt.executeUpdate( "create table t( id integer not null primary key, cBlob blob(64K),"
+ "cClob clob(64K), clvarchar long varchar, clvarbinary long varchar for bit data)");
conn.setAutoCommit( false);
PreparedStatement insStmt = conn.prepareStatement( "insert into t( id, cBlob, cClob, clvarchar, clvarbinary) values( ?, ?, ?, ?, ?)");
insStmt.setInt( 1, 1);
insStmt.setBinaryStream( 2, new ByteArrayInputStream( blob1), blob1.length);
insStmt.setAsciiStream( 3, new ByteArrayInputStream( clob1), clob1.length);
insStmt.setAsciiStream( 4, new ByteArrayInputStream( clob2), clob2.length);
insStmt.setBinaryStream( 5, new ByteArrayInputStream( blob2), blob2.length);
insStmt.executeUpdate();
insStmt.setInt( 1, 2);
insStmt.setBinaryStream( 2, new ByteArrayInputStream(blob3), blob3.length);
insStmt.setAsciiStream( 3, new ByteArrayInputStream( clob3), clob3.length);
insStmt.setAsciiStream( 4, new ByteArrayInputStream( clob4), clob4.length);
insStmt.setBinaryStream( 5, new ByteArrayInputStream( blob4), blob4.length);
insStmt.executeUpdate();
conn.commit();
//execute the backup command.
CallableStatement backupStmt = conn.prepareCall(
"CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE_AND_ENABLE_LOG_ARCHIVE_MODE(?, ?)");
backupStmt.setString(1, "extinout/mybackup");
backupStmt.setInt(2, 1);
backupStmt.execute();
backupStmt.close();
//insert a row after the bacup
insStmt.setInt( 1, 3);
insStmt.setBinaryStream( 2, new ByteArrayInputStream(blob3), blob3.length);
insStmt.setAsciiStream( 3, new ByteArrayInputStream( clob3), clob3.length);
insStmt.setAsciiStream( 4, new ByteArrayInputStream( clob4), clob4.length);
insStmt.setBinaryStream( 5, new ByteArrayInputStream( blob4), blob4.length);
insStmt.executeUpdate();
conn.commit();
insStmt.close();
conn.close();
}
catch( SQLException e)
{
dumpSQLExceptions(e);
} catch (Throwable e) {
System.out.println("FAIL -- unexpected exception:" + e.toString());
}
//shutdown the database ..
try{
//shutdown
TestUtil.getConnection("wombat", "shutdown=true");
}catch(SQLException se){
if (se.getSQLState() != null && se.getSQLState().equals("08006"))
System.out.println("database shutdown properly");
else
dumpSQLExceptions(se);
} catch (Throwable e) {
System.out.println("FAIL -- unexpected exception:" + e.toString());
}
System.out.println("testing rollforward recovery");
try{
//perform rollforward recovery and do some inserts again
Connection conn = TestUtil.getConnection("wombat", "rollForwardRecoveryFrom=extinout/mybackup/wombat");
//run consistenct checker
Statement stmt = conn.createStatement();
stmt.execute("VALUES (ConsistencyChecker())");
//make sure the db has three rows
ResultSet rs = stmt.executeQuery("select count(*) from t");
while (rs.next()) {
int count = rs.getInt(1);
System.out.println(count);
}
conn.commit();
conn.close();
TestUtil.getConnection("wombat", "shutdown=true");
}
catch( SQLException se)
{
if (se.getSQLState() != null && se.getSQLState().equals("08006"))
System.out.println("database shutdown properly");
else
dumpSQLExceptions(se);
} catch (Throwable e) {
System.out.println("FAIL -- unexpected exception:" + e.toString());
}
//make sure that good back does not get deleted if renaming existing
//backup as old backup fails. (beetle : 5336)
RandomAccessFile rfs = null;
boolean alreadyShutdown = false;
try{
Connection conn = TestUtil.getConnection("wombat", null);
//just open to a file in existing backup, so that rename will fail on
//next backup
rfs =
new RandomAccessFile(
"extinout/mybackup/wombat/service.properties" , "r");
CallableStatement backupStmt = conn.prepareCall(
"CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE(?)");
backupStmt.setString(1, "extinout/mybackup");
backupStmt.execute();
backupStmt.close();
conn.close();
TestUtil.getConnection("wombat", "shutdown=true");
}catch(SQLException se)
{
if (se.getSQLState() != null && se.getSQLState().equals("XSRS4"))
{ alreadyShutdown = false;
//expected exception:XSRS4;rename failed because of a open file
}else
if (se.getSQLState() != null &&
se.getSQLState().equals("08006"))
{ //On UNIX Systems , rename does not fail even if there is a
//open file, if we succefully reached shutdown mean
//everything is okay.
System.out.println("database shutdown properly");
alreadyShutdown = true;
}else
dumpSQLExceptions(se);
}catch (Throwable e) {
System.out.println("FAIL -- unexpected exception:" + e.toString());
}
//shutdown the db
if(!alreadyShutdown)
{
try{
//shutdown
TestUtil.getConnection("wombat", "shutdown=true");
}catch(SQLException se){
if (se.getSQLState() != null && se.getSQLState().equals("08006"))
System.out.println("database shutdown properly");
else
dumpSQLExceptions(se);
} catch (Throwable e) {
System.out.println("FAIL -- unexpected exception:" + e.toString());
}
}
//restore from the backup db and run consistency checker on it.
try{
//close the earlier opened file in backup dir
if(rfs != null )
rfs.close();
Connection conn = TestUtil.getConnection("wombat", "restoreFrom=extinout/mybackup/wombat");
//run consistenct checker
Statement stmt = conn.createStatement();
stmt.execute("VALUES (ConsistencyChecker())");
conn.close();
//shutdown the backup db;
TestUtil.getConnection("wombat", "shutdown=true");
}catch(SQLException se)
{
if (se.getSQLState() != null && se.getSQLState().equals("08006"))
System.out.println("database shutdown properly");
else
dumpSQLExceptions(se);
}catch (Throwable e) {
System.out.println("FAIL -- unexpected exception:" + e.toString());
}
//now take a backup again , just to make all is well in the system.
try{
Connection conn = TestUtil.getConnection("wombat", null);
CallableStatement backupStmt = conn.prepareCall(
"CALL SYSCS_UTIL.SYSCS_BACKUP_DATABASE(?)");
backupStmt.setString(1, "extinout/mybackup");
backupStmt.execute();
backupStmt.close();
Statement stmt = conn.createStatement();
stmt.execute("VALUES (ConsistencyChecker())");
conn.close();
TestUtil.getConnection("wombat", "shutdown=true");
}catch(SQLException se)
{
if (se.getSQLState() != null && se.getSQLState().equals("08006"))
System.out.println("database shutdown properly");
else
dumpSQLExceptions(se);
}catch (Throwable e) {
System.out.println("FAIL -- unexpected exception:" + e.toString());
}
System.out.println("Test backupRestore1 finished");
}
static private void dumpSQLExceptions (SQLException se) {
System.out.println("FAIL -- unexpected exception: " + se.toString());
SQLException lastSe = se;
while (se != null) {
System.out.print("SQLSTATE("+se.getSQLState()+"):");
lastSe = se;
se = se.getNextException();
}
System.out.println("");
lastSe.printStackTrace(System.out);
}
}