]>
git.saurik.com Git - redis.git/blob - redis-check-aof.c
53472032110d9fd0b6041988e772dbb0bfcb38d9
10 sprintf(__buf, __VA_ARGS__); \
11 sprintf(error, "0x%08lx: %s", epos, __buf); \
14 static char error
[1024];
17 int consumeNewline(char *buf
) {
18 if (strncmp(buf
,"\r\n",2) != 0) {
19 ERROR("Expected \\r\\n, got: %02x%02x",buf
[0],buf
[1]);
25 int readLong(FILE *fp
, char prefix
, long *target
) {
28 if (fgets(buf
,sizeof(buf
),fp
) == NULL
) {
31 if (buf
[0] != prefix
) {
32 ERROR("Expected prefix '%c', got: '%c'",buf
[0],prefix
);
35 *target
= strtol(buf
+1,&eptr
,10);
36 return consumeNewline(eptr
);
39 int readBytes(FILE *fp
, char *target
, long length
) {
42 real
= fread(target
,1,length
,fp
);
44 ERROR("Expected to read %ld bytes, got %ld bytes",length
,real
);
50 int readString(FILE *fp
, char** target
) {
53 if (!readLong(fp
,'$',&len
)) {
57 /* Increase length to also consume \r\n */
59 *target
= (char*)malloc(len
);
60 if (!readBytes(fp
,*target
,len
)) {
65 if (!consumeNewline(*target
+len
-2)) {
70 (*target
)[len
-2] = '\0';
74 int readArgc(FILE *fp
, long *target
) {
75 return readLong(fp
,'*',target
);
78 long process(FILE *fp
) {
84 if (!multi
) pos
= ftell(fp
);
85 if (!readArgc(fp
, &argc
)) {
89 for (i
= 0; i
< argc
; i
++) {
90 if (!readString(fp
,&str
)) {
94 if (strcasecmp(str
, "multi") == 0) {
96 ERROR("Unexpected MULTI");
99 } else if (strcasecmp(str
, "exec") == 0) {
101 ERROR("Unexpected EXEC");
109 /* Check if loop was finished */
116 if (feof(fp
) && multi
&& strlen(error
) == 0) {
117 ERROR("Reached EOF before reading EXEC for MULTI");
120 if (strlen(error
) > 0) {
121 printf("%s\n", error
);
127 int main(int argc
, char **argv
) {
132 printf("Usage: %s [--fix] <file.aof>\n", argv
[0]);
134 } else if (argc
== 2) {
136 } else if (argc
== 3) {
137 if (strcmp(argv
[1],"--fix") != 0) {
138 printf("Invalid argument: %s\n", argv
[1]);
144 printf("Invalid arguments\n");
148 FILE *fp
= fopen(filename
,"r+");
150 printf("Cannot open file: %s\n", filename
);
154 struct redis_stat sb
;
155 if (redis_fstat(fileno(fp
),&sb
) == -1) {
156 printf("Cannot stat file: %s\n", filename
);
160 long size
= sb
.st_size
;
162 printf("Empty file: %s\n", filename
);
166 long pos
= process(fp
);
169 if (ftruncate(fileno(fp
), pos
) == -1) {
170 printf("Could not truncate AOF to size %ld\n", pos
);
173 printf("AOF succesfully truncated to %ld bytes\n", pos
);
176 printf("First invalid operation at offset %ld\n", pos
);
179 printf("AOF is valid\n");