Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
a7866db6
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,发现更多精彩内容 >>
提交
a7866db6
编写于
10月 26, 2009
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
double serialization routines implemented
上级
2161a965
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
59 addition
and
1 deletion
+59
-1
Makefile
Makefile
+2
-1
redis.c
redis.c
+57
-0
未找到文件。
Makefile
浏览文件 @
a7866db6
...
...
@@ -5,9 +5,10 @@
uname_S
:=
$(
shell
sh
-c
'uname -s 2>/dev/null || echo not'
)
ifeq
($(uname_S),SunOS)
CFLAGS
?=
-std
=
c99
-pedantic
-O2
-Wall
-W
-D__EXTENSIONS__
-D_XPG6
CCLINK
?=
-ldl
-lnsl
-lsocket
CCLINK
?=
-ldl
-lnsl
-lsocket
-lm
else
CFLAGS
?=
-std
=
c99
-pedantic
-O2
-Wall
-W
CCLINK
?=
-lm
endif
CCOPT
=
$(CFLAGS)
$(CCLINK)
$(ARCH)
DEBUG
?=
-g
-rdynamic
-ggdb
...
...
redis.c
浏览文件 @
a7866db6
...
...
@@ -57,6 +57,7 @@
#include <sys/time.h>
#include <sys/resource.h>
#include <limits.h>
#include <math.h>
#include "redis.h"
#include "ae.h"
/* Event driven programming library */
...
...
@@ -338,6 +339,12 @@ struct sharedObjectsStruct {
*
select5
,
*
select6
,
*
select7
,
*
select8
,
*
select9
;
}
shared
;
/* Global vars that are actally used as constants. The following double
* values are used for double on-disk serialization, and are initialized
* at runtime to avoid strange compiler optimizations. */
static
double
R_Zero
,
R_PosInf
,
R_NegInf
,
R_Nan
;
/*================================ Prototypes =============================== */
static
void
freeStringObject
(
robj
*
o
);
...
...
@@ -1021,6 +1028,12 @@ static void initServerConfig() {
server
.
masterport
=
6379
;
server
.
master
=
NULL
;
server
.
replstate
=
REDIS_REPL_NONE
;
/* Double constants initialization */
R_Zero
=
0
.
0
;
R_PosInf
=
1
.
0
/
R_Zero
;
R_NegInf
=
-
1
.
0
/
R_Zero
;
R_Nan
=
R_Zero
/
R_Zero
;
}
static
void
initServer
()
{
...
...
@@ -2238,6 +2251,33 @@ static int rdbSaveStringObject(FILE *fp, robj *obj) {
}
}
/* Save a double value. Doubles are saved as strings prefixed by an unsigned
* 8 bit integer specifing the length of the representation.
* This 8 bit integer has special values in order to specify the following
* conditions:
* 253: not a number
* 254: + inf
* 255: - inf
*/
static
int
rdbSaveDoubleValue
(
FILE
*
fp
,
double
val
)
{
unsigned
char
buf
[
128
];
int
len
;
if
(
isnan
(
val
))
{
buf
[
0
]
=
253
;
len
=
1
;
}
else
if
(
!
isfinite
(
val
))
{
len
=
1
;
buf
[
0
]
=
(
val
<
0
)
?
255
:
254
;
}
else
{
snprintf
((
char
*
)
buf
+
1
,
sizeof
(
buf
)
-
1
,
"%.16g"
,
val
);
buf
[
0
]
=
strlen
((
char
*
)
buf
);
len
=
buf
[
0
]
+
1
;
}
if
(
fwrite
(
buf
,
len
,
1
,
fp
)
==
0
)
return
-
1
;
return
0
;
}
/* Save the DB on disk. Return REDIS_ERR on error, REDIS_OK on success */
static
int
rdbSave
(
char
*
filename
)
{
dictIterator
*
di
=
NULL
;
...
...
@@ -2500,6 +2540,23 @@ static robj *rdbLoadStringObject(FILE*fp, int rdbver) {
return
tryObjectSharing
(
createObject
(
REDIS_STRING
,
val
));
}
/* For information about double serialization check rdbSaveDoubleValue() */
static
int
rdbLoadDoubleValue
(
FILE
*
fp
,
double
*
val
)
{
char
buf
[
128
];
unsigned
char
len
;
if
(
fread
(
&
len
,
1
,
1
,
fp
)
==
0
)
return
-
1
;
switch
(
len
)
{
case
255
:
*
val
=
R_NegInf
;
return
0
;
case
254
:
*
val
=
R_PosInf
;
return
0
;
case
253
:
*
val
=
R_Nan
;
return
0
;
default:
if
(
fread
(
buf
,
len
,
1
,
fp
)
==
0
)
return
-
1
;
sscanf
(
buf
,
"%lg"
,
val
);
return
0
;
}
}
static
int
rdbLoad
(
char
*
filename
)
{
FILE
*
fp
;
robj
*
keyobj
=
NULL
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录