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
a7866db6
Commit
a7866db6
authored
Oct 26, 2009
by
antirez
Browse files
double serialization routines implemented
parent
2161a965
Changes
2
Show whitespace changes
Inline
Side-by-side
Makefile
View file @
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
View file @
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;
...
...
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