]>
git.saurik.com Git - redis.git/blob - redis-check-aof.c
3be60781db5aa1f94ab39807940d5007edc86cca
9 sprintf(__buf, __VA_ARGS__); \
10 sprintf(error, "0x%08lx: %s", epos, __buf); \
13 static char error
[1024];
16 int consumeNewline(char *buf
) {
17 if (strncmp(buf
,"\r\n",2) != 0) {
18 ERROR("Expected \\r\\n, got: %02x%02x",buf
[0],buf
[1]);
24 int readLong(FILE *fp
, char prefix
, long *target
) {
27 if (fgets(buf
,sizeof(buf
),fp
) == NULL
) {
30 if (buf
[0] != prefix
) {
31 ERROR("Expected prefix '%c', got: '%c'",buf
[0],prefix
);
34 *target
= strtol(buf
+1,&eptr
,10);
35 return consumeNewline(eptr
);
38 int readBytes(FILE *fp
, char *target
, long length
) {
41 real
= fread(target
,1,length
,fp
);
43 ERROR("Expected to read %ld bytes, got %ld bytes",length
,real
);
49 int readString(FILE *fp
, char** target
) {
52 if (!readLong(fp
,'$',&len
)) {
56 /* Increase length to also consume \r\n */
58 *target
= (char*)malloc(len
);
59 if (!readBytes(fp
,*target
,len
)) {
64 if (!consumeNewline(*target
+len
-2)) {
69 (*target
)[len
-2] = '\0';
73 int readArgc(FILE *fp
, long *target
) {
74 return readLong(fp
,'*',target
);
77 long process(FILE *fp
) {
83 if (!multi
) pos
= ftell(fp
);
84 if (!readArgc(fp
, &argc
)) {
88 for (i
= 0; i
< argc
; i
++) {
89 if (!readString(fp
,&str
)) {
93 if (strcasecmp(str
, "multi") == 0) {
95 ERROR("Unexpected MULTI");
98 } else if (strcasecmp(str
, "exec") == 0) {
100 ERROR("Unexpected EXEC");
108 /* Check if loop was finished */
115 if (feof(fp
) && multi
&& strlen(error
) == 0) {
116 ERROR("Reached EOF before reading EXEC for MULTI");
119 if (strlen(error
) > 0) {
120 printf("%s\n", error
);
126 int main(int argc
, char **argv
) {
127 /* expect the first argument to be the dump file */
129 printf("Usage: %s <file.aof>\n", argv
[0]);
133 FILE *fp
= fopen(argv
[1],"r");
135 printf("Cannot open file: %s\n", argv
[1]);
139 struct redis_stat sb
;
140 if (redis_fstat(fileno(fp
),&sb
) == -1) {
141 printf("Cannot stat file: %s\n", argv
[1]);
145 long size
= sb
.st_size
;
147 printf("Empty file: %s\n", argv
[1]);
151 long pos
= process(fp
);
153 printf("First invalid operation at offset %ld.\n", pos
);
156 printf("AOF is valid.\n");