/*
* Copyright 2013, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags.
* See the copyright.txt in the distribution for a
* full listing of individual contributors.
* This copyrighted material is made available to anyone wishing to use,
* modify, copy, or redistribute it subject to the terms and conditions
* of the GNU Lesser General Public License, v. 2.1.
* This program is distributed in the hope that it will be useful, but WITHOUT A
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public License,
* v.2.1 along with this distribution; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
* MA 02110-1301, USA.
*
* (C) 2013
* @author JBoss Inc.
*/
package com.hp.mwtests.ts.jta.commitmarkable;
import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import javax.sql.XAConnection;
import javax.sql.XADataSource;
import javax.transaction.xa.XAException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
public class Utils {
public static void createTables(Connection connection) throws SQLException {
try {
String driverName = connection.getMetaData().getDriverName();
int index = driverName.indexOf(' ');
if (index != -1)
driverName = driverName.substring(0, index);
driverName = driverName.replaceAll("-", "_");
driverName = driverName.toLowerCase();
Statement statement = connection.createStatement();
if (driverName.equals("jconnect")) {
try {
statement.execute("drop table xids");
} catch (SQLException e) {
if (e.getErrorCode() != 3701) {
throw e;
}
}
statement
.execute("create table xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))");
try {
statement.execute("drop table foo");
} catch (SQLException e) {
if (e.getErrorCode() != 3701) {
throw e;
}
}
} else if (driverName.equals("oracle")) {
try {
statement.execute("drop table xids");
statement.execute("drop index index_xid on xids");
} catch (SQLException ex) {
if (!ex.getSQLState().equals("42000")
&& ex.getErrorCode() != 942) {
throw ex;
}
}
statement
.execute("create table xids (xid RAW(144), transactionManagerID varchar(64), actionuid RAW(28))");
statement.execute("create unique index index_xid on xids (xid)");
try {
statement.execute("drop table foo");
} catch (SQLException ex) {
if (!ex.getSQLState().equals("42000")
&& ex.getErrorCode() != 942) {
throw ex;
}
}
} else if (driverName.equals("ibm")) {
try {
statement.execute("drop table xids");
statement.execute("drop index index_xid");
} catch (SQLException ex) {
if (!ex.getSQLState().equals("42704")
&& ex.getErrorCode() != -204) {
throw ex;
}
}
statement
.execute("create table xids (xid VARCHAR(255), transactionManagerID varchar(64), actionuid VARCHAR(255))");
statement.execute("create unique index index_xid on xids (xid)");
try {
statement.execute("drop table foo");
} catch (SQLException ex) {
if (!ex.getSQLState().equals("42704")
&& ex.getErrorCode() != -204) {
throw ex;
}
}
} else if (driverName.equals("microsoft")) {
try {
statement.execute("drop table xids");
statement.execute("drop index index_xid on xids");
} catch (SQLException ex) {
if (!ex.getSQLState().equals("S0005")
&& ex.getErrorCode() != 3701) {
throw ex;
}
}
statement
.execute("create table xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))");
statement.execute("create unique index index_xid on xids (xid)");
try {
statement.execute("drop table foo");
} catch (SQLException ex) {
if (!ex.getSQLState().equals("S0005")
&& ex.getErrorCode() != 3701) {
throw ex;
}
}
} else {
statement.execute("drop table if exists xids");
if (driverName.equals("postgresql")) {
statement.execute("drop index if exists index_xid");
statement
.execute("create table xids (xid bytea, transactionManagerID varchar(64), actionuid bytea)");
statement
.execute("create unique index index_xid on xids (xid)");
} else {
statement
.execute("create table xids (xid varbinary(144), transactionManagerID varchar(64), actionuid varbinary(28))");
if (driverName.equals("h2")) {
statement.execute("drop index if exists index_xid");
statement
.execute("create unique index index_xid on xids (xid)");
}
}
statement.execute("drop table if exists foo");
}
statement.execute("create table foo (bar int)");
statement.close();
} finally {
connection.close();
}
}
public static void createTables(XADataSource xaDataSource) {
try {
XAConnection xaConnection = xaDataSource.getXAConnection();
try {
XAResource xaResource = xaConnection.getXAResource();
Xid[] recover = xaResource.recover(XAResource.TMSTARTRSCAN);
for (int i = 0; i < recover.length; i++) {
xaResource.rollback(recover[i]);
}
xaResource.recover(XAResource.TMENDRSCAN);
} catch (XAException e) {
e.printStackTrace();
}
Connection connection = xaConnection.getConnection();
Statement statement = connection.createStatement();
String driverName = connection.getMetaData().getDriverName();
int index = driverName.indexOf(' ');
if (index != -1)
driverName = driverName.substring(0, index);
driverName = driverName.replaceAll("-", "_");
driverName = driverName.toLowerCase();
if (driverName.equals("jconnect")) {
try {
statement
.execute("drop table " + Utils.getXAFooTableName());
} catch (SQLException ex) {
if (ex.getErrorCode() != 3701) {
throw ex;
}
}
} else if (driverName.equals("oracle")) {
try {
statement
.execute("drop table " + Utils.getXAFooTableName());
} catch (SQLException ex) {
if (!ex.getSQLState().equals("42000")
&& ex.getErrorCode() != 942) {
throw ex;
}
}
} else if (driverName.equals("ibm")) {
try {
statement
.execute("drop table " + Utils.getXAFooTableName());
} catch (SQLException ex) {
if (!ex.getSQLState().equals("42704")
&& ex.getErrorCode() != -204) {
throw ex;
}
}
} else if (driverName.equals("microsoft")) {
try {
statement
.execute("drop table " + Utils.getXAFooTableName());
} catch (SQLException ex) {
if (!ex.getSQLState().equals("S0005")
&& ex.getErrorCode() != 3701) {
throw ex;
}
}
} else {
statement.execute("drop table if exists "
+ Utils.getXAFooTableName());
}
statement.execute("create table " + Utils.getXAFooTableName()
+ " (bar int)");
statement.close();
connection.close();
xaConnection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void createTables(Connection connection,
XADataSource xaDataSource) throws SQLException {
createTables(connection);
createTables(xaDataSource);
}
public static void removeRecursive(Path path) throws IOException {
Files.walkFileTree(path, new SimpleFileVisitor<Path>() {
@Override
public FileVisitResult visitFile(Path file,
BasicFileAttributes attrs) throws IOException {
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult visitFileFailed(Path file, IOException exc)
throws IOException {
// try to delete the file anyway, even if its attributes
// could not be read, since delete-only access is
// theoretically possible
Files.delete(file);
return FileVisitResult.CONTINUE;
}
@Override
public FileVisitResult postVisitDirectory(Path dir, IOException exc)
throws IOException {
if (exc == null) {
Files.delete(dir);
return FileVisitResult.CONTINUE;
} else {
// directory iteration failed; propagate exception
throw exc;
}
}
});
}
public static String getXAFooTableName() {
return "foo2";
}
}