IGNITE-4762 - transactionsAllowed flag for JDBC driver
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/e47bf27b Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/e47bf27b Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/e47bf27b Branch: refs/heads/ignite-3477-master Commit: e47bf27b5582cd695a7d3de3c39d54b3df4c59cc Parents: 39edcc7 Author: Valentin Kulichenko <valentin.luliche...@gmail.com> Authored: Tue Mar 28 16:51:44 2017 -0700 Committer: Valentin Kulichenko <valentin.luliche...@gmail.com> Committed: Tue Mar 28 16:51:44 2017 -0700 ---------------------------------------------------------------------- .../internal/jdbc2/JdbcConnectionSelfTest.java | 34 +++++++++++++ .../org/apache/ignite/IgniteJdbcDriver.java | 9 +++- .../ignite/internal/jdbc2/JdbcConnection.java | 50 +++++++++++++------- 3 files changed, 75 insertions(+), 18 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ignite/blob/e47bf27b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionSelfTest.java ---------------------------------------------------------------------- diff --git a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionSelfTest.java b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionSelfTest.java index 8c05df3..0bbdca8 100644 --- a/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionSelfTest.java +++ b/modules/clients/src/test/java/org/apache/ignite/internal/jdbc2/JdbcConnectionSelfTest.java @@ -267,4 +267,38 @@ public class JdbcConnectionSelfTest extends GridCommonAbstractTest { ); } } + + /** + * @throws Exception If failed. + */ + public void testTxAllowedCommit() throws Exception { + String url = CFG_URL_PREFIX + "transactionsAllowed=true@" + CFG_URL; + + try (final Connection conn = DriverManager.getConnection(url)) { + conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); + + assertEquals(Connection.TRANSACTION_SERIALIZABLE, conn.getTransactionIsolation()); + + conn.setAutoCommit(false); + + conn.commit(); + } + } + + /** + * @throws Exception If failed. + */ + public void testTxAllowedRollback() throws Exception { + String url = CFG_URL_PREFIX + "transactionsAllowed=true@" + CFG_URL; + + try (final Connection conn = DriverManager.getConnection(url)) { + conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE); + + assertEquals(Connection.TRANSACTION_SERIALIZABLE, conn.getTransactionIsolation()); + + conn.setAutoCommit(false); + + conn.rollback(); + } + } } http://git-wip-us.apache.org/repos/asf/ignite/blob/e47bf27b/modules/core/src/main/java/org/apache/ignite/IgniteJdbcDriver.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteJdbcDriver.java b/modules/core/src/main/java/org/apache/ignite/IgniteJdbcDriver.java index d432c1e4..c511d5f 100644 --- a/modules/core/src/main/java/org/apache/ignite/IgniteJdbcDriver.java +++ b/modules/core/src/main/java/org/apache/ignite/IgniteJdbcDriver.java @@ -292,6 +292,9 @@ public class IgniteJdbcDriver implements Driver { /** Distributed joins parameter name. */ private static final String PARAM_DISTRIBUTED_JOINS = "distributedJoins"; + /** Transactions allowed parameter name. */ + private static final String PARAM_TX_ALLOWED = "transactionsAllowed"; + /** Hostname property name. */ public static final String PROP_HOST = PROP_PREFIX + "host"; @@ -313,6 +316,9 @@ public class IgniteJdbcDriver implements Driver { /** Distributed joins property name. */ public static final String PROP_DISTRIBUTED_JOINS = PROP_PREFIX + PARAM_DISTRIBUTED_JOINS; + /** Transactions allowed property name. */ + public static final String PROP_TX_ALLOWED = PROP_PREFIX + PARAM_TX_ALLOWED; + /** Cache name property name. */ public static final String PROP_CFG = PROP_PREFIX + "cfg"; @@ -378,7 +384,8 @@ public class IgniteJdbcDriver implements Driver { new PropertyInfo("Node ID", info.getProperty(PROP_NODE_ID), ""), new PropertyInfo("Local", info.getProperty(PROP_LOCAL), ""), new PropertyInfo("Collocated", info.getProperty(PROP_COLLOCATED), ""), - new PropertyInfo("Distributed Joins", info.getProperty(PROP_DISTRIBUTED_JOINS), "") + new PropertyInfo("Distributed Joins", info.getProperty(PROP_DISTRIBUTED_JOINS), ""), + new PropertyInfo("Transactions Allowed", info.getProperty(PROP_TX_ALLOWED), "") ); if (info.getProperty(PROP_CFG) != null) http://git-wip-us.apache.org/repos/asf/ignite/blob/e47bf27b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java index 5c4a147..dc3fe7f 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java @@ -73,6 +73,7 @@ import static org.apache.ignite.IgniteJdbcDriver.PROP_COLLOCATED; import static org.apache.ignite.IgniteJdbcDriver.PROP_DISTRIBUTED_JOINS; import static org.apache.ignite.IgniteJdbcDriver.PROP_LOCAL; import static org.apache.ignite.IgniteJdbcDriver.PROP_NODE_ID; +import static org.apache.ignite.IgniteJdbcDriver.PROP_TX_ALLOWED; /** * JDBC connection implementation. @@ -118,6 +119,12 @@ public class JdbcConnection implements Connection { /** Distributed joins flag. */ private boolean distributedJoins; + /** Transactions allowed flag. */ + private boolean txAllowed; + + /** Current transaction isolation. */ + private int txIsolation; + /** Statements. */ final Set<JdbcStatement> statements = new HashSet<>(); @@ -134,15 +141,16 @@ public class JdbcConnection implements Connection { this.url = url; - this.cacheName = props.getProperty(PROP_CACHE); - this.locQry = Boolean.parseBoolean(props.getProperty(PROP_LOCAL)); - this.collocatedQry = Boolean.parseBoolean(props.getProperty(PROP_COLLOCATED)); - this.distributedJoins = Boolean.parseBoolean(props.getProperty(PROP_DISTRIBUTED_JOINS)); + cacheName = props.getProperty(PROP_CACHE); + locQry = Boolean.parseBoolean(props.getProperty(PROP_LOCAL)); + collocatedQry = Boolean.parseBoolean(props.getProperty(PROP_COLLOCATED)); + distributedJoins = Boolean.parseBoolean(props.getProperty(PROP_DISTRIBUTED_JOINS)); + txAllowed = Boolean.parseBoolean(props.getProperty(PROP_TX_ALLOWED)); String nodeIdProp = props.getProperty(PROP_NODE_ID); if (nodeIdProp != null) - this.nodeId = UUID.fromString(nodeIdProp); + nodeId = UUID.fromString(nodeIdProp); try { String cfgUrl = props.getProperty(PROP_CFG); @@ -259,7 +267,7 @@ public class JdbcConnection implements Connection { @Override public void setAutoCommit(boolean autoCommit) throws SQLException { ensureNotClosed(); - if (!autoCommit) + if (!txAllowed && !autoCommit) throw new SQLFeatureNotSupportedException("Transactions are not supported."); } @@ -274,14 +282,16 @@ public class JdbcConnection implements Connection { @Override public void commit() throws SQLException { ensureNotClosed(); - throw new SQLFeatureNotSupportedException("Transactions are not supported."); + if (!txAllowed) + throw new SQLFeatureNotSupportedException("Transactions are not supported."); } /** {@inheritDoc} */ @Override public void rollback() throws SQLException { ensureNotClosed(); - throw new SQLFeatureNotSupportedException("Transactions are not supported."); + if (!txAllowed) + throw new SQLFeatureNotSupportedException("Transactions are not supported."); } /** {@inheritDoc} */ @@ -354,14 +364,20 @@ public class JdbcConnection implements Connection { @Override public void setTransactionIsolation(int level) throws SQLException { ensureNotClosed(); - throw new SQLFeatureNotSupportedException("Transactions are not supported."); + if (txAllowed) + txIsolation = level; + else + throw new SQLFeatureNotSupportedException("Transactions are not supported."); } /** {@inheritDoc} */ @Override public int getTransactionIsolation() throws SQLException { ensureNotClosed(); - throw new SQLFeatureNotSupportedException("Transactions are not supported."); + if (txAllowed) + return txIsolation; + else + throw new SQLFeatureNotSupportedException("Transactions are not supported."); } /** {@inheritDoc} */ @@ -413,7 +429,7 @@ public class JdbcConnection implements Connection { @Override public void setHoldability(int holdability) throws SQLException { ensureNotClosed(); - if (holdability != HOLD_CURSORS_OVER_COMMIT) + if (!txAllowed && holdability != HOLD_CURSORS_OVER_COMMIT) throw new SQLFeatureNotSupportedException("Invalid holdability (transactions are not supported)."); } @@ -428,28 +444,28 @@ public class JdbcConnection implements Connection { @Override public Savepoint setSavepoint() throws SQLException { ensureNotClosed(); - throw new SQLFeatureNotSupportedException("Transactions are not supported."); + throw new SQLFeatureNotSupportedException("Savepoints are not supported."); } /** {@inheritDoc} */ @Override public Savepoint setSavepoint(String name) throws SQLException { ensureNotClosed(); - throw new SQLFeatureNotSupportedException("Transactions are not supported."); + throw new SQLFeatureNotSupportedException("Savepoints are not supported."); } /** {@inheritDoc} */ @Override public void rollback(Savepoint savepoint) throws SQLException { ensureNotClosed(); - throw new SQLFeatureNotSupportedException("Transactions are not supported."); + throw new SQLFeatureNotSupportedException("Savepoints are not supported."); } /** {@inheritDoc} */ @Override public void releaseSavepoint(Savepoint savepoint) throws SQLException { ensureNotClosed(); - throw new SQLFeatureNotSupportedException("Transactions are not supported."); + throw new SQLFeatureNotSupportedException("Savepoints are not supported."); } /** {@inheritDoc} */ @@ -463,7 +479,7 @@ public class JdbcConnection implements Connection { if (resSetConcurrency != CONCUR_READ_ONLY) throw new SQLFeatureNotSupportedException("Invalid concurrency (updates are not supported)."); - if (resSetHoldability != HOLD_CURSORS_OVER_COMMIT) + if (!txAllowed && resSetHoldability != HOLD_CURSORS_OVER_COMMIT) throw new SQLFeatureNotSupportedException("Invalid holdability (transactions are not supported)."); JdbcStatement stmt = new JdbcStatement(this); @@ -484,7 +500,7 @@ public class JdbcConnection implements Connection { if (resSetConcurrency != CONCUR_READ_ONLY) throw new SQLFeatureNotSupportedException("Invalid concurrency (updates are not supported)."); - if (resSetHoldability != HOLD_CURSORS_OVER_COMMIT) + if (!txAllowed && resSetHoldability != HOLD_CURSORS_OVER_COMMIT) throw new SQLFeatureNotSupportedException("Invalid holdability (transactions are not supported)."); JdbcPreparedStatement stmt = new JdbcPreparedStatement(this, sql);