# ignite-375 Add tests.
Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/2e6e93d3 Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/2e6e93d3 Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/2e6e93d3 Branch: refs/heads/ignite-gg-9933 Commit: 2e6e93d33827348031bef3f061e387c172318140 Parents: 5c856ed Author: anovikov <anovi...@gridgain.com> Authored: Thu Mar 19 09:53:58 2015 +0700 Committer: anovikov <anovi...@gridgain.com> Committed: Thu Mar 19 09:53:58 2015 +0700 ---------------------------------------------------------------------- .../store/jdbc/CacheAbstractJdbcStore.java | 5 +- .../core/src/test/config/store/jdbc/Ignite.xml | 28 +++++++ .../store/jdbc/CacheJdbcPojoStoreTest.java | 83 +++++++++++++++++++- 3 files changed, 113 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2e6e93d3/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java ---------------------------------------------------------------------- diff --git a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java index 85c036f..6a43929 100644 --- a/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java +++ b/modules/core/src/main/java/org/apache/ignite/cache/store/jdbc/CacheAbstractJdbcStore.java @@ -1197,12 +1197,13 @@ public abstract class CacheAbstractJdbcStore<K, V> implements CacheStore<K, V>, if (field.getJavaType() == UUID.class) { switch (field.getDatabaseType()) { case Types.BINARY: - U.uuidToBytes((UUID)fieldVal); - break; + fieldVal = U.uuidToBytes((UUID)fieldVal); + break; case Types.CHAR: case Types.VARCHAR: fieldVal = fieldVal.toString(); + break; } } http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2e6e93d3/modules/core/src/test/config/store/jdbc/Ignite.xml ---------------------------------------------------------------------- diff --git a/modules/core/src/test/config/store/jdbc/Ignite.xml b/modules/core/src/test/config/store/jdbc/Ignite.xml index 3a64d60..91d77cd 100644 --- a/modules/core/src/test/config/store/jdbc/Ignite.xml +++ b/modules/core/src/test/config/store/jdbc/Ignite.xml @@ -237,4 +237,32 @@ </list> </property> </bean> + <bean class="org.apache.ignite.cache.CacheTypeMetadata"> + <property name="databaseSchema" value="PUBLIC"/> + <property name="databaseTable" value="TIMESTAMP_ENTRIES"/> + <property name="keyType" value="java.sql.Timestamp"/> + <property name="valueType" value="java.lang.Integer"/> + <property name="keyFields"> + <list> + <bean class="org.apache.ignite.cache.CacheTypeFieldMetadata"> + <property name="databaseName" value="KEY"/> + <property name="databaseType"> + <util:constant static-field="java.sql.Types.TIMESTAMP"/> + </property> + <property name="javaType" value="java.sql.Timestamp"/> + </bean> + </list> + </property> + <property name="valueFields"> + <list> + <bean class="org.apache.ignite.cache.CacheTypeFieldMetadata"> + <property name="databaseName" value="VAL"/> + <property name="databaseType"> + <util:constant static-field="java.sql.Types.INTEGER"/> + </property> + <property name="javaType" value="java.lang.Integer"/> + </bean> + </list> + </property> + </bean> </beans> http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/2e6e93d3/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java ---------------------------------------------------------------------- diff --git a/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java b/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java index 76cc119..98308cb 100644 --- a/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java +++ b/modules/core/src/test/java/org/apache/ignite/cache/store/jdbc/CacheJdbcPojoStoreTest.java @@ -21,7 +21,7 @@ import org.apache.ignite.*; import org.apache.ignite.cache.*; import org.apache.ignite.cache.store.jdbc.dialect.*; import org.apache.ignite.cache.store.jdbc.model.*; -import org.apache.ignite.internal.*; +import org.apache.ignite.internal.processors.cache.*; import org.apache.ignite.internal.util.typedef.*; import org.apache.ignite.internal.util.typedef.internal.*; import org.apache.ignite.lang.*; @@ -33,6 +33,7 @@ import org.springframework.beans.factory.xml.*; import org.springframework.context.support.*; import org.springframework.core.io.*; +import javax.cache.integration.*; import java.net.*; import java.sql.*; import java.util.*; @@ -175,8 +176,16 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache // No-op. } + try { + stmt.executeUpdate("delete from Timestamp_Entries"); + } + catch (SQLException ignore) { + // No-op. + } + stmt.executeUpdate("CREATE TABLE IF NOT EXISTS String_Entries (key varchar(100) not null, val varchar(100), PRIMARY KEY(key))"); stmt.executeUpdate("CREATE TABLE IF NOT EXISTS UUID_Entries (key binary(16) not null, val binary(16), PRIMARY KEY(key))"); + stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Timestamp_Entries (key timestamp not null, val integer, PRIMARY KEY(key))"); stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Organization (id integer not null, name varchar(50), city varchar(50), PRIMARY KEY(id))"); stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Person (id integer not null, org_id integer, name varchar(50), PRIMARY KEY(id))"); stmt.executeUpdate("CREATE TABLE IF NOT EXISTS Person_Complex (id integer not null, org_id integer not null, city_id integer not null, name varchar(50), PRIMARY KEY(id))"); @@ -307,4 +316,76 @@ public class CacheJdbcPojoStoreTest extends GridAbstractCacheStoreSelfTest<Cache assertTrue(prnKeys.isEmpty()); assertTrue(prnComplexKeys.isEmpty()); } + + /** + * @throws Exception If failed. + */ + public void testWriteRetry() throws Exception { + // Special dialect that will skip updates, to test write retry. + BasicJdbcDialect dialect = new BasicJdbcDialect() { + /** {@inheritDoc} */ + @Override public String updateQuery(String tblName, Collection<String> keyCols, Iterable<String> valCols) { + return super.updateQuery(tblName, keyCols, valCols) + " AND 1 = 0"; + } + }; + + store.setDialect(dialect); + + Map<String, Map<Object, CacheAbstractJdbcStore.EntryMapping>> cacheMappings = + GridTestUtils.getFieldValue(store, CacheAbstractJdbcStore.class, "cacheMappings"); + + CacheAbstractJdbcStore.EntryMapping em = cacheMappings.get(null).get(OrganizationKey.class); + + CacheTypeMetadata typeMeta = GridTestUtils.getFieldValue(em, CacheAbstractJdbcStore.EntryMapping.class, "typeMeta"); + + cacheMappings.get(null).put(OrganizationKey.class, + new CacheAbstractJdbcStore.EntryMapping(null, dialect, typeMeta)); + + Connection conn = store.openConnection(false); + + PreparedStatement orgStmt = conn.prepareStatement("INSERT INTO Organization(id, name, city) VALUES (?, ?, ?)"); + + orgStmt.setInt(1, 1); + orgStmt.setString(2, "name" + 1); + orgStmt.setString(3, "city" + 1); + + orgStmt.executeUpdate(); + + U.closeQuiet(orgStmt); + + conn.commit(); + + OrganizationKey k1 = new OrganizationKey(1); + Organization v1 = new Organization(1, "Name1", "City1"); + + ses.newSession(null); + + try { + store.write(new CacheEntryImpl<>(k1, v1)); + } + catch (CacheWriterException e) { + if (!e.getMessage().startsWith("Failed insert entry in database, violate a unique index or primary key") || + e.getSuppressed().length != 2) + throw e; + } + } + + /** + * @throws Exception If failed. + */ + public void testTimestamp() throws Exception { + Timestamp k = new Timestamp(System.currentTimeMillis()); + + ses.newSession(null); + + Integer v = 5; + + store.write(new CacheEntryImpl<>(k, v)); + + assertEquals(v, store.load(k)); + + store.delete(k); + + assertNull(store.load(k)); + } }