use of com.axway.ats.environment.database.exceptions.DatabaseEnvironmentCleanupException in project ats-framework by Axway.
the class OracleEnvironmentHandler method restore.
/**
* @see com.axway.ats.environment.database.model.RestoreHandler#restore(java.lang.String)
*/
public void restore(String backupFileName) throws DatabaseEnvironmentCleanupException {
BufferedReader backupReader = null;
Connection connection = null;
//we need to preserve the auto commit option, as
//the connections are pooled
boolean isAutoCommit = true;
try {
log.debug("Starting restoring db backup from file '" + backupFileName + "'");
backupReader = new BufferedReader(new FileReader(new File(backupFileName)));
connection = ConnectionPool.getConnection(dbConnection);
isAutoCommit = connection.getAutoCommit();
connection.setAutoCommit(false);
StringBuilder sql = new StringBuilder();
String line = backupReader.readLine();
while (line != null) {
sql.append(line);
if (line.endsWith(EOL_MARKER)) {
// does not require it, as opposing to any other, excluding blocks ([DECLARE]BEGIN-END;)
if (line.contains("END;")) {
// in this case semicolon is mandatory
sql.delete(sql.length() - EOL_MARKER.length(), sql.length());
} else {
sql.delete(sql.length() - EOL_MARKER.length() - 1, sql.length());
}
PreparedStatement updateStatement = connection.prepareStatement(sql.toString());
//catch the exception and rollback, otherwise we are locked
try {
updateStatement.execute();
} catch (SQLException sqle) {
log.error("Error invoking restore satement: " + sql.toString());
//we have to roll back the transaction and re throw the exception
connection.rollback();
throw sqle;
} finally {
try {
updateStatement.close();
} catch (SQLException sqle) {
log.error("Unable to close prepared statement", sqle);
}
}
sql = new StringBuilder();
} else {
//add a new line
//FIXME: this code will add the system line ending - it
//is not guaranteed that this was the actual line ending
sql.append(LINE_SEPARATOR);
}
line = backupReader.readLine();
}
try {
//commit the transaction
connection.commit();
} catch (SQLException sqle) {
//we have to roll back the transaction and re throw the exception
connection.rollback();
throw sqle;
}
log.debug("Finished restoring db backup from file '" + backupFileName + "'");
} catch (IOException ioe) {
throw new DatabaseEnvironmentCleanupException(ERROR_RESTORING_BACKUP + backupFileName, ioe);
} catch (SQLException sqle) {
throw new DatabaseEnvironmentCleanupException(ERROR_RESTORING_BACKUP + backupFileName, sqle);
} catch (DbException dbe) {
throw new DatabaseEnvironmentCleanupException(ERROR_RESTORING_BACKUP + backupFileName, dbe);
} finally {
try {
IoUtils.closeStream(backupReader, "Could not close reader for backup file " + backupFileName);
if (connection != null) {
connection.setAutoCommit(isAutoCommit);
connection.close();
}
} catch (SQLException sqle) {
log.error(ERROR_RESTORING_BACKUP + backupFileName, sqle);
}
}
}
Aggregations