]>
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");