/ Hex Artifact Content
Login

Artifact 5bad7ae8784a43d2b270d953060423b8bd480818:


0000: 2f 2a 0a 2a 2a 20 41 20 75 74 69 6c 69 74 79 20  /*.** A utility 
0010: 66 6f 72 20 70 72 69 6e 74 69 6e 67 20 61 6e 20  for printing an 
0020: 53 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20  SQLite database 
0030: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 23 69 6e 63  journal..*/.#inc
0040: 6c 75 64 65 20 3c 73 74 64 69 6f 2e 68 3e 0a 23  lude <stdio.h>.#
0050: 69 6e 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68  include <ctype.h
0060: 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c  >.#include <stdl
0070: 69 62 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c  ib.h>.#include <
0080: 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a 0a 2a 2a  string.h>../*.**
0090: 20 73 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   state informati
00a0: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  on.*/.static int
00b0: 20 70 61 67 65 53 69 7a 65 20 3d 20 31 30 32 34   pageSize = 1024
00c0: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 63  ;.static int sec
00d0: 74 6f 72 53 69 7a 65 20 3d 20 35 31 32 3b 0a 73  torSize = 512;.s
00e0: 74 61 74 69 63 20 46 49 4c 45 20 2a 64 62 20 3d  tatic FILE *db =
00f0: 20 30 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 66   0;.static int f
0100: 69 6c 65 53 69 7a 65 20 3d 20 30 3b 0a 73 74 61  ileSize = 0;.sta
0110: 74 69 63 20 75 6e 73 69 67 6e 65 64 20 63 6b 73  tic unsigned cks
0120: 75 6d 4e 6f 6e 63 65 20 3d 20 30 3b 0a 0a 2f 2a  umNonce = 0;../*
0130: 20 52 65 70 6f 72 74 20 61 20 6d 65 6d 6f 72 79   Report a memory
0140: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
0150: 72 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  r */.static void
0160: 20 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 76   out_of_memory(v
0170: 6f 69 64 29 7b 0a 20 20 66 70 72 69 6e 74 66 28  oid){.  fprintf(
0180: 73 74 64 65 72 72 2c 22 4f 75 74 20 6f 66 20 6d  stderr,"Out of m
0190: 65 6d 6f 72 79 2e 2e 2e 5c 6e 22 29 3b 0a 20 20  emory...\n");.  
01a0: 65 78 69 74 28 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  exit(1);.}../*.*
01b0: 2a 20 52 65 61 64 20 4e 20 62 79 74 65 73 20 6f  * Read N bytes o
01c0: 66 20 6d 65 6d 6f 72 79 20 73 74 61 72 74 69 6e  f memory startin
01d0: 67 20 61 74 20 69 4f 66 73 74 20 69 6e 74 6f 20  g at iOfst into 
01e0: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 0a 2a  space obtained.*
01f0: 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2e  * from malloc().
0200: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
0210: 6e 65 64 20 63 68 61 72 20 2a 72 65 61 64 5f 63  ned char *read_c
0220: 6f 6e 74 65 6e 74 28 69 6e 74 20 4e 2c 20 69 6e  ontent(int N, in
0230: 74 20 69 4f 66 73 74 29 7b 0a 20 20 69 6e 74 20  t iOfst){.  int 
0240: 67 6f 74 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  got;.  unsigned 
0250: 63 68 61 72 20 2a 70 42 75 66 20 3d 20 6d 61 6c  char *pBuf = mal
0260: 6c 6f 63 28 4e 29 3b 0a 20 20 69 66 28 20 70 42  loc(N);.  if( pB
0270: 75 66 3d 3d 30 20 29 20 6f 75 74 5f 6f 66 5f 6d  uf==0 ) out_of_m
0280: 65 6d 6f 72 79 28 29 3b 0a 20 20 66 73 65 65 6b  emory();.  fseek
0290: 28 64 62 2c 20 69 4f 66 73 74 2c 20 53 45 45 4b  (db, iOfst, SEEK
02a0: 5f 53 45 54 29 3b 0a 20 20 67 6f 74 20 3d 20 28  _SET);.  got = (
02b0: 69 6e 74 29 66 72 65 61 64 28 70 42 75 66 2c 20  int)fread(pBuf, 
02c0: 31 2c 20 4e 2c 20 64 62 29 3b 0a 20 20 69 66 28  1, N, db);.  if(
02d0: 20 67 6f 74 3c 30 20 29 7b 0a 20 20 20 20 66 70   got<0 ){.    fp
02e0: 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 49  rintf(stderr, "I
02f0: 2f 4f 20 65 72 72 6f 72 20 72 65 61 64 69 6e 67  /O error reading
0300: 20 25 64 20 62 79 74 65 73 20 66 72 6f 6d 20 25   %d bytes from %
0310: 64 5c 6e 22 2c 20 4e 2c 20 69 4f 66 73 74 29 3b  d\n", N, iOfst);
0320: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 42 75 66  .    memset(pBuf
0330: 2c 20 30 2c 20 4e 29 3b 0a 20 20 7d 65 6c 73 65  , 0, N);.  }else
0340: 20 69 66 28 20 67 6f 74 3c 4e 20 29 7b 0a 20 20   if( got<N ){.  
0350: 20 20 66 70 72 69 6e 74 66 28 73 74 64 65 72 72    fprintf(stderr
0360: 2c 20 22 53 68 6f 72 74 20 72 65 61 64 3a 20 67  , "Short read: g
0370: 6f 74 20 6f 6e 6c 79 20 25 64 20 6f 66 20 25 64  ot only %d of %d
0380: 20 62 79 74 65 73 20 66 72 6f 6d 20 25 64 5c 6e   bytes from %d\n
0390: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
03a0: 20 20 20 20 20 20 20 20 67 6f 74 2c 20 4e 2c 20          got, N, 
03b0: 69 4f 66 73 74 29 3b 0a 20 20 20 20 6d 65 6d 73  iOfst);.    mems
03c0: 65 74 28 26 70 42 75 66 5b 67 6f 74 5d 2c 20 30  et(&pBuf[got], 0
03d0: 2c 20 4e 2d 67 6f 74 29 3b 0a 20 20 7d 0a 20 20  , N-got);.  }.  
03e0: 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a  return pBuf;.}..
03f0: 2f 2a 20 50 72 69 6e 74 20 61 20 6c 69 6e 65 20  /* Print a line 
0400: 6f 66 20 64 65 63 6f 64 65 20 6f 75 74 70 75 74  of decode output
0410: 20 73 68 6f 77 69 6e 67 20 61 20 34 2d 62 79 74   showing a 4-byt
0420: 65 20 69 6e 74 65 67 65 72 2e 0a 2a 2f 0a 73 74  e integer..*/.st
0430: 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 70 72  atic unsigned pr
0440: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
0450: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
0460: 64 20 63 68 61 72 20 2a 61 44 61 74 61 2c 20 20  d char *aData,  
0470: 2f 2a 20 43 6f 6e 74 65 6e 74 20 62 65 69 6e 67  /* Content being
0480: 20 64 65 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e   decoded */.  in
0490: 74 20 6f 66 73 74 2c 20 69 6e 74 20 6e 42 79 74  t ofst, int nByt
04a0: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74  e,         /* St
04b0: 61 72 74 20 61 6e 64 20 73 69 7a 65 20 6f 66 20  art and size of 
04c0: 64 65 63 6f 64 65 20 2a 2f 0a 20 20 63 6f 6e 73  decode */.  cons
04d0: 74 20 63 68 61 72 20 2a 7a 4d 73 67 20 20 20 20  t char *zMsg    
04e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 65 73 73           /* Mess
04f0: 61 67 65 20 74 6f 20 61 70 70 65 6e 64 20 2a 2f  age to append */
0500: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  .){.  int i, j;.
0510: 20 20 75 6e 73 69 67 6e 65 64 20 76 61 6c 20 3d    unsigned val =
0520: 20 61 44 61 74 61 5b 6f 66 73 74 5d 3b 0a 20 20   aData[ofst];.  
0530: 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a  char zBuf[100];.
0540: 20 20 73 70 72 69 6e 74 66 28 7a 42 75 66 2c 20    sprintf(zBuf, 
0550: 22 20 25 30 35 78 3a 20 25 30 32 78 22 2c 20 6f  " %05x: %02x", o
0560: 66 73 74 2c 20 61 44 61 74 61 5b 6f 66 73 74 5d  fst, aData[ofst]
0570: 29 3b 0a 20 20 69 20 3d 20 28 69 6e 74 29 73 74  );.  i = (int)st
0580: 72 6c 65 6e 28 7a 42 75 66 29 3b 0a 20 20 66 6f  rlen(zBuf);.  fo
0590: 72 28 6a 3d 31 3b 20 6a 3c 34 3b 20 6a 2b 2b 29  r(j=1; j<4; j++)
05a0: 7b 0a 20 20 20 20 69 66 28 20 6a 3e 3d 6e 42 79  {.    if( j>=nBy
05b0: 74 65 20 29 7b 0a 20 20 20 20 20 20 73 70 72 69  te ){.      spri
05c0: 6e 74 66 28 26 7a 42 75 66 5b 69 5d 2c 20 22 20  ntf(&zBuf[i], " 
05d0: 20 20 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b    ");.    }else{
05e0: 0a 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 26  .      sprintf(&
05f0: 7a 42 75 66 5b 69 5d 2c 20 22 20 25 30 32 78 22  zBuf[i], " %02x"
0600: 2c 20 61 44 61 74 61 5b 6f 66 73 74 2b 6a 5d 29  , aData[ofst+j])
0610: 3b 0a 20 20 20 20 20 20 76 61 6c 20 3d 20 76 61  ;.      val = va
0620: 6c 2a 32 35 36 20 2b 20 61 44 61 74 61 5b 6f 66  l*256 + aData[of
0630: 73 74 2b 6a 5d 3b 0a 20 20 20 20 7d 0a 20 20 20  st+j];.    }.   
0640: 20 69 20 2b 3d 20 28 69 6e 74 29 73 74 72 6c 65   i += (int)strle
0650: 6e 28 26 7a 42 75 66 5b 69 5d 29 3b 0a 20 20 7d  n(&zBuf[i]);.  }
0660: 0a 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66  .  sprintf(&zBuf
0670: 5b 69 5d 2c 20 22 20 20 20 25 31 30 75 22 2c 20  [i], "   %10u", 
0680: 76 61 6c 29 3b 0a 20 20 70 72 69 6e 74 66 28 22  val);.  printf("
0690: 25 73 20 20 25 73 5c 6e 22 2c 20 7a 42 75 66 2c  %s  %s\n", zBuf,
06a0: 20 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72 6e   zMsg);.  return
06b0: 20 76 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   val;.}../*.** R
06c0: 65 61 64 20 61 6e 64 20 70 72 69 6e 74 20 61 20  ead and print a 
06d0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
06e0: 20 53 74 6f 72 65 20 6b 65 79 20 69 6e 66 6f 72   Store key infor
06f0: 6d 61 74 69 6f 6e 20 28 70 61 67 65 20 73 69 7a  mation (page siz
0700: 65 2c 20 65 74 63 29 0a 2a 2a 20 69 6e 20 67 6c  e, etc).** in gl
0710: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 2e 0a  obal variables..
0720: 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67 6e  */.static unsign
0730: 65 64 20 64 65 63 6f 64 65 5f 6a 6f 75 72 6e 61  ed decode_journa
0740: 6c 5f 68 65 61 64 65 72 28 69 6e 74 20 69 4f 66  l_header(int iOf
0750: 73 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  st){.  unsigned 
0760: 63 68 61 72 20 2a 70 48 64 72 20 3d 20 72 65 61  char *pHdr = rea
0770: 64 5f 63 6f 6e 74 65 6e 74 28 36 34 2c 20 69 4f  d_content(64, iO
0780: 66 73 74 29 3b 0a 20 20 75 6e 73 69 67 6e 65 64  fst);.  unsigned
0790: 20 6e 50 61 67 65 3b 0a 20 20 70 72 69 6e 74 66   nPage;.  printf
07a0: 28 22 48 65 61 64 65 72 20 61 74 20 6f 66 66 73  ("Header at offs
07b0: 65 74 20 25 64 3a 5c 6e 22 2c 20 69 4f 66 73 74  et %d:\n", iOfst
07c0: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
07d0: 65 5f 6c 69 6e 65 28 70 48 64 72 2c 20 30 2c 20  e_line(pHdr, 0, 
07e0: 34 2c 20 22 48 65 61 64 65 72 20 70 61 72 74 20  4, "Header part 
07f0: 31 20 28 33 36 35 34 36 31 36 35 36 39 29 22 29  1 (3654616569)")
0800: 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64 65  ;.  print_decode
0810: 5f 6c 69 6e 65 28 70 48 64 72 2c 20 34 2c 20 34  _line(pHdr, 4, 4
0820: 2c 20 22 48 65 61 64 65 72 20 70 61 72 74 20 32  , "Header part 2
0830: 20 28 35 34 37 34 34 37 37 36 37 29 22 29 3b 0a   (547447767)");.
0840: 20 20 6e 50 61 67 65 20 3d 0a 20 20 70 72 69 6e    nPage =.  prin
0850: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 70 48  t_decode_line(pH
0860: 64 72 2c 20 38 2c 20 34 2c 20 22 70 61 67 65 20  dr, 8, 4, "page 
0870: 63 6f 75 6e 74 22 29 3b 0a 20 20 63 6b 73 75 6d  count");.  cksum
0880: 4e 6f 6e 63 65 20 3d 0a 20 20 70 72 69 6e 74 5f  Nonce =.  print_
0890: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 70 48 64 72  decode_line(pHdr
08a0: 2c 20 31 32 2c 20 34 2c 20 22 63 68 6b 73 75 6d  , 12, 4, "chksum
08b0: 20 6e 6f 6e 63 65 22 29 3b 0a 20 20 70 72 69 6e   nonce");.  prin
08c0: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 70 48  t_decode_line(pH
08d0: 64 72 2c 20 31 36 2c 20 34 2c 20 22 69 6e 69 74  dr, 16, 4, "init
08e0: 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a  ial database siz
08f0: 65 20 69 6e 20 70 61 67 65 73 22 29 3b 0a 20 20  e in pages");.  
0900: 73 65 63 74 6f 72 53 69 7a 65 20 3d 0a 20 20 70  sectorSize =.  p
0910: 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65  rint_decode_line
0920: 28 70 48 64 72 2c 20 32 30 2c 20 34 2c 20 22 73  (pHdr, 20, 4, "s
0930: 65 63 74 6f 72 20 73 69 7a 65 22 29 3b 0a 20 20  ector size");.  
0940: 70 61 67 65 53 69 7a 65 20 3d 0a 20 20 70 72 69  pageSize =.  pri
0950: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 70  nt_decode_line(p
0960: 48 64 72 2c 20 32 34 2c 20 34 2c 20 22 70 61 67  Hdr, 24, 4, "pag
0970: 65 20 73 69 7a 65 22 29 3b 0a 20 20 70 72 69 6e  e size");.  prin
0980: 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 70 48  t_decode_line(pH
0990: 64 72 2c 20 32 38 2c 20 34 2c 20 22 7a 65 72 6f  dr, 28, 4, "zero
09a0: 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  ");.  print_deco
09b0: 64 65 5f 6c 69 6e 65 28 70 48 64 72 2c 20 33 32  de_line(pHdr, 32
09c0: 2c 20 34 2c 20 22 7a 65 72 6f 22 29 3b 0a 20 20  , 4, "zero");.  
09d0: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
09e0: 65 28 70 48 64 72 2c 20 33 36 2c 20 34 2c 20 22  e(pHdr, 36, 4, "
09f0: 7a 65 72 6f 22 29 3b 0a 20 20 70 72 69 6e 74 5f  zero");.  print_
0a00: 64 65 63 6f 64 65 5f 6c 69 6e 65 28 70 48 64 72  decode_line(pHdr
0a10: 2c 20 34 30 2c 20 34 2c 20 22 7a 65 72 6f 22 29  , 40, 4, "zero")
0a20: 3b 0a 20 20 66 72 65 65 28 70 48 64 72 29 3b 0a  ;.  free(pHdr);.
0a30: 20 20 72 65 74 75 72 6e 20 6e 50 61 67 65 3b 0a    return nPage;.
0a40: 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  }..static void p
0a50: 72 69 6e 74 5f 70 61 67 65 28 69 6e 74 20 69 4f  rint_page(int iO
0a60: 66 73 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  fst){.  unsigned
0a70: 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20   char *aData;.  
0a80: 63 68 61 72 20 7a 54 69 74 6c 65 5b 35 30 5d 3b  char zTitle[50];
0a90: 0a 20 20 61 44 61 74 61 20 3d 20 72 65 61 64 5f  .  aData = read_
0aa0: 63 6f 6e 74 65 6e 74 28 70 61 67 65 53 69 7a 65  content(pageSize
0ab0: 2b 38 2c 20 69 4f 66 73 74 29 3b 0a 20 20 73 70  +8, iOfst);.  sp
0ac0: 72 69 6e 74 66 28 7a 54 69 74 6c 65 2c 20 22 70  rintf(zTitle, "p
0ad0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
0ae0: 61 67 65 20 61 74 20 6f 66 66 73 65 74 20 25 64  age at offset %d
0af0: 22 2c 20 69 4f 66 73 74 29 3b 0a 20 20 70 72 69  ", iOfst);.  pri
0b00: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 61  nt_decode_line(a
0b10: 44 61 74 61 2d 69 4f 66 73 74 2c 20 69 4f 66 73  Data-iOfst, iOfs
0b20: 74 2c 20 34 2c 20 7a 54 69 74 6c 65 29 3b 0a 20  t, 4, zTitle);. 
0b30: 20 66 72 65 65 28 61 44 61 74 61 29 3b 0a 7d 0a   free(aData);.}.
0b40: 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61 72  .int main(int ar
0b50: 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29  gc, char **argv)
0b60: 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 2c 20 63  {.  int nPage, c
0b70: 6e 74 3b 0a 20 20 69 6e 74 20 69 4f 66 73 74 3b  nt;.  int iOfst;
0b80: 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20 29  .  if( argc!=2 )
0b90: 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73 74  {.    fprintf(st
0ba0: 64 65 72 72 2c 22 55 73 61 67 65 3a 20 25 73 20  derr,"Usage: %s 
0bb0: 46 49 4c 45 4e 41 4d 45 5c 6e 22 2c 20 61 72 67  FILENAME\n", arg
0bc0: 76 5b 30 5d 29 3b 0a 20 20 20 20 65 78 69 74 28  v[0]);.    exit(
0bd0: 31 29 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 66  1);.  }.  db = f
0be0: 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 20 22 72  open(argv[1], "r
0bf0: 62 22 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d 30  b");.  if( db==0
0c00: 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28   ){.    fprintf(
0c10: 73 74 64 65 72 72 2c 22 25 73 3a 20 63 61 6e 27  stderr,"%s: can'
0c20: 74 20 6f 70 65 6e 20 25 73 5c 6e 22 2c 20 61 72  t open %s\n", ar
0c30: 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 29 3b  gv[0], argv[1]);
0c40: 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
0c50: 7d 0a 20 20 66 73 65 65 6b 28 64 62 2c 20 30 2c  }.  fseek(db, 0,
0c60: 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 66 69   SEEK_END);.  fi
0c70: 6c 65 53 69 7a 65 20 3d 20 66 74 65 6c 6c 28 64  leSize = ftell(d
0c80: 62 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 6a 6f  b);.  printf("jo
0c90: 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65 3a  urnal file size:
0ca0: 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 66 69   %d bytes\n", fi
0cb0: 6c 65 53 69 7a 65 29 3b 0a 20 20 66 73 65 65 6b  leSize);.  fseek
0cc0: 28 64 62 2c 20 30 2c 20 53 45 45 4b 5f 53 45 54  (db, 0, SEEK_SET
0cd0: 29 3b 0a 20 20 69 4f 66 73 74 20 3d 20 30 3b 0a  );.  iOfst = 0;.
0ce0: 20 20 77 68 69 6c 65 28 20 69 4f 66 73 74 3c 66    while( iOfst<f
0cf0: 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 63  ileSize ){.    c
0d00: 6e 74 20 3d 20 6e 50 61 67 65 20 3d 20 28 69 6e  nt = nPage = (in
0d10: 74 29 64 65 63 6f 64 65 5f 6a 6f 75 72 6e 61 6c  t)decode_journal
0d20: 5f 68 65 61 64 65 72 28 69 4f 66 73 74 29 3b 0a  _header(iOfst);.
0d30: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29      if( cnt==0 )
0d40: 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 28 66  {.      cnt = (f
0d50: 69 6c 65 53 69 7a 65 20 2d 20 73 65 63 74 6f 72  ileSize - sector
0d60: 53 69 7a 65 29 2f 28 70 61 67 65 53 69 7a 65 2b  Size)/(pageSize+
0d70: 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f  8);.    }.    iO
0d80: 66 73 74 20 2b 3d 20 73 65 63 74 6f 72 53 69 7a  fst += sectorSiz
0d90: 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63 6e  e;.    while( cn
0da0: 74 20 26 26 20 69 4f 66 73 74 3c 66 69 6c 65 53  t && iOfst<fileS
0db0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 72 69  ize ){.      pri
0dc0: 6e 74 5f 70 61 67 65 28 69 4f 66 73 74 29 3b 0a  nt_page(iOfst);.
0dd0: 20 20 20 20 20 20 69 4f 66 73 74 20 2b 3d 20 70        iOfst += p
0de0: 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 7d  ageSize+8;.    }
0df0: 0a 20 20 20 20 69 4f 66 73 74 20 3d 20 28 69 4f  .    iOfst = (iO
0e00: 66 73 74 2f 73 65 63 74 6f 72 53 69 7a 65 20 2b  fst/sectorSize +
0e10: 20 31 29 2a 73 65 63 74 6f 72 53 69 7a 65 3b 0a   1)*sectorSize;.
0e20: 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 64 62 29    }.  fclose(db)
0e30: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.