diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java index 4f8488667..51d86c4e3 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnection.java @@ -159,6 +159,27 @@ public class LettuceConnection implements RedisConnection { } } + private class LettuceEvalResultsConverter implements Converter { + private ReturnType returnType; + + public LettuceEvalResultsConverter(ReturnType returnType) { + this.returnType = returnType; + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public T convert(Object source) { + if(returnType == ReturnType.MULTI) { + List resultList = (List) source; + for(Object obj: resultList) { + if(obj instanceof Exception) { + throw convertLettuceAccessException((Exception)obj); + } + } + } + return (T) source; + } + } + /** * Instantiates a new lettuce connection. * @@ -2738,14 +2759,17 @@ public class LettuceConnection implements RedisConnection { byte[][] args = extractScriptArgs(numKeys, keysAndArgs); if (isPipelined()) { - pipeline(new LettuceResult(getAsyncConnection().eval(script, LettuceConverters.toScriptOutputType(returnType), keys, args))); + pipeline(new LettuceResult(getAsyncConnection().eval(script, LettuceConverters.toScriptOutputType(returnType), keys, args), + new LettuceEvalResultsConverter(returnType))); return null; } if (isQueueing()) { - transaction(new LettuceTxResult(getConnection().eval(script, LettuceConverters.toScriptOutputType(returnType), keys, args))); + transaction(new LettuceTxResult(getConnection().eval(script, LettuceConverters.toScriptOutputType(returnType), keys, args), + new LettuceEvalResultsConverter(returnType))); return null; } - return getConnection().eval(script, LettuceConverters.toScriptOutputType(returnType), keys, args); + return new LettuceEvalResultsConverter(returnType).convert(getConnection().eval(script, + LettuceConverters.toScriptOutputType(returnType), keys, args)); } catch (Exception ex) { throw convertLettuceAccessException(ex); } @@ -2758,15 +2782,16 @@ public class LettuceConnection implements RedisConnection { if (isPipelined()) { pipeline(new LettuceResult(getAsyncConnection().evalsha(scriptSha1, LettuceConverters.toScriptOutputType(returnType), - keys, args))); + keys, args), new LettuceEvalResultsConverter(returnType))); return null; } if (isQueueing()) { transaction(new LettuceTxResult(getConnection().evalsha(scriptSha1, LettuceConverters.toScriptOutputType(returnType), - keys, args))); + keys, args), new LettuceEvalResultsConverter(returnType))); return null; } - return getConnection().evalsha(scriptSha1, LettuceConverters.toScriptOutputType(returnType), keys, args); + return new LettuceEvalResultsConverter(returnType).convert(getConnection().evalsha(scriptSha1, + LettuceConverters.toScriptOutputType(returnType), keys, args)); } catch (Exception ex) { throw convertLettuceAccessException(ex); } diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java index 7df921a15..f110d208d 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java @@ -188,6 +188,13 @@ public abstract class AbstractConnectionIntegrationTests { new String(scriptResults.get(1)) })); } + @Test(expected=RedisSystemException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalShaArrayError() { + connection.evalSha("notasha", ReturnType.MULTI, 1, "key1", "arg1"); + getResults(); + } + @Test(expected = RedisSystemException.class) @IfProfileValue(name = "redisVersion", value = "2.6") public void testEvalShaNotFound() { @@ -255,6 +262,14 @@ public abstract class AbstractConnectionIntegrationTests { verifyResults(Arrays.asList(new Object[] { Arrays.asList(new Object[] { 1l, 2l }) })); } + @Test(expected=RedisSystemException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalArrayScriptError() { + // Syntax error + connection.eval("return {1,2", ReturnType.MULTI, 1, "foo", "bar"); + getResults(); + } + @SuppressWarnings("unchecked") @Test @IfProfileValue(name = "redisVersion", value = "2.6") diff --git a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java index 24d25d7e6..40acab2ee 100644 --- a/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/AbstractConnectionPipelineIntegrationTests.java @@ -110,6 +110,18 @@ abstract public class AbstractConnectionPipelineIntegrationTests extends super.testRestoreExistingKey(); } + @Test(expected=RedisPipelineException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalArrayScriptError() { + super.testEvalArrayScriptError(); + } + + @Test(expected=RedisPipelineException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalShaArrayError() { + super.testEvalShaArrayError(); + } + @Test public void testOpenPipelineTwice() { connection.openPipeline(); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java index b6617fc5c..92cb60252 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionIntegrationTests.java @@ -237,12 +237,24 @@ public class JedisConnectionIntegrationTests extends AbstractConnectionIntegrati connection.eval("return redis.call('expire','foo')", ReturnType.BOOLEAN, 0); } + @Test(expected=InvalidDataAccessApiUsageException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalArrayScriptError() { + super.testEvalArrayScriptError(); + } + @Test(expected=InvalidDataAccessApiUsageException.class) @IfProfileValue(name = "redisVersion", value = "2.6") public void testEvalShaNotFound() { connection.evalSha("somefakesha", ReturnType.VALUE, 2, "key1", "key2"); } + @Test(expected=InvalidDataAccessApiUsageException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalShaArrayError() { + super.testEvalShaArrayError(); + } + @Test(expected=InvalidDataAccessApiUsageException.class) public void testExecWithoutMulti() { super.testExecWithoutMulti(); diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java index 7a098ac46..e9e064977 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionPipelineIntegrationTests.java @@ -319,6 +319,18 @@ public class JedisConnectionPipelineIntegrationTests extends super.testEvalShaNotFound(); } + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalShaArrayError() { + super.testEvalShaArrayError(); + } + + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalArrayScriptError() { + super.testEvalArrayScriptError(); + } + @Test(expected=UnsupportedOperationException.class) @IfProfileValue(name = "redisVersion", value = "2.6") public void testEvalReturnString() { diff --git a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java index b27f1f370..387951e5f 100644 --- a/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionTransactionIntegrationTests.java @@ -235,6 +235,18 @@ public class JedisConnectionTransactionIntegrationTests extends super.testEvalShaNotFound(); } + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalShaArrayError() { + super.testEvalShaArrayError(); + } + + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalArrayScriptError() { + super.testEvalArrayScriptError(); + } + @Test(expected = UnsupportedOperationException.class) @IfProfileValue(name = "redisVersion", value = "2.6") public void testEvalReturnString() { diff --git a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java index 6652932c9..8fe1bb03c 100644 --- a/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/jredis/JRedisConnectionIntegrationTests.java @@ -453,6 +453,18 @@ public class JRedisConnectionIntegrationTests extends AbstractConnectionIntegrat super.testEvalShaNotFound(); } + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalShaArrayError() { + super.testEvalShaArrayError(); + } + + @Test(expected=UnsupportedOperationException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalArrayScriptError() { + super.testEvalArrayScriptError(); + } + @Test(expected=UnsupportedOperationException.class) @IfProfileValue(name = "redisVersion", value = "2.6") public void testEvalReturnString() { diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineTxIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineTxIntegrationTests.java index 1dd3c8a15..53902ec78 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineTxIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionPipelineTxIntegrationTests.java @@ -42,6 +42,18 @@ public class LettuceConnectionPipelineTxIntegrationTests extends super.testRestoreExistingKey(); } + @Test(expected=RedisPipelineException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalArrayScriptError() { + super.testEvalArrayScriptError(); + } + + @Test(expected=RedisPipelineException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalShaArrayError() { + super.testEvalShaArrayError(); + } + protected void initConnection() { connection.openPipeline(); connection.multi(); diff --git a/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineTxIntegrationTests.java b/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineTxIntegrationTests.java index 5a116a6d6..8e7eb32e7 100644 --- a/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineTxIntegrationTests.java +++ b/src/test/java/org/springframework/data/redis/connection/srp/SrpConnectionPipelineTxIntegrationTests.java @@ -89,6 +89,18 @@ public class SrpConnectionPipelineTxIntegrationTests extends SrpConnectionTransa super.testRestoreBadData(); } + @Test(expected=RedisPipelineException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalArrayScriptError() { + super.testEvalArrayScriptError(); + } + + @Test(expected=RedisPipelineException.class) + @IfProfileValue(name = "redisVersion", value = "2.6") + public void testEvalShaArrayError() { + super.testEvalShaArrayError(); + } + protected void initConnection() { connection.openPipeline(); connection.multi();