/ Hex Artifact Content
Login

Artifact 053eb1cc774710c6890b7dd6293300cc297b16a5:


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 66  _SET);.  got = f
02b0: 72 65 61 64 28 70 42 75 66 2c 20 31 2c 20 4e 2c  read(pBuf, 1, N,
02c0: 20 64 62 29 3b 0a 20 20 69 66 28 20 67 6f 74 3c   db);.  if( got<
02d0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
02e0: 28 73 74 64 65 72 72 2c 20 22 49 2f 4f 20 65 72  (stderr, "I/O er
02f0: 72 6f 72 20 72 65 61 64 69 6e 67 20 25 64 20 62  ror reading %d b
0300: 79 74 65 73 20 66 72 6f 6d 20 25 64 5c 6e 22 2c  ytes from %d\n",
0310: 20 4e 2c 20 69 4f 66 73 74 29 3b 0a 20 20 20 20   N, iOfst);.    
0320: 6d 65 6d 73 65 74 28 70 42 75 66 2c 20 30 2c 20  memset(pBuf, 0, 
0330: 4e 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  N);.  }else if( 
0340: 67 6f 74 3c 4e 20 29 7b 0a 20 20 20 20 66 70 72  got<N ){.    fpr
0350: 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 68  intf(stderr, "Sh
0360: 6f 72 74 20 72 65 61 64 3a 20 67 6f 74 20 6f 6e  ort read: got on
0370: 6c 79 20 25 64 20 6f 66 20 25 64 20 62 79 74 65  ly %d of %d byte
0380: 73 20 66 72 6f 6d 20 25 64 5c 6e 22 2c 0a 20 20  s from %d\n",.  
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03a0: 20 20 20 67 6f 74 2c 20 4e 2c 20 69 4f 66 73 74     got, N, iOfst
03b0: 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 70  );.    memset(&p
03c0: 42 75 66 5b 67 6f 74 5d 2c 20 30 2c 20 4e 2d 67  Buf[got], 0, N-g
03d0: 6f 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ot);.  }.  retur
03e0: 6e 20 70 42 75 66 3b 0a 7d 0a 0a 2f 2a 20 50 72  n pBuf;.}../* Pr
03f0: 69 6e 74 20 61 20 6c 69 6e 65 20 6f 66 20 64 65  int a line of de
0400: 63 6f 64 65 20 6f 75 74 70 75 74 20 73 68 6f 77  code output show
0410: 69 6e 67 20 61 20 34 2d 62 79 74 65 20 69 6e 74  ing a 4-byte int
0420: 65 67 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eger..*/.static 
0430: 75 6e 73 69 67 6e 65 64 20 70 72 69 6e 74 5f 64  unsigned print_d
0440: 65 63 6f 64 65 5f 6c 69 6e 65 28 0a 20 20 63 6f  ecode_line(.  co
0450: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
0460: 72 20 2a 61 44 61 74 61 2c 20 20 2f 2a 20 43 6f  r *aData,  /* Co
0470: 6e 74 65 6e 74 20 62 65 69 6e 67 20 64 65 63 6f  ntent being deco
0480: 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 66 73  ded */.  int ofs
0490: 74 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 20 20  t, int nByte,   
04a0: 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 20 61        /* Start a
04b0: 6e 64 20 73 69 7a 65 20 6f 66 20 64 65 63 6f 64  nd size of decod
04c0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
04d0: 72 20 2a 7a 4d 73 67 20 20 20 20 20 20 20 20 20  r *zMsg         
04e0: 20 20 20 20 2f 2a 20 4d 65 73 73 61 67 65 20 74      /* Message t
04f0: 6f 20 61 70 70 65 6e 64 20 2a 2f 0a 29 7b 0a 20  o append */.){. 
0500: 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 75 6e 73   int i, j;.  uns
0510: 69 67 6e 65 64 20 76 61 6c 20 3d 20 61 44 61 74  igned val = aDat
0520: 61 5b 6f 66 73 74 5d 3b 0a 20 20 63 68 61 72 20  a[ofst];.  char 
0530: 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20 73 70 72  zBuf[100];.  spr
0540: 69 6e 74 66 28 7a 42 75 66 2c 20 22 20 25 30 35  intf(zBuf, " %05
0550: 78 3a 20 25 30 32 78 22 2c 20 6f 66 73 74 2c 20  x: %02x", ofst, 
0560: 61 44 61 74 61 5b 6f 66 73 74 5d 29 3b 0a 20 20  aData[ofst]);.  
0570: 69 20 3d 20 73 74 72 6c 65 6e 28 7a 42 75 66 29  i = strlen(zBuf)
0580: 3b 0a 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 34  ;.  for(j=1; j<4
0590: 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; j++){.    if( 
05a0: 6a 3e 3d 6e 42 79 74 65 20 29 7b 0a 20 20 20 20  j>=nByte ){.    
05b0: 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75 66 5b    sprintf(&zBuf[
05c0: 69 5d 2c 20 22 20 20 20 22 29 3b 0a 20 20 20 20  i], "   ");.    
05d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 70 72  }else{.      spr
05e0: 69 6e 74 66 28 26 7a 42 75 66 5b 69 5d 2c 20 22  intf(&zBuf[i], "
05f0: 20 25 30 32 78 22 2c 20 61 44 61 74 61 5b 6f 66   %02x", aData[of
0600: 73 74 2b 6a 5d 29 3b 0a 20 20 20 20 20 20 76 61  st+j]);.      va
0610: 6c 20 3d 20 76 61 6c 2a 32 35 36 20 2b 20 61 44  l = val*256 + aD
0620: 61 74 61 5b 6f 66 73 74 2b 6a 5d 3b 0a 20 20 20  ata[ofst+j];.   
0630: 20 7d 0a 20 20 20 20 69 20 2b 3d 20 73 74 72 6c   }.    i += strl
0640: 65 6e 28 26 7a 42 75 66 5b 69 5d 29 3b 0a 20 20  en(&zBuf[i]);.  
0650: 7d 0a 20 20 73 70 72 69 6e 74 66 28 26 7a 42 75  }.  sprintf(&zBu
0660: 66 5b 69 5d 2c 20 22 20 20 20 25 31 30 75 22 2c  f[i], "   %10u",
0670: 20 76 61 6c 29 3b 0a 20 20 70 72 69 6e 74 66 28   val);.  printf(
0680: 22 25 73 20 20 25 73 5c 6e 22 2c 20 7a 42 75 66  "%s  %s\n", zBuf
0690: 2c 20 7a 4d 73 67 29 3b 0a 20 20 72 65 74 75 72  , zMsg);.  retur
06a0: 6e 20 76 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  n val;.}../*.** 
06b0: 52 65 61 64 20 61 6e 64 20 70 72 69 6e 74 20 61  Read and print a
06c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
06d0: 20 20 53 74 6f 72 65 20 6b 65 79 20 69 6e 66 6f    Store key info
06e0: 72 6d 61 74 69 6f 6e 20 28 70 61 67 65 20 73 69  rmation (page si
06f0: 7a 65 2c 20 65 74 63 29 0a 2a 2a 20 69 6e 20 67  ze, etc).** in g
0700: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 2e  lobal variables.
0710: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69 67  .*/.static unsig
0720: 6e 65 64 20 64 65 63 6f 64 65 5f 6a 6f 75 72 6e  ned decode_journ
0730: 61 6c 5f 68 65 61 64 65 72 28 69 6e 74 20 69 4f  al_header(int iO
0740: 66 73 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64  fst){.  unsigned
0750: 20 63 68 61 72 20 2a 70 48 64 72 20 3d 20 72 65   char *pHdr = re
0760: 61 64 5f 63 6f 6e 74 65 6e 74 28 36 34 2c 20 69  ad_content(64, i
0770: 4f 66 73 74 29 3b 0a 20 20 75 6e 73 69 67 6e 65  Ofst);.  unsigne
0780: 64 20 6e 50 61 67 65 3b 0a 20 20 70 72 69 6e 74  d nPage;.  print
0790: 66 28 22 48 65 61 64 65 72 20 61 74 20 6f 66 66  f("Header at off
07a0: 73 65 74 20 25 64 3a 5c 6e 22 2c 20 69 4f 66 73  set %d:\n", iOfs
07b0: 74 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f  t);.  print_deco
07c0: 64 65 5f 6c 69 6e 65 28 70 48 64 72 2c 20 30 2c  de_line(pHdr, 0,
07d0: 20 34 2c 20 22 48 65 61 64 65 72 20 70 61 72 74   4, "Header part
07e0: 20 31 20 28 33 36 35 34 36 31 36 35 36 39 29 22   1 (3654616569)"
07f0: 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63 6f 64  );.  print_decod
0800: 65 5f 6c 69 6e 65 28 70 48 64 72 2c 20 34 2c 20  e_line(pHdr, 4, 
0810: 34 2c 20 22 48 65 61 64 65 72 20 70 61 72 74 20  4, "Header part 
0820: 32 20 28 35 34 37 34 34 37 37 36 37 29 22 29 3b  2 (547447767)");
0830: 0a 20 20 6e 50 61 67 65 20 3d 0a 20 20 70 72 69  .  nPage =.  pri
0840: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 70  nt_decode_line(p
0850: 48 64 72 2c 20 38 2c 20 34 2c 20 22 70 61 67 65  Hdr, 8, 4, "page
0860: 20 63 6f 75 6e 74 22 29 3b 0a 20 20 63 6b 73 75   count");.  cksu
0870: 6d 4e 6f 6e 63 65 20 3d 0a 20 20 70 72 69 6e 74  mNonce =.  print
0880: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 70 48 64  _decode_line(pHd
0890: 72 2c 20 31 32 2c 20 34 2c 20 22 63 68 6b 73 75  r, 12, 4, "chksu
08a0: 6d 20 6e 6f 6e 63 65 22 29 3b 0a 20 20 70 72 69  m nonce");.  pri
08b0: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 70  nt_decode_line(p
08c0: 48 64 72 2c 20 31 36 2c 20 34 2c 20 22 69 6e 69  Hdr, 16, 4, "ini
08d0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
08e0: 7a 65 20 69 6e 20 70 61 67 65 73 22 29 3b 0a 20  ze in pages");. 
08f0: 20 73 65 63 74 6f 72 53 69 7a 65 20 3d 0a 20 20   sectorSize =.  
0900: 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e  print_decode_lin
0910: 65 28 70 48 64 72 2c 20 32 30 2c 20 34 2c 20 22  e(pHdr, 20, 4, "
0920: 73 65 63 74 6f 72 20 73 69 7a 65 22 29 3b 0a 20  sector size");. 
0930: 20 70 61 67 65 53 69 7a 65 20 3d 0a 20 20 70 72   pageSize =.  pr
0940: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
0950: 70 48 64 72 2c 20 32 34 2c 20 34 2c 20 22 70 61  pHdr, 24, 4, "pa
0960: 67 65 20 73 69 7a 65 22 29 3b 0a 20 20 70 72 69  ge size");.  pri
0970: 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 70  nt_decode_line(p
0980: 48 64 72 2c 20 32 38 2c 20 34 2c 20 22 7a 65 72  Hdr, 28, 4, "zer
0990: 6f 22 29 3b 0a 20 20 70 72 69 6e 74 5f 64 65 63  o");.  print_dec
09a0: 6f 64 65 5f 6c 69 6e 65 28 70 48 64 72 2c 20 33  ode_line(pHdr, 3
09b0: 32 2c 20 34 2c 20 22 7a 65 72 6f 22 29 3b 0a 20  2, 4, "zero");. 
09c0: 20 70 72 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69   print_decode_li
09d0: 6e 65 28 70 48 64 72 2c 20 33 36 2c 20 34 2c 20  ne(pHdr, 36, 4, 
09e0: 22 7a 65 72 6f 22 29 3b 0a 20 20 70 72 69 6e 74  "zero");.  print
09f0: 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28 70 48 64  _decode_line(pHd
0a00: 72 2c 20 34 30 2c 20 34 2c 20 22 7a 65 72 6f 22  r, 40, 4, "zero"
0a10: 29 3b 0a 20 20 66 72 65 65 28 70 48 64 72 29 3b  );.  free(pHdr);
0a20: 0a 20 20 72 65 74 75 72 6e 20 6e 50 61 67 65 3b  .  return nPage;
0a30: 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
0a40: 70 72 69 6e 74 5f 70 61 67 65 28 69 6e 74 20 69  print_page(int i
0a50: 4f 66 73 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65  Ofst){.  unsigne
0a60: 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20  d char *aData;. 
0a70: 20 63 68 61 72 20 7a 54 69 74 6c 65 5b 35 30 5d   char zTitle[50]
0a80: 3b 0a 20 20 61 44 61 74 61 20 3d 20 72 65 61 64  ;.  aData = read
0a90: 5f 63 6f 6e 74 65 6e 74 28 70 61 67 65 53 69 7a  _content(pageSiz
0aa0: 65 2b 38 2c 20 69 4f 66 73 74 29 3b 0a 20 20 73  e+8, iOfst);.  s
0ab0: 70 72 69 6e 74 66 28 7a 54 69 74 6c 65 2c 20 22  printf(zTitle, "
0ac0: 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20  page number for 
0ad0: 70 61 67 65 20 61 74 20 6f 66 66 73 65 74 20 25  page at offset %
0ae0: 64 22 2c 20 69 4f 66 73 74 29 3b 0a 20 20 70 72  d", iOfst);.  pr
0af0: 69 6e 74 5f 64 65 63 6f 64 65 5f 6c 69 6e 65 28  int_decode_line(
0b00: 61 44 61 74 61 2d 69 4f 66 73 74 2c 20 69 4f 66  aData-iOfst, iOf
0b10: 73 74 2c 20 34 2c 20 7a 54 69 74 6c 65 29 3b 0a  st, 4, zTitle);.
0b20: 20 20 66 72 65 65 28 61 44 61 74 61 29 3b 0a 7d    free(aData);.}
0b30: 0a 0a 69 6e 74 20 6d 61 69 6e 28 69 6e 74 20 61  ..int main(int a
0b40: 72 67 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76  rgc, char **argv
0b50: 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67 65 2c 20  ){.  int nPage, 
0b60: 63 6e 74 3b 0a 20 20 69 6e 74 20 69 4f 66 73 74  cnt;.  int iOfst
0b70: 3b 0a 20 20 69 66 28 20 61 72 67 63 21 3d 32 20  ;.  if( argc!=2 
0b80: 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66 28 73  ){.    fprintf(s
0b90: 74 64 65 72 72 2c 22 55 73 61 67 65 3a 20 25 73  tderr,"Usage: %s
0ba0: 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 2c 20 61 72   FILENAME\n", ar
0bb0: 67 76 5b 30 5d 29 3b 0a 20 20 20 20 65 78 69 74  gv[0]);.    exit
0bc0: 28 31 29 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20  (1);.  }.  db = 
0bd0: 66 6f 70 65 6e 28 61 72 67 76 5b 31 5d 2c 20 22  fopen(argv[1], "
0be0: 72 62 22 29 3b 0a 20 20 69 66 28 20 64 62 3d 3d  rb");.  if( db==
0bf0: 30 20 29 7b 0a 20 20 20 20 66 70 72 69 6e 74 66  0 ){.    fprintf
0c00: 28 73 74 64 65 72 72 2c 22 25 73 3a 20 63 61 6e  (stderr,"%s: can
0c10: 27 74 20 6f 70 65 6e 20 25 73 5c 6e 22 2c 20 61  't open %s\n", a
0c20: 72 67 76 5b 30 5d 2c 20 61 72 67 76 5b 31 5d 29  rgv[0], argv[1])
0c30: 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20  ;.    exit(1);. 
0c40: 20 7d 0a 20 20 66 73 65 65 6b 28 64 62 2c 20 30   }.  fseek(db, 0
0c50: 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 66  , SEEK_END);.  f
0c60: 69 6c 65 53 69 7a 65 20 3d 20 66 74 65 6c 6c 28  ileSize = ftell(
0c70: 64 62 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 6a  db);.  printf("j
0c80: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
0c90: 3a 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 20 66  : %d bytes\n", f
0ca0: 69 6c 65 53 69 7a 65 29 3b 0a 20 20 66 73 65 65  ileSize);.  fsee
0cb0: 6b 28 64 62 2c 20 30 2c 20 53 45 45 4b 5f 53 45  k(db, 0, SEEK_SE
0cc0: 54 29 3b 0a 20 20 69 4f 66 73 74 20 3d 20 30 3b  T);.  iOfst = 0;
0cd0: 0a 20 20 77 68 69 6c 65 28 20 69 4f 66 73 74 3c  .  while( iOfst<
0ce0: 66 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  fileSize ){.    
0cf0: 63 6e 74 20 3d 20 6e 50 61 67 65 20 3d 20 28 69  cnt = nPage = (i
0d00: 6e 74 29 64 65 63 6f 64 65 5f 6a 6f 75 72 6e 61  nt)decode_journa
0d10: 6c 5f 68 65 61 64 65 72 28 69 4f 66 73 74 29 3b  l_header(iOfst);
0d20: 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  .    if( cnt==0 
0d30: 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 28  ){.      cnt = (
0d40: 66 69 6c 65 53 69 7a 65 20 2d 20 73 65 63 74 6f  fileSize - secto
0d50: 72 53 69 7a 65 29 2f 28 70 61 67 65 53 69 7a 65  rSize)/(pageSize
0d60: 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  +8);.    }.    i
0d70: 4f 66 73 74 20 2b 3d 20 73 65 63 74 6f 72 53 69  Ofst += sectorSi
0d80: 7a 65 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 63  ze;.    while( c
0d90: 6e 74 20 26 26 20 69 4f 66 73 74 3c 66 69 6c 65  nt && iOfst<file
0da0: 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 72  Size ){.      pr
0db0: 69 6e 74 5f 70 61 67 65 28 69 4f 66 73 74 29 3b  int_page(iOfst);
0dc0: 0a 20 20 20 20 20 20 69 4f 66 73 74 20 2b 3d 20  .      iOfst += 
0dd0: 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20  pageSize+8;.    
0de0: 7d 0a 20 20 20 20 69 4f 66 73 74 20 3d 20 28 69  }.    iOfst = (i
0df0: 4f 66 73 74 2f 73 65 63 74 6f 72 53 69 7a 65 20  Ofst/sectorSize 
0e00: 2b 20 31 29 2a 73 65 63 74 6f 72 53 69 7a 65 3b  + 1)*sectorSize;
0e10: 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 64 62  .  }.  fclose(db
0e20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
0e30: 0a                                               .