Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
a5456b2c
R
redis
项目概览
xindoo
/
redis
通知
2
Star
2
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
a5456b2c
编写于
5月 29, 2010
作者:
P
Pieter Noordhuis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
use a struct to retrieve all details for an entry
上级
dcb9cf4e
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
41 addition
and
32 deletion
+41
-32
ziplist.c
ziplist.c
+41
-32
未找到文件。
ziplist.c
浏览文件 @
a5456b2c
...
...
@@ -51,6 +51,13 @@
#define ZIPLIST_INCR_LENGTH(zl,incr) { \
if (ZIPLIST_LENGTH(zl) < ZIP_BIGLEN) ZIPLIST_LENGTH(zl)+=incr; }
typedef
struct
zlentry
{
unsigned
int
prevrawlensize
,
prevrawlen
;
unsigned
int
lensize
,
len
;
unsigned
int
headersize
;
unsigned
char
encoding
;
}
zlentry
;
/* Return bytes needed to store integer encoded by 'encoding' */
static
unsigned
int
zipEncodingSize
(
char
encoding
)
{
if
(
encoding
==
ZIP_ENC_SHORT
)
{
...
...
@@ -192,6 +199,16 @@ static long long zipLoadInteger(unsigned char *p, char encoding) {
return
ret
;
}
/* Return a struct with all information about an entry. */
static
zlentry
zipEntry
(
unsigned
char
*
p
)
{
zlentry
e
;
e
.
prevrawlen
=
zipDecodeLength
(
p
,
&
e
.
prevrawlensize
);
e
.
len
=
zipDecodeLength
(
p
+
e
.
prevrawlensize
,
&
e
.
lensize
);
e
.
headersize
=
e
.
prevrawlensize
+
e
.
lensize
;
e
.
encoding
=
ZIP_ENCODING
(
p
+
e
.
prevrawlensize
);
return
e
;
}
/* Return the total amount used by an entry (encoded length + payload). */
static
unsigned
int
zipRawEntryLength
(
unsigned
char
*
p
)
{
unsigned
int
prevlensize
,
lensize
,
len
;
...
...
@@ -297,9 +314,8 @@ unsigned char *ziplistPush(unsigned char *zl, unsigned char *entry, unsigned int
unsigned
char
*
ziplistPop
(
unsigned
char
*
zl
,
sds
*
target
,
int
where
)
{
unsigned
int
curlen
=
ZIPLIST_BYTES
(
zl
),
rawlen
;
unsigned
int
prevrawlensize
,
prevrawlen
,
lensize
,
len
,
headerlen
;
zlentry
entry
;
int
nextdiff
=
0
;
unsigned
char
encoding
;
unsigned
char
*
p
;
long
long
value
;
if
(
target
)
*
target
=
NULL
;
...
...
@@ -308,16 +324,13 @@ unsigned char *ziplistPop(unsigned char *zl, sds *target, int where) {
p
=
(
where
==
ZIPLIST_HEAD
)
?
ziplistHead
(
zl
)
:
ziplistTail
(
zl
);
if
(
*
p
==
ZIP_END
)
return
zl
;
prevrawlen
=
zipDecodeLength
(
p
,
&
prevrawlensize
);
len
=
zipDecodeLength
(
p
+
prevrawlensize
,
&
lensize
);
headerlen
=
prevrawlensize
+
lensize
;
rawlen
=
headerlen
+
len
;
entry
=
zipEntry
(
p
);
rawlen
=
entry
.
headersize
+
entry
.
len
;
if
(
target
)
{
encoding
=
ZIP_ENCODING
(
p
+
prevrawlensize
);
if
(
encoding
==
ZIP_ENC_RAW
)
{
*
target
=
sdsnewlen
(
p
+
headerlen
,
len
);
if
(
entry
.
encoding
==
ZIP_ENC_RAW
)
{
*
target
=
sdsnewlen
(
p
+
entry
.
headersize
,
entry
.
len
);
}
else
{
value
=
zipLoadInteger
(
p
+
headerlen
,
encoding
);
value
=
zipLoadInteger
(
p
+
entry
.
headersize
,
entry
.
encoding
);
*
target
=
sdscatprintf
(
sdsempty
(),
"%lld"
,
value
);
}
}
...
...
@@ -342,7 +355,7 @@ unsigned char *ziplistPop(unsigned char *zl, sds *target, int where) {
ZIPLIST_TAIL_OFFSET
(
zl
)
-=
rawlen
+
nextdiff
;
}
else
{
/* Subtract the length of the previous element from the tail offset. */
ZIPLIST_TAIL_OFFSET
(
zl
)
-=
prevrawlen
;
ZIPLIST_TAIL_OFFSET
(
zl
)
-=
entry
.
prevrawlen
;
}
/* Resize and update length */
...
...
@@ -372,21 +385,19 @@ unsigned char *ziplistNext(unsigned char *p) {
* to find out whether the string pointer or the integer value was set.
* Return 0 if 'p' points to the end of the zipmap, 1 otherwise. */
unsigned
int
ziplistGet
(
unsigned
char
*
p
,
unsigned
char
**
e
,
unsigned
int
*
elen
,
long
long
*
v
)
{
unsigned
int
prevrawlensize
,
lensize
,
len
,
headerlen
;
zlentry
entry
;
if
(
*
p
==
ZIP_END
)
return
0
;
if
(
e
)
*
e
=
NULL
;
zipDecodeLength
(
p
,
&
prevrawlensize
);
len
=
zipDecodeLength
(
p
+
prevrawlensize
,
&
lensize
);
headerlen
=
prevrawlensize
+
lensize
;
if
(
ZIP_ENCODING
(
p
+
prevrawlensize
)
==
ZIP_ENC_RAW
)
{
entry
=
zipEntry
(
p
);
if
(
entry
.
encoding
==
ZIP_ENC_RAW
)
{
if
(
e
)
{
*
elen
=
len
;
*
e
=
p
+
headerlen
;
*
elen
=
entry
.
len
;
*
e
=
p
+
entry
.
headersize
;
}
}
else
{
if
(
v
)
{
*
v
=
zipLoadInteger
(
p
+
headerlen
,
ZIP_ENCODING
(
p
+
prevrawlensize
)
);
*
v
=
zipLoadInteger
(
p
+
entry
.
headersize
,
entry
.
encoding
);
}
}
return
1
;
...
...
@@ -435,27 +446,25 @@ unsigned char *ziplistDelete(unsigned char *zl, unsigned char **p) {
}
/* Compare entry pointer to by 'p' with 'entry'. Return 1 if equal. */
unsigned
int
ziplistCompare
(
unsigned
char
*
p
,
unsigned
char
*
entry
,
unsigned
int
e
len
)
{
unsigned
int
prevrawlensize
,
lensize
,
len
,
headerlen
;
char
encoding
;
long
long
val
,
e
val
;
unsigned
int
ziplistCompare
(
unsigned
char
*
p
,
unsigned
char
*
s
,
unsigned
int
s
len
)
{
zlentry
entry
;
unsigned
char
s
encoding
;
long
long
val
,
s
val
;
if
(
*
p
==
ZIP_END
)
return
0
;
zipDecodeLength
(
p
,
&
prevrawlensize
);
len
=
zipDecodeLength
(
p
+
prevrawlensize
,
&
lensize
);
headerlen
=
prevrawlensize
+
lensize
;
if
(
ZIP_ENCODING
(
p
+
prevrawlensize
)
==
ZIP_ENC_RAW
)
{
entry
=
zipEntry
(
p
);
if
(
entry
.
encoding
==
ZIP_ENC_RAW
)
{
/* Raw compare */
if
(
len
==
e
len
)
{
return
memcmp
(
p
+
headerlen
,
entry
,
e
len
)
==
0
;
if
(
entry
.
len
==
s
len
)
{
return
memcmp
(
p
+
entry
.
headersize
,
s
,
s
len
)
==
0
;
}
else
{
return
0
;
}
}
else
{
if
(
zipTryEncoding
(
entry
,
&
eval
,
&
encoding
))
{
if
(
zipTryEncoding
(
s
,
&
sval
,
&
s
encoding
))
{
/* Do integer compare */
val
=
zipLoadInteger
(
p
+
headerlen
,
ZIP_ENCODING
(
p
+
prevrawlensize
)
);
return
val
==
e
val
;
val
=
zipLoadInteger
(
p
+
entry
.
headersize
,
entry
.
encoding
);
return
val
==
s
val
;
}
else
{
/* Ziplist entry is integer encoded, but given entry is not. */
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录