package org.n3r.eql.trans; import com.google.common.collect.Maps; import lombok.SneakyThrows; import org.n3r.eql.EqlTran; import org.n3r.eql.config.EqlConfig; import org.n3r.eql.ex.EqlExecuteException; import org.n3r.eql.map.EqlRun; import org.n3r.eql.util.Closes; import java.sql.Connection; import java.util.Map; public class EqlJdbcTran implements EqlTran { private EqlConnection eqlConnection; private Map<String, Connection> connections = Maps.newHashMap(); public EqlJdbcTran(EqlConnection connection) { this.eqlConnection = connection; } @Override public void start() { } @Override @SneakyThrows public void commit() { for (Connection connection : connections.values()) { connection.commit(); } } @Override @SneakyThrows public void rollback() { for (Connection connection : connections.values()) { connection.rollback(); } } @Override @SneakyThrows public Connection getConn(EqlConfig eqlConfig, EqlRun eqlRun) { String dbName = eqlConnection.getDbName(eqlConfig, eqlRun); Connection connection = connections.get(dbName); if (connection != null) { eqlRun.setConnection(connection); return connection; } connection = eqlConnection.getConnection(dbName); if (connection == null) throw new EqlExecuteException( "EqlJdbcTran could not start transaction. " + " Cause: The DataSource returned a null connection."); if (connection.getAutoCommit()) connection.setAutoCommit(false); connections.put(dbName, connection); if (eqlRun != null) eqlRun.setConnection(connection); return connection; } @Override public String getDriverName() { return eqlConnection.getDriverName(); } @Override public String getJdbcUrl() { return eqlConnection.getJdbcUrl(); } /** * Oracle JDBC will auto commit when close without explicit commit/rollback. */ @Override public void close() { for (Connection connection : connections.values()) { Closes.closeQuietly(connection); } } }