Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
736b7c3f
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,发现更多精彩内容 >>
提交
736b7c3f
编写于
4月 09, 2012
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add checksum computation to rio.c
上级
88c1d955
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
43 addition
and
4 deletion
+43
-4
src/rdb.c
src/rdb.c
+2
-2
src/rio.c
src/rio.c
+10
-0
src/rio.h
src/rio.h
+31
-2
未找到文件。
src/rdb.c
浏览文件 @
736b7c3f
...
...
@@ -717,7 +717,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
size_t
len
;
unsigned
int
i
;
redisLog
(
REDIS_DEBUG
,
"LOADING OBJECT %d (at %d)
\n
"
,
rdbtype
,
rdb
->
t
ell
(
rdb
));
redisLog
(
REDIS_DEBUG
,
"LOADING OBJECT %d (at %d)
\n
"
,
rdbtype
,
rdb
T
ell
(
rdb
));
if
(
rdbtype
==
REDIS_RDB_TYPE_STRING
)
{
/* Read string value */
if
((
o
=
rdbLoadEncodedStringObject
(
rdb
))
==
NULL
)
return
NULL
;
...
...
@@ -1039,7 +1039,7 @@ int rdbLoad(char *filename) {
/* Serve the clients from time to time */
if
(
!
(
loops
++
%
1000
))
{
loadingProgress
(
rdb
.
t
ell
(
&
rdb
));
loadingProgress
(
rdb
T
ell
(
&
rdb
));
aeProcessEvents
(
server
.
el
,
AE_FILE_EVENTS
|
AE_DONT_WAIT
);
}
...
...
src/rio.c
浏览文件 @
736b7c3f
...
...
@@ -58,6 +58,8 @@ static const rio rioBufferIO = {
rioBufferRead
,
rioBufferWrite
,
rioBufferTell
,
NULL
,
/* update_checksum */
0
,
/* current checksum */
{
{
NULL
,
0
}
}
/* union for io-specific vars */
};
...
...
@@ -65,6 +67,8 @@ static const rio rioFileIO = {
rioFileRead
,
rioFileWrite
,
rioFileTell
,
NULL
,
/* update_checksum */
0
,
/* current checksum */
{
{
NULL
,
0
}
}
/* union for io-specific vars */
};
...
...
@@ -79,6 +83,12 @@ void rioInitWithBuffer(rio *r, sds s) {
r
->
io
.
buffer
.
pos
=
0
;
}
/* This function can be installed both in memory and file streams when checksum
* computation is needed. */
void
rioGenericUpdateChecksum
(
rio
*
r
,
const
void
*
buf
,
size_t
len
)
{
r
->
checksum
=
crc64
(
r
->
checksum
,
buf
,
len
);
}
/* ------------------------------ Higher level interface ---------------------------
* The following higher level functions use lower level rio.c functions to help
* generating the Redis protocol for the Append Only File. */
...
...
src/rio.h
浏览文件 @
736b7c3f
...
...
@@ -2,6 +2,7 @@
#define __REDIS_RIO_H
#include <stdio.h>
#include <stdint.h>
#include "sds.h"
struct
_rio
{
...
...
@@ -11,6 +12,14 @@ struct _rio {
size_t
(
*
read
)(
struct
_rio
*
,
void
*
buf
,
size_t
len
);
size_t
(
*
write
)(
struct
_rio
*
,
const
void
*
buf
,
size_t
len
);
off_t
(
*
tell
)(
struct
_rio
*
);
/* The update_cksum method if not NULL is used to compute the checksum of all the
* data that was read or written so far. The method should be designed so that
* can be called with the current checksum, and the buf and len fields pointing
* to the new block of data to add to the checksum computation. */
void
(
*
update_cksum
)(
struct
_rio
*
,
void
*
buf
,
size_t
len
);
/* The current checksum */
uint64_t
cksum
;
/* Backend-specific vars. */
union
{
...
...
@@ -26,8 +35,26 @@ struct _rio {
typedef
struct
_rio
rio
;
#define rioWrite(rio,buf,len) ((rio)->write((rio),(buf),(len)))
#define rioRead(rio,buf,len) ((rio)->read((rio),(buf),(len)))
/* The following functions are our interface with the stream. They'll call the
* actual implementation of read / write / tell, and will update the checksum
* if needed. */
inline
size_t
rioWrite
(
rio
*
r
,
const
void
*
buf
,
size_t
len
)
{
if
(
r
->
udpate_cksum
)
r
->
update_cksum
(
r
,
buf
,
len
);
return
r
->
write
(
r
,
buf
,
len
);
}
inline
size_t
rioRead
(
rio
*
r
,
void
*
buf
,
size_t
len
)
{
if
(
r
->
read
(
r
,
buf
,
len
)
==
1
)
{
if
(
r
->
udpate_cksum
)
r
->
update_cksum
(
r
,
buf
,
len
);
return
1
;
}
return
0
;
}
inline
off_t
rioTell
(
rio
*
r
)
{
return
r
->
tell
(
r
);
}
void
rioInitWithFile
(
rio
*
r
,
FILE
*
fp
);
void
rioInitWithBuffer
(
rio
*
r
,
sds
s
);
...
...
@@ -37,4 +64,6 @@ size_t rioWriteBulkString(rio *r, const char *buf, size_t len);
size_t
rioWriteBulkLongLong
(
rio
*
r
,
long
long
l
);
size_t
rioWriteBulkDouble
(
rio
*
r
,
double
d
);
void
rioGenericUpdateChecksum
(
rio
*
r
,
const
void
*
buf
,
size_t
len
);
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录