Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
d33278d1
Commit
d33278d1
authored
Apr 12, 2010
by
Pieter Noordhuis
Browse files
implemented HMSET
parent
05df7621
Changes
4
Show whitespace changes
Inline
Side-by-side
redis-cli.c
View file @
d33278d1
...
...
@@ -150,6 +150,7 @@ static struct redisCommand cmdTable[] = {
{
"exec"
,
1
,
REDIS_CMD_INLINE
},
{
"discard"
,
1
,
REDIS_CMD_INLINE
},
{
"hset"
,
4
,
REDIS_CMD_MULTIBULK
},
{
"hmset"
,
-
4
,
REDIS_CMD_MULTIBULK
},
{
"hincrby"
,
4
,
REDIS_CMD_INLINE
},
{
"hget"
,
3
,
REDIS_CMD_BULK
},
{
"hdel"
,
3
,
REDIS_CMD_BULK
},
...
...
redis.c
View file @
d33278d1
...
...
@@ -704,6 +704,7 @@ static void substrCommand(redisClient *c);
static void zrankCommand(redisClient *c);
static void zrevrankCommand(redisClient *c);
static void hsetCommand(redisClient *c);
static void hmsetCommand(redisClient *c);
static void hgetCommand(redisClient *c);
static void hdelCommand(redisClient *c);
static void hlenCommand(redisClient *c);
...
...
@@ -780,6 +781,7 @@ static struct redisCommand cmdTable[] = {
{"zrank",zrankCommand,3,REDIS_CMD_BULK,NULL,1,1,1},
{"zrevrank",zrevrankCommand,3,REDIS_CMD_BULK,NULL,1,1,1},
{"hset",hsetCommand,4,REDIS_CMD_BULK|REDIS_CMD_DENYOOM,NULL,1,1,1},
{"hmset",hmsetCommand,-4,REDIS_CMD_BULK|REDIS_CMD_DENYOOM,NULL,1,1,1},
{"hincrby",hincrbyCommand,4,REDIS_CMD_INLINE|REDIS_CMD_DENYOOM,NULL,1,1,1},
{"hget",hgetCommand,3,REDIS_CMD_BULK,NULL,1,1,1},
{"hdel",hdelCommand,3,REDIS_CMD_BULK,NULL,1,1,1},
...
...
@@ -6004,6 +6006,70 @@ static void hsetCommand(redisClient *c) {
addReplySds(c,sdscatprintf(sdsempty(),":%d\r\n",update == 0));
}
static void hmsetCommand(redisClient *c) {
int i;
robj *o, *key, *val;
if ((c->argc % 2) == 1) {
addReplySds(c,sdsnew("-ERR wrong number of arguments for HMSET\r\n"));
return;
}
if ((o = lookupKeyWrite(c->db,c->argv[1])) == NULL) {
o = createHashObject();
dictAdd(c->db->dict,c->argv[1],o);
incrRefCount(c->argv[1]);
} else {
if (o->type != REDIS_HASH) {
addReply(c,shared.wrongtypeerr);
return;
}
}
/* We want to convert the zipmap into an hash table right now if the
* entry to be added is too big. */
if (o->encoding == REDIS_ENCODING_ZIPMAP) {
for (i = 2; i < c->argc; i+=2) {
if ((c->argv[i]->encoding == REDIS_ENCODING_RAW &&
sdslen(c->argv[i]->ptr) > server.hash_max_zipmap_value) ||
(c->argv[i+1]->encoding == REDIS_ENCODING_RAW &&
sdslen(c->argv[i+1]->ptr) > server.hash_max_zipmap_value)) {
convertToRealHash(o);
break;
}
}
}
if (o->encoding == REDIS_ENCODING_ZIPMAP) {
unsigned char *zm = o->ptr;
for (i = 2; i < c->argc; i+=2) {
key = getDecodedObject(c->argv[i]);
val = getDecodedObject(c->argv[i+1]);
zm = zipmapSet(zm,key->ptr,sdslen(key->ptr),
val->ptr,sdslen(val->ptr),NULL);
decrRefCount(key);
decrRefCount(val);
o->ptr = zm;
}
/* And here there is the second check for hash conversion. */
if (zipmapLen(zm) > server.hash_max_zipmap_entries)
convertToRealHash(o);
} else {
for (i = 2; i < c->argc; i+=2) {
key = tryObjectEncoding(c->argv[i]);
val = tryObjectEncoding(c->argv[i+1]);
if (dictReplace(o->ptr,key,val)) {
incrRefCount(key);
}
incrRefCount(val);
}
}
addReply(c, shared.ok);
}
static void hincrbyCommand(redisClient *c) {
long long value = 0, incr = 0;
robj *o = lookupKeyWrite(c->db,c->argv[1]);
...
...
redis.tcl
View file @
d33278d1
...
...
@@ -46,7 +46,7 @@ foreach redis_bulk_cmd {
# Flag commands requiring last argument as a bulk write operation
foreach redis_multibulk_cmd
{
mset msetnx hset
mset msetnx hset
hmset
}
{
set ::redis::multibulkarg
(
$redis
_multibulk_cmd
)
{}
}
...
...
test-redis.tcl
View file @
d33278d1
...
...
@@ -1614,6 +1614,13 @@ proc main {server port} {
set _ $err
}
{}
test
{
HGET against non existing key
}
{
set rv
{}
lappend rv
[
$r
hget smallhash __123123123__
]
lappend rv
[
$r
hget bighash __123123123__
]
set _ $rv
}
{{}
{}}
test
{
HSET in update and insert mode
}
{
set rv
{}
set k
[
lindex
[
array names smallhash *
]
0
]
...
...
@@ -1631,12 +1638,30 @@ proc main {server port} {
set _ $rv
}
{
0 newval1 1 0 newval2 1 1 1
}
test
{
HGET against non existing key
}
{
set rv
{}
lappend rv
[
$r
hget smallhash __123123123__
]
lappend rv
[
$r
hget bighash __123123123__
]
set _ $rv
}
{{}
{}}
test
{
HMSET wrong number of args
}
{
catch
{
$r
hmset smallhash key1 val1 key2
}
err
format $err
}
{
*wrong number*
}
test
{
HMSET - small hash
}
{
set args
{}
foreach
{
k v
}
[
array get smallhash
]
{
set newval
[
randstring 0 8 alpha
]
set smallhash
(
$k
)
$newval
lappend args $k $newval
}
$r hmset smallhash
{*}
$args
}
{
OK
}
test
{
HMSET - big hash
}
{
set args
{}
foreach
{
k v
}
[
array get bighash
]
{
set newval
[
randstring 0 8 alpha
]
set bighash
(
$k
)
$newval
lappend args $k $newval
}
$r hmset bighash
{*}
$args
}
{
OK
}
test
{
HKEYS - small hash
}
{
lsort
[
$r
hkeys smallhash
]
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment