From 22d4d3fc535890d1ca3c0ba400191ee0efbfe009 Mon Sep 17 00:00:00 2001 From: Vladimir Soskov Date: Sun, 31 Jul 2011 19:50:16 -0700 Subject: [PATCH] fixing Issue 188 --- .../clients/jedis/BinaryTransaction.java | 22 +++++++++++- .../java/redis/clients/jedis/Connection.java | 7 +++- .../java/redis/clients/jedis/Protocol.java | 6 +++- .../java/redis/clients/jedis/Response.java | 3 ++ .../clients/jedis/tests/PipeliningTest.java | 16 +++++++++ .../commands/TransactionCommandsTest.java | 36 +++++++++++++++++++ 6 files changed, 87 insertions(+), 3 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BinaryTransaction.java b/src/main/java/redis/clients/jedis/BinaryTransaction.java index 7f50a68..35c500e 100644 --- a/src/main/java/redis/clients/jedis/BinaryTransaction.java +++ b/src/main/java/redis/clients/jedis/BinaryTransaction.java @@ -6,6 +6,7 @@ import java.util.Map; import java.util.Set; import redis.clients.jedis.BinaryClient.LIST_POSITION; +import redis.clients.jedis.exceptions.JedisDataException; public class BinaryTransaction extends Queable { protected Client client = null; @@ -28,10 +29,29 @@ public class BinaryTransaction extends Queable { } List formatted = new ArrayList(); for (Object o : unformatted) { - formatted.add(generateResponse(o).get()); + try{ + formatted.add(generateResponse(o).get()); + }catch(JedisDataException e){ + formatted.add(e); + } } return formatted; } + + public List> execGetResponse() { + client.exec(); + client.getAll(1); // Discard all but the last reply + + List unformatted = client.getObjectMultiBulkReply(); + if (unformatted == null) { + return null; + } + List> response = new ArrayList>(); + for (Object o : unformatted) { + response.add(generateResponse(o)); + } + return response; + } public String discard() { client.discard(); diff --git a/src/main/java/redis/clients/jedis/Connection.java b/src/main/java/redis/clients/jedis/Connection.java index be5e664..abf0e99 100644 --- a/src/main/java/redis/clients/jedis/Connection.java +++ b/src/main/java/redis/clients/jedis/Connection.java @@ -9,6 +9,7 @@ import java.util.List; import redis.clients.jedis.Protocol.Command; import redis.clients.jedis.exceptions.JedisConnectionException; +import redis.clients.jedis.exceptions.JedisDataException; import redis.clients.jedis.exceptions.JedisException; import redis.clients.util.RedisInputStream; import redis.clients.util.RedisOutputStream; @@ -204,7 +205,11 @@ public class Connection { List all = new ArrayList(); flush(); while (pipelinedCommands > except) { - all.add(protocol.read(inputStream)); + try{ + all.add(protocol.read(inputStream)); + }catch(JedisDataException e){ + all.add(e); + } pipelinedCommands--; } return all; diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index c2ad2b5..1b5b130 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -113,7 +113,11 @@ public final class Protocol { } List ret = new ArrayList(num); for (int i = 0; i < num; i++) { - ret.add(process(is)); + try{ + ret.add(process(is)); + }catch(JedisDataException e){ + ret.add(e); + } } return ret; } diff --git a/src/main/java/redis/clients/jedis/Response.java b/src/main/java/redis/clients/jedis/Response.java index 062e97d..a662c10 100644 --- a/src/main/java/redis/clients/jedis/Response.java +++ b/src/main/java/redis/clients/jedis/Response.java @@ -24,6 +24,9 @@ public class Response { "Please close pipeline or multi block before calling this method."); } if (!built) { + if (data instanceof JedisDataException){ + throw new JedisDataException((JedisDataException)data); + } response = builder.build(data); this.data = null; built = true; diff --git a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java index 82d28a4..2a409d3 100644 --- a/src/test/java/redis/clients/jedis/tests/PipeliningTest.java +++ b/src/test/java/redis/clients/jedis/tests/PipeliningTest.java @@ -118,4 +118,20 @@ public class PipeliningTest extends Assert { p.sync(); assertNull(shouldNotExist.get()); } + + @Test + public void piplineWithError(){ + Pipeline p = jedis.pipelined(); + p.set("foo", "bar"); + Response> error = p.smembers("foo"); + Response r = p.get("foo"); + p.sync(); + try{ + error.get(); + fail(); + }catch(JedisDataException e){ + //that is fine we should be here + } + assertEquals(r.get(), "bar"); + } } \ No newline at end of file diff --git a/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java index f7d8d4d..f123a4a 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/TransactionCommandsTest.java @@ -11,6 +11,7 @@ import org.junit.Before; import org.junit.Test; import redis.clients.jedis.Jedis; +import redis.clients.jedis.Pipeline; import redis.clients.jedis.Response; import redis.clients.jedis.Transaction; import redis.clients.jedis.TransactionBlock; @@ -241,4 +242,39 @@ public class TransactionCommandsTest extends JedisCommandTestBase { string.get(); t.exec(); } + + @Test + public void transactionResponseWithError() { + Transaction t = jedis.multi(); + t.set("foo", "bar"); + Response> error = t.smembers("foo"); + Response r = t.get("foo"); + List l = t.exec(); + assertEquals(JedisDataException.class, l.get(1).getClass()); + try{ + error.get(); + fail("We expect exception here!"); + }catch(JedisDataException e){ + //that is fine we should be here + } + assertEquals(r.get(), "bar"); + } + + @Test + public void execGetResponse() { + Transaction t = jedis.multi(); + + t.set("foo", "bar"); + t.smembers("foo"); + t.get("foo"); + + List> lr = t.execGetResponse(); + try{ + lr.get(1).get(); + fail("We expect exception here!"); + }catch(JedisDataException e){ + //that is fine we should be here + } + assertEquals("bar", lr.get(2).get()); + } } \ No newline at end of file