From 430601f31e08753d62288e17caca0960aad18164 Mon Sep 17 00:00:00 2001 From: Eric Hauser Date: Tue, 22 Feb 2011 22:41:46 -0500 Subject: [PATCH] Adding support for bit commands get/setrange --- src/main/java/redis/clients/jedis/BinaryClient.java | 8 ++++++++ src/main/java/redis/clients/jedis/BinaryJedis.java | 10 ++++++++++ src/main/java/redis/clients/jedis/Client.java | 9 ++++++++- src/main/java/redis/clients/jedis/Jedis.java | 10 ++++++++++ src/main/java/redis/clients/jedis/JedisCommands.java | 4 ++++ src/main/java/redis/clients/jedis/Protocol.java | 2 +- src/main/java/redis/clients/jedis/ShardedJedis.java | 10 ++++++++++ src/main/java/redis/clients/jedis/Transaction.java | 10 ++++++++++ .../jedis/tests/commands/BitCommandsTest.java | 12 ++++++++++++ 9 files changed, 73 insertions(+), 2 deletions(-) diff --git a/src/main/java/redis/clients/jedis/BinaryClient.java b/src/main/java/redis/clients/jedis/BinaryClient.java index 0dab295..ebdd539 100644 --- a/src/main/java/redis/clients/jedis/BinaryClient.java +++ b/src/main/java/redis/clients/jedis/BinaryClient.java @@ -644,4 +644,12 @@ public class BinaryClient extends Connection { public void getbit(byte[] key, long offset) { sendCommand(GETBIT, key, toByteArray(offset)); } + + public void setrange(byte[] key, long offset, byte[] value) { + sendCommand(SETRANGE, key, toByteArray(offset), value); + } + + public void getrange(byte[] key, long startOffset, long endOffset) { + sendCommand(GETRANGE, key, toByteArray(startOffset), toByteArray(endOffset)); + } } \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/BinaryJedis.java b/src/main/java/redis/clients/jedis/BinaryJedis.java index cf24500..5907ace 100644 --- a/src/main/java/redis/clients/jedis/BinaryJedis.java +++ b/src/main/java/redis/clients/jedis/BinaryJedis.java @@ -2927,6 +2927,16 @@ public class BinaryJedis implements BinaryJedisCommands { return client.getIntegerReply(); } + private long setrange(byte[] key, long offset, byte[] value) { + client.setrange(key, offset, value); + return client.getIntegerReply(); + } + + private String getrange(byte[] key, long startOffset, long endOffset) { + client.getrange(key, startOffset, endOffset); + return client.getBulkReply(); + } + public Long publish(byte[] channel, byte[] message) { client.publish(channel, message); return client.getIntegerReply(); diff --git a/src/main/java/redis/clients/jedis/Client.java b/src/main/java/redis/clients/jedis/Client.java index f3a1e98..493ef44 100644 --- a/src/main/java/redis/clients/jedis/Client.java +++ b/src/main/java/redis/clients/jedis/Client.java @@ -517,6 +517,14 @@ public class Client extends BinaryClient implements Commands { getbit(SafeEncoder.encode(key), offset); } + public void setrange(String key, long offset, String value) { + setrange(SafeEncoder.encode(key), offset, SafeEncoder.encode(value)); + } + + public void getrange(String key, long startOffset, long endOffset) { + getrange(SafeEncoder.encode(key), startOffset, endOffset); + } + public void publish(final String channel, final String message) { publish(SafeEncoder.encode(channel), SafeEncoder.encode(message)); } @@ -552,5 +560,4 @@ public class Client extends BinaryClient implements Commands { } subscribe(cs); } - } \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/Jedis.java b/src/main/java/redis/clients/jedis/Jedis.java index 71970fd..67566fc 100644 --- a/src/main/java/redis/clients/jedis/Jedis.java +++ b/src/main/java/redis/clients/jedis/Jedis.java @@ -2616,4 +2616,14 @@ public class Jedis extends BinaryJedis implements JedisCommands { client.getbit(key, offset); return client.getIntegerReply() == 1; } + + public long setrange(String key, long offset, String value) { + client.setrange(key, offset, value); + return client.getIntegerReply(); + } + + public String getrange(String key, long startOffset, long endOffset) { + client.getrange(key, startOffset, endOffset); + return client.getBulkReply(); + } } \ No newline at end of file diff --git a/src/main/java/redis/clients/jedis/JedisCommands.java b/src/main/java/redis/clients/jedis/JedisCommands.java index 5749aaa..004b6ac 100644 --- a/src/main/java/redis/clients/jedis/JedisCommands.java +++ b/src/main/java/redis/clients/jedis/JedisCommands.java @@ -27,6 +27,10 @@ public interface JedisCommands { boolean getbit(String key, long offset); + long setrange(String key, long offset, String value); + + String getrange(String key, long startOffset, long endOffset); + String getSet(String key, String value); Long setnx(String key, String value); diff --git a/src/main/java/redis/clients/jedis/Protocol.java b/src/main/java/redis/clients/jedis/Protocol.java index 301e30a..de0d889 100644 --- a/src/main/java/redis/clients/jedis/Protocol.java +++ b/src/main/java/redis/clients/jedis/Protocol.java @@ -136,7 +136,7 @@ public final class Protocol { } public static enum Command { - PING, SET, GET, QUIT, EXISTS, DEL, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, RENAMEX, DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX, MSET, MSETNX, DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, ZCOUNT, ZRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, SETBIT, GETBIT; + PING, SET, GET, QUIT, EXISTS, DEL, TYPE, FLUSHDB, KEYS, RANDOMKEY, RENAME, RENAMENX, RENAMEX, DBSIZE, EXPIRE, EXPIREAT, TTL, SELECT, MOVE, FLUSHALL, GETSET, MGET, SETNX, SETEX, MSET, MSETNX, DECRBY, DECR, INCRBY, INCR, APPEND, SUBSTR, HSET, HGET, HSETNX, HMSET, HMGET, HINCRBY, HEXISTS, HDEL, HLEN, HKEYS, HVALS, HGETALL, RPUSH, LPUSH, LLEN, LRANGE, LTRIM, LINDEX, LSET, LREM, LPOP, RPOP, RPOPLPUSH, SADD, SMEMBERS, SREM, SPOP, SMOVE, SCARD, SISMEMBER, SINTER, SINTERSTORE, SUNION, SUNIONSTORE, SDIFF, SDIFFSTORE, SRANDMEMBER, ZADD, ZRANGE, ZREM, ZINCRBY, ZRANK, ZREVRANK, ZREVRANGE, ZCARD, ZSCORE, MULTI, DISCARD, EXEC, WATCH, UNWATCH, SORT, BLPOP, BRPOP, AUTH, SUBSCRIBE, PUBLISH, UNSUBSCRIBE, PSUBSCRIBE, PUNSUBSCRIBE, ZCOUNT, ZRANGEBYSCORE, ZREMRANGEBYRANK, ZREMRANGEBYSCORE, ZUNIONSTORE, ZINTERSTORE, SAVE, BGSAVE, BGREWRITEAOF, LASTSAVE, SHUTDOWN, INFO, MONITOR, SLAVEOF, CONFIG, STRLEN, SYNC, LPUSHX, PERSIST, RPUSHX, ECHO, LINSERT, DEBUG, BRPOPLPUSH, SETBIT, GETBIT, SETRANGE, GETRANGE; public final byte[] raw; diff --git a/src/main/java/redis/clients/jedis/ShardedJedis.java b/src/main/java/redis/clients/jedis/ShardedJedis.java index 04af690..6db8635 100644 --- a/src/main/java/redis/clients/jedis/ShardedJedis.java +++ b/src/main/java/redis/clients/jedis/ShardedJedis.java @@ -79,6 +79,16 @@ public class ShardedJedis extends BinaryShardedJedis implements JedisCommands { return j.getbit(key, offset); } + public long setrange(String key, long offset, String value) { + Jedis j = getShard(key); + return j.setrange(key, offset, value); + } + + public String getrange(String key, long startOffset, long endOffset) { + Jedis j = getShard(key); + return j.getrange(key, startOffset, endOffset); + } + public String getSet(String key, String value) { Jedis j = getShard(key); return j.getSet(key, value); diff --git a/src/main/java/redis/clients/jedis/Transaction.java b/src/main/java/redis/clients/jedis/Transaction.java index 60185f4..ff005c2 100644 --- a/src/main/java/redis/clients/jedis/Transaction.java +++ b/src/main/java/redis/clients/jedis/Transaction.java @@ -413,6 +413,16 @@ public class Transaction extends BinaryTransaction { return client.getStatusCodeReply() == "1"; } + public long setrange(String key, long offset, String value) { + client.setrange(key, offset, value); + return client.getIntegerReply(); + } + + public String getrange(String key, long startOffset, long endOffset) { + client.getrange(key, startOffset, endOffset); + return client.getBulkReply(); + } + public String linsert(final String key, final LIST_POSITION where, final String pivot, final String value) { client.linsert(key, where, pivot, value); diff --git a/src/test/java/redis/clients/jedis/tests/commands/BitCommandsTest.java b/src/test/java/redis/clients/jedis/tests/commands/BitCommandsTest.java index d8f96ce..119fc8b 100644 --- a/src/test/java/redis/clients/jedis/tests/commands/BitCommandsTest.java +++ b/src/test/java/redis/clients/jedis/tests/commands/BitCommandsTest.java @@ -17,4 +17,16 @@ public class BitCommandsTest extends JedisCommandTestBase { bbit = jedis.getbit("bfoo".getBytes(), 0); assertEquals(1, bbit); } + + @Test + public void setAndgetrange() { + jedis.set("key1", "Hello World"); + long reply = jedis.setrange("key1", 6, "Jedis"); + assertEquals(11, reply); + + assertEquals(jedis.get("key1"), "Hello Jedis"); + + assertEquals("Hello", jedis.getrange("key1", 0, 4)); + assertEquals("Jedis", jedis.getrange("key1", 6, 11)); + } } \ No newline at end of file