1
0
mirror of https://github.com/redis/node-redis.git synced 2025-08-06 02:15:48 +03:00

Add all commands from Redis master, not just ones documented on the Redis wiki.

Use lowercase for all command names.
Build RedisClient and Multi prototype at the same time.
This commit is contained in:
Matt Ranney
2010-10-30 01:40:31 -07:00
parent d51abad43f
commit a3c03dcc68

View File

@@ -4,8 +4,7 @@ var net = require("net"),
util, util,
events = require("events"), events = require("events"),
default_port = 6379, default_port = 6379,
default_host = "127.0.0.1", default_host = "127.0.0.1";
commands;
// hilarious 0.2.x to 0.3.x API change // hilarious 0.2.x to 0.3.x API change
try { try {
@@ -519,7 +518,7 @@ RedisClient.prototype.return_reply = function (reply) {
if (command_obj) { if (command_obj) {
if (typeof command_obj.callback === "function") { if (typeof command_obj.callback === "function") {
// HGETALL special case replies with keyed Buffers // HGETALL special case replies with keyed Buffers
if (reply && 'HGETALL' === command_obj.command) { if (reply && 'hgetall' === command_obj.command.toLowerCase()) {
obj = {}; obj = {};
for (i = 0, len = reply.length; i < len; i += 2) { for (i = 0, len = reply.length; i < len; i += 2) {
key = reply[i].toString(); key = reply[i].toString();
@@ -568,7 +567,11 @@ RedisClient.prototype.send_command = function () {
throw new Error("send_command: not enough arguments"); throw new Error("send_command: not enough arguments");
} }
command = this_args[0]; if (typeof this_args[0] !== "string") {
throw new Error("First argument of send_command must be the command name");
}
command = this_args[0].toLowerCase();
if (this_args[1] && Array.isArray(this_args[1])) { if (this_args[1] && Array.isArray(this_args[1])) {
args = this_args[1]; args = this_args[1];
if (typeof this_args[2] === "function") { if (typeof this_args[2] === "function") {
@@ -583,10 +586,6 @@ RedisClient.prototype.send_command = function () {
} }
} }
if (typeof command !== "string") {
throw new Error("First argument of send_command must be the command name");
}
command_obj = { command_obj = {
command: command, command: command,
args: args, args: args,
@@ -601,13 +600,13 @@ RedisClient.prototype.send_command = function () {
return; return;
} }
if (command === "SUBSCRIBE" || command === "PSUBSCRIBE" || command === "UNSUBSCRIBE" || command === "PUNSUBSCRIBE") { if (command === "subscribe" || command === "psubscribe" || command === "unsubscribe" || command === "punsubscribe") {
if (this.subscriptions === false && exports.debug_mode) { if (this.subscriptions === false && exports.debug_mode) {
console.log("Entering pub/sub mode from " + command); console.log("Entering pub/sub mode from " + command);
} }
this.subscriptions = true; this.subscriptions = true;
} else { } else {
if (command === "QUIT") { if (command === "quit") {
this.closing = true; this.closing = true;
} else if (this.subscriptions === true) { } else if (this.subscriptions === true) {
throw new Error("Connection in pub/sub mode, only pub/sub commands may be used"); throw new Error("Connection in pub/sub mode, only pub/sub commands may be used");
@@ -680,45 +679,6 @@ RedisClient.prototype.end = function () {
return this.stream.end(); return this.stream.end();
}; };
// http://code.google.com/p/redis/wiki/CommandReference
commands = [
// Connection handling
"QUIT", "AUTH",
// Commands operating on all value types
"EXISTS", "DEL", "TYPE", "KEYS", "RANDOMKEY", "RENAME", "RENAMENX", "DBSIZE", "EXPIRE", "TTL", "SELECT",
"MOVE", "FLUSHDB", "FLUSHALL",
// Commands operating on string values
"SET", "GET", "GETSET", "MGET", "SETNX", "SETEX", "MSET", "MSETNX", "INCR", "INCRBY", "DECR", "DECRBY", "APPEND", "SUBSTR",
// Commands operating on lists
"RPUSH", "LPUSH", "LLEN", "LRANGE", "LTRIM", "LINDEX", "LSET", "LREM", "LPOP", "RPOP", "BLPOP", "BRPOP", "RPOPLPUSH",
// Commands operating on sets
"SADD", "SREM", "SPOP", "SMOVE", "SCARD", "SISMEMBER", "SINTER", "SINTERSTORE", "SUNION", "SUNIONSTORE", "SDIFF", "SDIFFSTORE",
"SMEMBERS", "SRANDMEMBER",
// Commands operating on sorted zsets (sorted sets)
"ZADD", "ZREM", "ZINCRBY", "ZRANK", "ZREVRANK", "ZRANGE", "ZREVRANGE", "ZRANGEBYSCORE", "ZCOUNT", "ZCARD", "ZSCORE",
"ZREMRANGEBYRANK", "ZREMRANGEBYSCORE", "ZUNIONSTORE", "ZINTERSTORE",
// Commands operating on hashes
"HSET", "HSETNX", "HGET", "HMGET", "HMSET", "HINCRBY", "HEXISTS", "HDEL", "HLEN", "HKEYS", "HVALS", "HGETALL",
// Sorting
"SORT",
// Persistence control commands
"SAVE", "BGSAVE", "LASTSAVE", "SHUTDOWN", "BGREWRITEAOF",
// Remote server control commands
"INFO", "MONITOR", "SLAVEOF", "CONFIG",
// Publish/Subscribe
"PUBLISH", "SUBSCRIBE", "PSUBSCRIBE", "UNSUBSCRIBE", "PUNSUBSCRIBE",
// Undocumented commands
"PING"
];
commands.forEach(function (command) {
RedisClient.prototype[command] = function () {
var args = to_array(arguments);
args.unshift(command); // put command at the beginning
this.send_command.apply(this, args);
};
RedisClient.prototype[command.toLowerCase()] = RedisClient.prototype[command];
});
function Multi(client, args) { function Multi(client, args) {
this.client = client; this.client = client;
@@ -728,13 +688,41 @@ function Multi(client, args) {
} }
} }
commands.forEach(function (command) {
Multi.prototype[command.toLowerCase()] = function () { // Official source is: http://code.google.com/p/redis/wiki/CommandReference
// This list is taken from src/redis.c
[
// string commands
"get", "set", "setnx", "setex", "append", "substr", "strlen", "del", "exists", "incr", "decr", "mget",
// list commands
"rpush", "lpush", "rpushx", "lpushx", "linsert", "rpop", "lpop", "brpop", "blpop", "llen", "lindex", "lset", "lrange", "ltrim", "lrem", "rpoplpush",
// set commands
"sadd", "srem", "smove", "sismember", "scard", "spop", "srandmember", "sinter", "sinterstore", "sunion", "sunionstore", "sdiff", "sdiffstore", "smembers",
// sorted set commands
"zadd", "zincrby", "zrem", "zremrangebyscore", "zremrangebyrank", "zunionstore", "zinterstore", "zrange", "zrangebyscore", "zrevrangebyscore",
"zcount", "zrevrange", "zcard", "zscore", "zrank", "zrevrank",
// hash commands
"hset", "hsetnx", "hget", "hmset", "hmget", "hincrby", "hdel", "hlen", "hkeys", "hgetall", "hexists", "incrby", "decrby",
// misc
"getset", "mset", "msetnx", "randomkey", "select", "move", "rename", "renamenx", "expire", "expireat", "keys", "dbsize", "auth", "ping", "echo",
"save", "bgsave", "bgwriteaof", "shutdown", "lastsave", "type", "sync", "flushdb", "flushall", "sort", "info",
"monitor", "ttl", "persist", "slaveof", "debug", "config", "subscribe", "unsubscribe", "psubscribe", "punsubscribe", "publish", "watch", "unwatch",
"quit"
].forEach(function (command) {
RedisClient.prototype[command] = function () {
var args = to_array(arguments);
args.unshift(command); // put command at the beginning
this.send_command.apply(this, args);
};
RedisClient.prototype[command.toUpperCase()] = RedisClient.prototype[command];
Multi.prototype[command] = function () {
var args = to_array(arguments); var args = to_array(arguments);
args.unshift(command); args.unshift(command);
this.queue.push(args); this.queue.push(args);
return this; return this;
}; };
Multi.prototype[command.toUpperCase()] = Multi.prototype[command];
}); });
Multi.prototype.exec = function (callback) { Multi.prototype.exec = function (callback) {
@@ -781,7 +769,7 @@ Multi.prototype.exec = function (callback) {
args = self.queue[i]; args = self.queue[i];
// Convert HGETALL reply to object // Convert HGETALL reply to object
if (reply && args[0] === "HGETALL") { if (reply && args[0].toLowerCase() === "hgetall") {
obj = {}; obj = {};
for (j = 0, jl = reply.length; j < jl; j += 2) { for (j = 0, jl = reply.length; j < jl; j += 2) {
key = reply[j].toString(); key = reply[j].toString();