mirror of
https://github.com/fluencelabs/redis
synced 2025-03-19 17:10:50 +00:00
code to compare strings with entries in ziplist, regardless of their encoding
This commit is contained in:
parent
75d8978e7a
commit
c09c2c3b04
48
ziplist.c
48
ziplist.c
@ -365,6 +365,28 @@ unsigned char *ziplistDelete(unsigned char *zl, unsigned char **p) {
|
||||
return zl;
|
||||
}
|
||||
|
||||
/* Compare entry pointer to by 'p' with 'entry'. Return 1 if equal. */
|
||||
unsigned int ziplistCompare(unsigned char *p, unsigned char *entry, unsigned int elen) {
|
||||
unsigned int zlen, lensize;
|
||||
char encoding;
|
||||
long long zval, eval;
|
||||
if (*p == ZIP_END) return 0;
|
||||
|
||||
zlen = zipDecodeLength(p,&lensize);
|
||||
if (zipTryEncoding(entry,&eval,&encoding)) {
|
||||
/* Do integer compare */
|
||||
zval = zipLoadInteger(p+lensize,ZIP_ENCODING(p));
|
||||
return zval == eval;
|
||||
} else {
|
||||
/* Raw compare */
|
||||
if (zlen == elen) {
|
||||
return memcmp(p+lensize,entry,elen) == 0;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void ziplistRepr(unsigned char *zl) {
|
||||
unsigned char *p, encoding;
|
||||
unsigned int l, lsize;
|
||||
@ -557,7 +579,31 @@ int main(int argc, char **argv) {
|
||||
}
|
||||
printf("\n");
|
||||
ziplistRepr(zl);
|
||||
printf("\n");
|
||||
}
|
||||
|
||||
printf("Compare strings with ziplist entries:\n");
|
||||
{
|
||||
zl = createList();
|
||||
p = ziplistIndex(zl, 0);
|
||||
if (!ziplistCompare(p,"hello",5)) {
|
||||
printf("ERROR\n");
|
||||
return;
|
||||
}
|
||||
if (ziplistCompare(p,"hella",5)) {
|
||||
printf("ERROR\n");
|
||||
return;
|
||||
}
|
||||
|
||||
p = ziplistIndex(zl, 3);
|
||||
if (!ziplistCompare(p,"1024",4)) {
|
||||
printf("ERROR\n");
|
||||
return;
|
||||
}
|
||||
if (ziplistCompare(p,"1025",4)) {
|
||||
printf("ERROR\n");
|
||||
return;
|
||||
}
|
||||
printf("SUCCESS\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user