Merge branch 'scriptsupport' of git://github.com/ivowiblo/jedis into ivowiblo-scriptsupport

This commit is contained in:
Jonathan Leibiusky
2012-04-18 18:10:45 -03:00
9 changed files with 365 additions and 5 deletions

View File

@@ -724,4 +724,46 @@ public class BinaryClient extends Connection {
db = 0;
super.disconnect();
}
private void sendEvalCommand(Command command, byte[] script, byte[] keyCount, byte[][] params){
final byte[][] allArgs = new byte[params.length + 2][];
allArgs[0] = script;
allArgs[1] = keyCount;
for(int i=0;i<params.length; i++)
allArgs[i+2] = params[i];
sendCommand(command, allArgs );
}
public void eval(byte[] script, byte[] keyCount, byte[][] params){
sendEvalCommand(EVAL, script, keyCount, params );
}
public void evalsha(byte[] sha1, byte[] keyCount, byte[][] params){
sendEvalCommand(EVALSHA, sha1, keyCount, params);
}
public void scriptFlush(){
sendCommand(SCRIPT, Keyword.FLUSH.raw);
}
public void scriptExists(byte[]... sha1){
byte[][] args = new byte[sha1.length + 1][];
args[0] = Keyword.EXISTS.raw;
for(int i=0;i<sha1.length; i++)
args[i+1] = sha1[i];
sendCommand(SCRIPT, args);
}
public void scriptLoad(byte[] script){
sendCommand(SCRIPT, Keyword.LOAD.raw, script);
}
public void scriptKill(){
sendCommand(SCRIPT, Keyword.KILL.raw);
}
}

View File

@@ -1,5 +1,7 @@
package redis.clients.jedis;
import static redis.clients.jedis.Protocol.Command.SCRIPT;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
@@ -9,10 +11,12 @@ import java.util.Map;
import java.util.Set;
import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.Protocol.Keyword;
import redis.clients.jedis.exceptions.JedisDataException;
import redis.clients.jedis.exceptions.JedisException;
import redis.clients.util.JedisByteHashMap;
import redis.clients.util.SafeEncoder;
import static redis.clients.jedis.Protocol.toByteArray;
public class BinaryJedis implements BinaryJedisCommands {
protected Client client = null;
@@ -1660,7 +1664,7 @@ public class BinaryJedis implements BinaryJedisCommands {
public void disconnect() {
client.disconnect();
}
public String watch(final byte[]... keys) {
client.watch(keys);
return client.getStatusCodeReply();
@@ -3006,4 +3010,53 @@ public class BinaryJedis implements BinaryJedisCommands {
public Long getDB() {
return client.getDB();
}
/**
* Evaluates scripts using the Lua interpreter built into Redis starting from version 2.6.0.
* <p>
*
* @return Script result
*/
public Object eval(byte[] script, List<byte[]> keys, List<byte[]> args) {
client.setTimeoutInfinite();
client.eval(script, toByteArray(keys.size()), getParams(keys, args));
return client.getOne();
}
private byte[][] getParams(List<byte[]> keys, List<byte[]> args){
int keyCount = keys.size();
byte[][] params = new byte[keyCount + args.size()][];
for(int i=0;i<keyCount;i++)
params[i] = keys.get(i);
for(int i=0;i<keys.size();i++)
params[keyCount + i] = args.get(i);
return params;
}
public Object eval(byte[] script, byte[] keyCount, byte[][] params) {
client.setTimeoutInfinite();
client.eval(script, keyCount, params);
return client.getOne();
}
public byte[] scriptFlush(){
client.scriptFlush();
return client.getBinaryBulkReply();
}
public List<Long> scriptExists(byte[]... sha1){
client.scriptExists(sha1);
return client.getIntegerMultiBulkReply();
}
public byte[] scriptLoad(byte[] script){
client.scriptLoad(script);
return client.getBinaryBulkReply();
}
public byte[] scriptKill(){
client.scriptKill();
return client.getBinaryBulkReply();
}
}

View File

@@ -154,4 +154,5 @@ public interface BinaryJedisCommands {
Long zremrangeByScore(byte[] key, double start, double end);
Long linsert(byte[] key, LIST_POSITION where, byte[] pivot, byte[] value);
}

View File

@@ -5,6 +5,7 @@ import redis.clients.util.Hashing;
import redis.clients.util.Sharded;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

View File

@@ -1,12 +1,16 @@
package redis.clients.jedis;
import redis.clients.jedis.Protocol.Keyword;
import redis.clients.util.SafeEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import static redis.clients.jedis.Protocol.toByteArray;
import static redis.clients.jedis.Protocol.Command.SCRIPT;
public class Client extends BinaryClient implements Commands {
public Client(final String host) {
@@ -605,4 +609,32 @@ public class Client extends BinaryClient implements Commands {
public void configGet(String pattern) {
configGet(SafeEncoder.encode(pattern));
}
private byte[][] getByteParams(String... params){
byte[][] p = new byte[params.length][];
for(int i=0;i<params.length;i++)
p[i] = SafeEncoder.encode(params[i]);
return p;
}
public void eval(String script, int keyCount, String... params) {
eval(SafeEncoder.encode(script),toByteArray(keyCount), getByteParams(params));
}
public void evalsha(String sha1, int keyCount, String... params) {
evalsha(SafeEncoder.encode(sha1),toByteArray(keyCount), getByteParams(params));
}
public void scriptExists(String... sha1){
final byte[][] bsha1 = new byte[sha1.length][];
for (int i = 0; i < bsha1.length; i++) {
bsha1[i] = SafeEncoder.encode(sha1[i]);
}
scriptExists(bsha1);
}
public void scriptLoad(String script){
scriptLoad(SafeEncoder.encode(script));
}
}

View File

@@ -82,7 +82,7 @@ public class Connection {
pipelinedCommands++;
return this;
}
protected Connection sendCommand(final Command cmd) {
connect();
protocol.sendCommand(outputStream, cmd, new byte[0][]);
@@ -205,6 +205,13 @@ public class Connection {
pipelinedCommands--;
return (List<Object>) protocol.read(inputStream);
}
@SuppressWarnings("unchecked")
public List<Long> getIntegerMultiBulkReply() {
flush();
pipelinedCommands--;
return (List<Long>) protocol.read(inputStream);
}
public List<Object> getAll() {
return getAll(0);

View File

@@ -9,6 +9,7 @@ import java.util.Map;
import java.util.Set;
import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.util.SafeEncoder;
public class Jedis extends BinaryJedis implements JedisCommands {
public Jedis(final String host) {
@@ -2688,5 +2689,90 @@ public class Jedis extends BinaryJedis implements JedisCommands {
public String configSet(final String parameter, final String value) {
client.configSet(parameter, value);
return client.getStatusCodeReply();
}
}
public Object eval(String script, int keyCount, String... params) {
client.setTimeoutInfinite();
client.eval(script, keyCount, params);
return getEvalResult();
}
private String[] getParams(List<String> keys, List<String> args){
int keyCount = keys.size();
int argCount = args.size();
String[] params = new String[keyCount + args.size()];
for(int i=0;i<keyCount;i++)
params[i] = keys.get(i);
for(int i=0;i<argCount;i++)
params[keyCount + i] = args.get(i);
return params;
}
public Object eval(String script, List<String> keys, List<String> args) {
return eval(script, keys.size(), getParams(keys, args));
}
public Object eval(String script) {
return eval(script,0);
}
public Object evalsha(String script) {
return evalsha(script,0);
}
private Object getEvalResult(){
Object result = client.getOne();
if(result instanceof byte[])
return SafeEncoder.encode((byte[])result);
if(result instanceof List<?>) {
List<?> list = (List<?>)result;
List<String> listResult = new ArrayList<String>(list.size());
for(Object bin: list)
listResult.add(SafeEncoder.encode((byte[])bin));
return listResult;
}
return result;
}
public Object evalsha(String sha1, List<String> keys, List<String> args) {
return evalsha(sha1, keys.size(), getParams(keys, args));
}
public Object evalsha(String sha1, int keyCount, String... params) {
checkIsInMulti();
client.evalsha(sha1, keyCount, params);
return getEvalResult();
}
public Boolean scriptExists(String sha1){
String[] a = new String[1];
a[0] = sha1;
return scriptExists(a).get(0);
}
public List<Boolean> scriptExists(String... sha1){
client.scriptExists(sha1);
List<Long> result = client.getIntegerMultiBulkReply();
List<Boolean> exists = new ArrayList<Boolean>();
for(Long value : result)
exists.add(value == 1);
return exists;
}
public String scriptLoad(String script){
client.scriptLoad(script);
return client.getBulkReply();
}
}

View File

@@ -140,7 +140,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, ZREVRANGEBYSCORE, 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;
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, ZREVRANGEBYSCORE, 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, EVAL, EVALSHA, SCRIPT;
public final byte[] raw;
@@ -150,7 +150,7 @@ public final class Protocol {
}
public static enum Keyword {
AGGREGATE, ALPHA, ASC, BY, DESC, GET, LIMIT, MESSAGE, NO, NOSORT, PMESSAGE, PSUBSCRIBE, PUNSUBSCRIBE, OK, ONE, QUEUED, SET, STORE, SUBSCRIBE, UNSUBSCRIBE, WEIGHTS, WITHSCORES, RESETSTAT;
AGGREGATE, ALPHA, ASC, BY, DESC, GET, LIMIT, MESSAGE, NO, NOSORT, PMESSAGE, PSUBSCRIBE, PUNSUBSCRIBE, OK, ONE, QUEUED, SET, STORE, SUBSCRIBE, UNSUBSCRIBE, WEIGHTS, WITHSCORES, RESETSTAT, FLUSH, EXISTS, LOAD, KILL;
public final byte[] raw;
Keyword() {