/ Hex Artifact Content
Login

Artifact da540964c675fde39487da2bc664096af97190d8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 4a 61 6e 20 32  /*.** 2008 Jan 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 66 6f 72 20 61 20 56 46 53 20 6c 61  ode for a VFS la
01a0: 79 65 72 20 74 68 61 74 20 61 63 74 73 20 61 73  yer that acts as
01b0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
01c0: 64 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  d.** an existing
01d0: 20 56 46 53 2e 20 54 68 65 20 63 6f 64 65 20 69   VFS. The code i
01e0: 6e 20 74 68 69 73 20 66 69 6c 65 20 61 74 74 65  n this file atte
01f0: 6d 70 74 73 20 74 6f 20 76 65 72 69 66 79 20 74  mpts to verify t
0200: 68 61 74 20 53 51 4c 69 74 65 0a 2a 2a 20 63 6f  hat SQLite.** co
0210: 72 72 65 63 74 6c 79 20 70 6f 70 75 6c 61 74 65  rrectly populate
0220: 73 20 61 6e 64 20 73 79 6e 63 73 20 61 20 6a 6f  s and syncs a jo
0230: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
0240: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 0a 2a  e writing to a.*
0250: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
0260: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0270: 2a 0a 2a 2a 20 49 4e 54 45 52 46 41 43 45 0a 2a  *.** INTERFACE.*
0280: 2a 0a 2a 2a 20 20 20 54 68 65 20 70 75 62 6c 69  *.**   The publi
0290: 63 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 74  c interface to t
02a0: 68 69 73 20 77 72 61 70 70 65 72 20 56 46 53 20  his wrapper VFS 
02b0: 69 73 20 74 77 6f 20 66 75 6e 63 74 69 6f 6e 73  is two functions
02c0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6a 74 5f 72  :.**.**     jt_r
02d0: 65 67 69 73 74 65 72 28 29 0a 2a 2a 20 20 20 20  egister().**    
02e0: 20 6a 74 5f 75 6e 72 65 67 69 73 74 65 72 28 29   jt_unregister()
02f0: 0a 2a 2a 0a 2a 2a 20 20 20 53 65 65 20 68 65 61  .**.**   See hea
0300: 64 65 72 20 63 6f 6d 6d 65 6e 74 73 20 61 73 73  der comments ass
0310: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 6f  ociated with tho
0320: 73 65 20 74 77 6f 20 66 75 6e 63 74 69 6f 6e 73  se two functions
0330: 20 62 65 6c 6f 77 20 66 6f 72 20 0a 2a 2a 20 20   below for .**  
0340: 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a 2a 2a 20   details..**.** 
0350: 4c 49 4d 49 54 41 54 49 4f 4e 53 0a 2a 2a 0a 2a  LIMITATIONS.**.*
0360: 2a 20 20 20 54 68 69 73 20 77 72 61 70 70 65 72  *   This wrapper
0370: 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72 6b 20 69   will not work i
0380: 66 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68 72  f "PRAGMA synchr
0390: 6f 6e 6f 75 73 20 3d 20 6f 66 66 22 20 69 73 20  onous = off" is 
03a0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 50 45 52  used..**.** OPER
03b0: 41 54 49 4f 4e 0a 2a 2a 0a 2a 2a 20 20 53 74 61  ATION.**.**  Sta
03c0: 72 74 69 6e 67 20 61 20 54 72 61 6e 73 61 63 74  rting a Transact
03d0: 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  ion:.**.**   Whe
03e0: 6e 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61  n a write-transa
03f0: 63 74 69 6f 6e 20 69 73 20 73 74 61 72 74 65 64  ction is started
0400: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
0410: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
0420: 73 0a 2a 2a 20 20 20 69 6e 73 70 65 63 74 65 64  s.**   inspected
0430: 20 61 6e 64 20 74 68 65 20 66 6f 6c 6c 6f 77 69   and the followi
0440: 6e 67 20 64 61 74 61 20 73 74 6f 72 65 64 20 61  ng data stored a
0450: 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 64 61  s part of the da
0460: 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20  tabase file .** 
0470: 20 20 68 61 6e 64 6c 65 20 28 74 79 70 65 20 73    handle (type s
0480: 74 72 75 63 74 20 6a 74 5f 66 69 6c 65 29 3a 0a  truct jt_file):.
0490: 2a 2a 0a 2a 2a 20 20 20 20 20 61 29 20 54 68 65  **.**     a) The
04a0: 20 70 61 67 65 2d 73 69 7a 65 20 6f 66 20 74 68   page-size of th
04b0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
04c0: 0a 2a 2a 20 20 20 20 20 62 29 20 54 68 65 20 6e  .**     b) The n
04d0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
04e0: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 20 64  hat are in the d
04f0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
0500: 20 20 20 20 20 63 29 20 54 68 65 20 73 65 74 20       c) The set 
0510: 6f 66 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  of page numbers 
0520: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
0530: 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20   free-list leaf 
0540: 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20 20 64 29  pages..**     d)
0550: 20 41 20 63 68 65 63 6b 2d 73 75 6d 20 66 6f 72   A check-sum for
0560: 20 65 76 65 72 79 20 70 61 67 65 20 69 6e 20 74   every page in t
0570: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0580: 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 73 74  ..**.**   The st
0590: 61 72 74 20 6f 66 20 61 20 77 72 69 74 65 2d 74  art of a write-t
05a0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 64 65  ransaction is de
05b0: 65 6d 65 64 20 74 6f 20 68 61 76 65 20 6f 63 63  emed to have occ
05c0: 75 72 72 65 64 20 77 68 65 6e 20 61 20 0a 2a 2a  urred when a .**
05d0: 20 20 20 32 38 2d 62 79 74 65 20 6a 6f 75 72 6e     28-byte journ
05e0: 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
05f0: 74 74 65 6e 20 74 6f 20 62 79 74 65 20 6f 66 66  tten to byte off
0600: 73 65 74 20 30 20 6f 66 20 74 68 65 20 6a 6f 75  set 0 of the jou
0610: 72 6e 61 6c 20 0a 2a 2a 20 20 20 66 69 6c 65 2e  rnal .**   file.
0620: 0a 2a 2a 0a 2a 2a 20 20 53 79 6e 63 69 6e 67 20  .**.**  Syncing 
0630: 74 68 65 20 4a 6f 75 72 6e 61 6c 20 46 69 6c 65  the Journal File
0640: 3a 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 65 76  :.**.**   Whenev
0650: 65 72 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  er the xSync met
0660: 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 74  hod is invoked t
0670: 6f 20 73 79 6e 63 20 61 20 6a 6f 75 72 6e 61 6c  o sync a journal
0680: 2d 66 69 6c 65 2c 20 74 68 65 0a 2a 2a 20 20 20  -file, the.**   
0690: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
06a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72 65  journal file are
06b0: 20 72 65 61 64 2e 20 46 6f 72 20 65 61 63 68 20   read. For each 
06c0: 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a  page written to.
06d0: 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c  **   the journal
06e0: 20 66 69 6c 65 2c 20 61 20 63 68 65 63 6b 2d 73   file, a check-s
06f0: 75 6d 20 69 73 20 63 61 6c 63 75 6c 61 74 65 64  um is calculated
0700: 20 61 6e 64 20 63 6f 6d 70 61 72 65 64 20 74 6f   and compared to
0710: 20 74 68 65 20 20 0a 2a 2a 20 20 20 63 68 65 63   the  .**   chec
0720: 6b 2d 73 75 6d 20 63 61 6c 63 75 6c 61 74 65 64  k-sum calculated
0730: 20 66 6f 72 20 74 68 65 20 63 6f 72 72 65 73 70   for the corresp
0740: 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65 20  onding database 
0750: 70 61 67 65 20 77 68 65 6e 20 74 68 65 0a 2a 2a  page when the.**
0760: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
0770: 74 69 6f 6e 20 77 61 73 20 69 6e 69 74 69 61 6c  tion was initial
0780: 69 7a 65 64 2e 20 54 68 65 20 73 75 63 63 65 73  ized. The succes
0790: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
07a0: 73 6f 6e 0a 2a 2a 20 20 20 69 73 20 61 73 73 65  son.**   is asse
07b0: 72 74 28 29 65 64 2e 20 53 6f 20 69 66 20 53 51  rt()ed. So if SQ
07c0: 4c 69 74 65 20 68 61 73 20 77 72 69 74 74 65 6e  Lite has written
07d0: 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74 68 65 72   something other
07e0: 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20 20 20 6f   than the.**   o
07f0: 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20  riginal content 
0800: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
0810: 66 69 6c 65 2c 20 61 6e 20 61 73 73 65 72 74 28  file, an assert(
0820: 29 20 77 69 6c 6c 20 66 61 69 6c 2e 0a 2a 2a 0a  ) will fail..**.
0830: 2a 2a 20 20 20 41 64 64 69 74 69 6f 6e 61 6c 6c  **   Additionall
0840: 79 2c 20 74 68 65 20 73 65 74 20 6f 66 20 70 61  y, the set of pa
0850: 67 65 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 77  ge numbers for w
0860: 68 69 63 68 20 72 65 63 6f 72 64 73 20 65 78 69  hich records exi
0870: 73 74 20 69 6e 0a 2a 2a 20 20 20 74 68 65 20 6a  st in.**   the j
0880: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61  ournal file is a
0890: 64 64 65 64 20 74 6f 20 28 75 6e 69 6f 6e 65 64  dded to (unioned
08a0: 20 77 69 74 68 29 20 74 68 65 20 73 65 74 20 6f   with) the set o
08b0: 66 20 70 61 67 65 20 6e 75 6d 62 65 72 73 0a 2a  f page numbers.*
08c0: 2a 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  *   correspondin
08d0: 67 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c  g to free-list l
08e0: 65 61 66 20 70 61 67 65 73 20 63 6f 6c 6c 65 63  eaf pages collec
08f0: 74 65 64 20 77 68 65 6e 20 74 68 65 20 0a 2a 2a  ted when the .**
0900: 20 20 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63     write-transac
0910: 74 69 6f 6e 20 77 61 73 20 69 6e 69 74 69 61 6c  tion was initial
0920: 69 7a 65 64 2e 20 54 68 69 73 20 73 65 74 20 63  ized. This set c
0930: 6f 6d 70 72 69 73 65 73 20 74 68 65 20 70 61 67  omprises the pag
0940: 65 2d 6e 75 6d 62 65 72 73 20 0a 2a 2a 20 20 20  e-numbers .**   
0950: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f  corresponding to
0960: 20 74 68 6f 73 65 20 70 61 67 65 73 20 74 68 61   those pages tha
0970: 74 20 53 51 4c 69 74 65 20 6d 61 79 20 6e 6f 77  t SQLite may now
0980: 20 73 61 66 65 6c 79 20 6d 6f 64 69 66 79 2e 0a   safely modify..
0990: 2a 2a 0a 2a 2a 20 20 57 72 69 74 69 6e 67 20 74  **.**  Writing t
09a0: 6f 20 74 68 65 20 44 61 74 61 62 61 73 65 20 46  o the Database F
09b0: 69 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  ile:.**.**   Whe
09c0: 6e 20 61 20 62 6c 6f 63 6b 20 6f 66 20 64 61 74  n a block of dat
09d0: 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
09e0: 61 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  a database file,
09f0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   the following.*
0a00: 2a 20 20 20 69 6e 76 61 72 69 61 6e 74 73 20 61  *   invariants a
0a10: 72 65 20 61 73 73 65 72 74 65 64 3a 0a 2a 2a 0a  re asserted:.**.
0a20: 2a 2a 20 20 20 20 20 61 29 20 54 68 61 74 20 74  **     a) That t
0a30: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 64 61 74 61  he block of data
0a40: 20 69 73 20 61 6e 20 61 6c 69 67 6e 65 64 20 62   is an aligned b
0a50: 6c 6f 63 6b 20 6f 66 20 70 61 67 65 2d 73 69 7a  lock of page-siz
0a60: 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a 20 20  e bytes..**.**  
0a70: 20 20 20 62 29 20 54 68 61 74 20 69 66 20 74 68     b) That if th
0a80: 65 20 70 61 67 65 20 62 65 69 6e 67 20 77 72 69  e page being wri
0a90: 74 74 65 6e 20 64 69 64 20 6e 6f 74 20 65 78 69  tten did not exi
0aa0: 73 74 20 77 68 65 6e 20 74 68 65 20 0a 2a 2a 20  st when the .** 
0ab0: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0ac0: 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 20 28  on was started (
0ad0: 69 2e 65 2e 20 74 68 65 20 64 61 74 61 62 61 73  i.e. the databas
0ae0: 65 20 66 69 6c 65 20 69 73 20 67 72 6f 77 69 6e  e file is growin
0af0: 67 29 2c 20 74 68 65 6e 0a 2a 2a 20 20 20 20 20  g), then.**     
0b00: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66     the journal-f
0b10: 69 6c 65 20 6d 75 73 74 20 68 61 76 65 20 62 65  ile must have be
0b20: 65 6e 20 73 79 6e 63 65 64 20 61 74 20 6c 65 61  en synced at lea
0b30: 73 74 20 6f 6e 63 65 20 73 69 6e 63 65 0a 2a 2a  st once since.**
0b40: 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61 72          the star
0b50: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
0b60: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  tion..**.**     
0b70: 63 29 20 54 68 61 74 20 69 66 20 74 68 65 20 70  c) That if the p
0b80: 61 67 65 20 62 65 69 6e 67 20 77 72 69 74 74 65  age being writte
0b90: 6e 20 64 69 64 20 65 78 69 73 74 20 77 68 65 6e  n did exist when
0ba0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
0bb0: 20 0a 2a 2a 20 20 20 20 20 20 20 20 77 61 73 20   .**        was 
0bc0: 73 74 61 72 74 65 64 2c 20 74 68 65 6e 20 74 68  started, then th
0bd0: 65 20 70 61 67 65 20 6d 75 73 74 20 68 61 76 65  e page must have
0be0: 20 65 69 74 68 65 72 20 62 65 65 6e 20 61 20 66   either been a f
0bf0: 72 65 65 2d 6c 69 73 74 0a 2a 2a 20 20 20 20 20  ree-list.**     
0c00: 20 20 20 6c 65 61 66 20 70 61 67 65 20 61 74 20     leaf page at 
0c10: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0c20: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72   transaction, or
0c30: 20 65 6c 73 65 20 6d 75 73 74 20 68 61 76 65 0a   else must have.
0c40: 2a 2a 20 20 20 20 20 20 20 20 62 65 65 6e 20 73  **        been s
0c50: 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6a 6f 75  tored in the jou
0c60: 72 6e 61 6c 20 66 69 6c 65 20 70 72 69 6f 72 20  rnal file prior 
0c70: 74 6f 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  to the most rece
0c80: 6e 74 20 73 79 6e 63 2e 0a 2a 2a 0a 2a 2a 20 20  nt sync..**.**  
0c90: 43 6c 6f 73 69 6e 67 20 61 20 54 72 61 6e 73 61  Closing a Transa
0ca0: 63 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 57  ction:.**.**   W
0cb0: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0cc0: 6e 20 69 73 20 63 6c 6f 73 65 64 2c 20 61 6c 6c  n is closed, all
0cd0: 20 64 61 74 61 20 63 6f 6c 6c 65 63 74 65 64 20   data collected 
0ce0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
0cf0: 2a 2a 20 20 20 74 68 65 20 74 72 61 6e 73 61 63  **   the transac
0d00: 74 69 6f 6e 2c 20 6f 72 20 66 6f 6c 6c 6f 77 69  tion, or followi
0d10: 6e 67 20 61 6e 20 78 53 79 6e 63 20 6f 66 20 61  ng an xSync of a
0d20: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 69   journal-file, i
0d30: 73 20 0a 2a 2a 20 20 20 64 69 73 63 61 72 64 65  s .**   discarde
0d40: 64 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 61 20  d. The end of a 
0d50: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
0d60: 65 63 6f 67 6e 69 7a 65 64 20 77 68 65 6e 20 61  ecognized when a
0d70: 6e 79 20 6f 6e 65 20 0a 2a 2a 20 20 20 6f 66 20  ny one .**   of 
0d80: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6f 63  the following oc
0d90: 63 75 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61  cur:.**.**     a
0da0: 29 20 41 20 62 6c 6f 63 6b 20 6f 66 20 7a 65 72  ) A block of zer
0db0: 6f 65 73 20 28 6f 72 20 61 6e 79 74 68 69 6e 67  oes (or anything
0dc0: 20 65 6c 73 65 20 74 68 61 74 20 69 73 20 6e 6f   else that is no
0dd0: 74 20 61 20 76 61 6c 69 64 20 0a 2a 2a 20 20 20  t a valid .**   
0de0: 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2d 68 65 61       journal-hea
0df0: 64 65 72 29 20 69 73 20 77 72 69 74 74 65 6e 20  der) is written 
0e00: 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
0e10: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
0e20: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20 41  ..**.**     b) A
0e30: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
0e40: 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a 65   truncated to ze
0e50: 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  ro bytes in size
0e60: 20 75 73 69 6e 67 20 78 54 72 75 6e 63 61 74 65   using xTruncate
0e70: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63 29 20 54  ..**.**     c) T
0e80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0e90: 69 73 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  is deleted using
0ea0: 20 78 44 65 6c 65 74 65 2e 0a 2a 2f 0a 23 69 66   xDelete..*/.#if
0eb0: 20 53 51 4c 49 54 45 5f 54 45 53 54 20 20 20 20   SQLITE_TEST    
0ec0: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 66 69        /* This fi
0ed0: 6c 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  le is used for t
0ee0: 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2a 2f 0a 0a  esting only */..
0ef0: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0f00: 33 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 73  3.h".#include "s
0f10: 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a  qliteInt.h"../*.
0f20: 2a 2a 20 4d 61 78 69 6d 75 6d 20 70 61 74 68 6e  ** Maximum pathn
0f30: 61 6d 65 20 6c 65 6e 67 74 68 20 73 75 70 70 6f  ame length suppo
0f40: 72 74 65 64 20 62 79 20 74 68 65 20 6a 74 20 62  rted by the jt b
0f50: 61 63 6b 65 6e 64 2e 0a 2a 2f 0a 23 64 65 66 69  ackend..*/.#defi
0f60: 6e 65 20 4a 54 5f 4d 41 58 5f 50 41 54 48 4e 41  ne JT_MAX_PATHNA
0f70: 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 4e 61  ME 512../*.** Na
0f80: 6d 65 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74  me used to ident
0f90: 69 66 79 20 74 68 69 73 20 56 46 53 2e 0a 2a 2f  ify this VFS..*/
0fa0: 0a 23 64 65 66 69 6e 65 20 4a 54 5f 56 46 53 5f  .#define JT_VFS_
0fb0: 4e 41 4d 45 20 22 6a 74 22 0a 0a 74 79 70 65 64  NAME "jt"..typed
0fc0: 65 66 20 73 74 72 75 63 74 20 6a 74 5f 66 69 6c  ef struct jt_fil
0fd0: 65 20 6a 74 5f 66 69 6c 65 3b 0a 73 74 72 75 63  e jt_file;.struc
0fe0: 74 20 6a 74 5f 66 69 6c 65 20 7b 0a 20 20 73 71  t jt_file {.  sq
0ff0: 6c 69 74 65 33 5f 66 69 6c 65 20 62 61 73 65 3b  lite3_file base;
1000: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1010: 4e 61 6d 65 3b 20 20 20 20 20 20 20 2f 2a 20 4e  Name;       /* N
1020: 61 6d 65 20 6f 66 20 6f 70 65 6e 20 66 69 6c 65  ame of open file
1030: 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 3b   */.  int flags;
1040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1050: 2a 20 46 6c 61 67 73 20 74 68 65 20 66 69 6c 65  * Flags the file
1060: 20 77 61 73 20 6f 70 65 6e 65 64 20 77 69 74 68   was opened with
1070: 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f   */..  /* The fo
1080: 6c 6c 6f 77 69 6e 67 20 61 72 65 20 6f 6e 6c 79  llowing are only
1090: 20 75 73 65 64 20 62 79 20 64 61 74 61 62 61 73   used by databas
10a0: 65 20 66 69 6c 65 20 66 69 6c 65 20 68 61 6e 64  e file file hand
10b0: 6c 65 73 20 2a 2f 0a 20 20 69 6e 74 20 65 4c 6f  les */.  int eLo
10c0: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
10d0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 6f 63    /* Current loc
10e0: 6b 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66 69  k held on the fi
10f0: 6c 65 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67  le */.  u32 nPag
1100: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
1110: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 66 69 6c 65   /* Size of file
1120: 20 69 6e 20 70 61 67 65 73 20 77 68 65 6e 20 74   in pages when t
1130: 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
1140: 65 64 20 2a 2f 0a 20 20 75 33 32 20 6e 50 61 67  ed */.  u32 nPag
1150: 65 73 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  esize;          
1160: 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 77 68   /* Page size wh
1170: 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  en transaction s
1180: 74 61 72 74 65 64 20 2a 2f 0a 20 20 42 69 74 76  tarted */.  Bitv
1190: 65 63 20 2a 70 57 72 69 74 61 62 6c 65 3b 20 20  ec *pWritable;  
11a0: 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20 6f       /* Bitvec o
11b0: 66 20 70 61 67 65 73 20 74 68 61 74 20 6d 61 79  f pages that may
11c0: 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
11d0: 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32  he file */.  u32
11e0: 20 2a 61 43 6b 73 75 6d 3b 20 20 20 20 20 20 20   *aCksum;       
11f0: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75        /* Checksu
1200: 6d 20 66 6f 72 20 66 69 72 73 74 20 6e 50 61 67  m for first nPag
1210: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  e pages */.  int
1220: 20 6e 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20   nSync;         
1230: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
1240: 6f 66 20 74 69 6d 65 73 20 6a 6f 75 72 6e 61 6c  of times journal
1250: 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
1260: 79 6e 63 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 4f  ynced */..  /* O
1270: 6e 6c 79 20 75 73 65 64 20 62 79 20 6a 6f 75 72  nly used by jour
1280: 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65 73  nal file-handles
1290: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   */.  sqlite3_in
12a0: 74 36 34 20 69 4d 61 78 4f 66 66 3b 20 20 20 2f  t64 iMaxOff;   /
12b0: 2a 20 4d 61 78 69 6d 75 6d 20 6f 66 66 73 65 74  * Maximum offset
12c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 69 73   written to this
12d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a   transaction */.
12e0: 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 4e 65 78  .  jt_file *pNex
12f0: 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  t;          /* A
1300: 6c 6c 20 66 69 6c 65 73 20 61 72 65 20 73 74 6f  ll files are sto
1310: 72 65 64 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  red in a linked 
1320: 6c 69 73 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  list */.  sqlite
1330: 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c 3b 20 20  3_file *pReal;  
1340: 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20 68     /* The file h
1350: 61 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 75 6e  andle for the un
1360: 64 65 72 6c 79 69 6e 67 20 76 66 73 20 2a 2f 0a  derlying vfs */.
1370: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64  };../*.** Method
1380: 20 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f   declarations fo
1390: 72 20 6a 74 5f 66 69 6c 65 2e 0a 2a 2f 0a 73 74  r jt_file..*/.st
13a0: 61 74 69 63 20 69 6e 74 20 6a 74 43 6c 6f 73 65  atic int jtClose
13b0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b  (sqlite3_file*);
13c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 52 65  .static int jtRe
13d0: 61 64 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ad(sqlite3_file*
13e0: 2c 20 76 6f 69 64 2a 2c 20 69 6e 74 20 69 41 6d  , void*, int iAm
13f0: 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  t, sqlite3_int64
1400: 20 69 4f 66 73 74 29 3b 0a 73 74 61 74 69 63 20   iOfst);.static 
1410: 69 6e 74 20 6a 74 57 72 69 74 65 28 73 71 6c 69  int jtWrite(sqli
1420: 74 65 33 5f 66 69 6c 65 2a 2c 63 6f 6e 73 74 20  te3_file*,const 
1430: 76 6f 69 64 2a 2c 69 6e 74 20 69 41 6d 74 2c 20  void*,int iAmt, 
1440: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f  sqlite3_int64 iO
1450: 66 73 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  fst);.static int
1460: 20 6a 74 54 72 75 6e 63 61 74 65 28 73 71 6c 69   jtTruncate(sqli
1470: 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74  te3_file*, sqlit
1480: 65 33 5f 69 6e 74 36 34 20 73 69 7a 65 29 3b 0a  e3_int64 size);.
1490: 73 74 61 74 69 63 20 69 6e 74 20 6a 74 53 79 6e  static int jtSyn
14a0: 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c  c(sqlite3_file*,
14b0: 20 69 6e 74 20 66 6c 61 67 73 29 3b 0a 73 74 61   int flags);.sta
14c0: 74 69 63 20 69 6e 74 20 6a 74 46 69 6c 65 53 69  tic int jtFileSi
14d0: 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ze(sqlite3_file*
14e0: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
14f0: 2a 70 53 69 7a 65 29 3b 0a 73 74 61 74 69 63 20  *pSize);.static 
1500: 69 6e 74 20 6a 74 4c 6f 63 6b 28 73 71 6c 69 74  int jtLock(sqlit
1510: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a  e3_file*, int);.
1520: 73 74 61 74 69 63 20 69 6e 74 20 6a 74 55 6e 6c  static int jtUnl
1530: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1540: 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
1550: 69 6e 74 20 6a 74 43 68 65 63 6b 52 65 73 65 72  int jtCheckReser
1560: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
1570: 66 69 6c 65 2a 2c 20 69 6e 74 20 2a 29 3b 0a 73  file*, int *);.s
1580: 74 61 74 69 63 20 69 6e 74 20 6a 74 46 69 6c 65  tatic int jtFile
1590: 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
15a0: 66 69 6c 65 2a 2c 20 69 6e 74 20 6f 70 2c 20 76  file*, int op, v
15b0: 6f 69 64 20 2a 70 41 72 67 29 3b 0a 73 74 61 74  oid *pArg);.stat
15c0: 69 63 20 69 6e 74 20 6a 74 53 65 63 74 6f 72 53  ic int jtSectorS
15d0: 69 7a 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ize(sqlite3_file
15e0: 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  *);.static int j
15f0: 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  tDeviceCharacter
1600: 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
1610: 69 6c 65 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65  ile*);../*.** Me
1620: 74 68 6f 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  thod declaration
1630: 73 20 66 6f 72 20 6a 74 5f 76 66 73 2e 0a 2a 2f  s for jt_vfs..*/
1640: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 4f 70  .static int jtOp
1650: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
1660: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2c 20 73   const char *, s
1670: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1680: 74 20 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74  t , int *);.stat
1690: 69 63 20 69 6e 74 20 6a 74 44 65 6c 65 74 65 28  ic int jtDelete(
16a0: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f  sqlite3_vfs*, co
16b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
16c0: 20 69 6e 74 20 73 79 6e 63 44 69 72 29 3b 0a 73   int syncDir);.s
16d0: 74 61 74 69 63 20 69 6e 74 20 6a 74 41 63 63 65  tatic int jtAcce
16e0: 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ss(sqlite3_vfs*,
16f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
1700: 6d 65 2c 20 69 6e 74 20 66 6c 61 67 73 2c 20 69  me, int flags, i
1710: 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  nt *);.static in
1720: 74 20 6a 74 46 75 6c 6c 50 61 74 68 6e 61 6d 65  t jtFullPathname
1730: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63  (sqlite3_vfs*, c
1740: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
1750: 2c 20 69 6e 74 2c 20 63 68 61 72 20 2a 7a 4f 75  , int, char *zOu
1760: 74 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  t);.static void 
1770: 2a 6a 74 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  *jtDlOpen(sqlite
1780: 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68  3_vfs*, const ch
1790: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ar *zFilename);.
17a0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 74 44 6c  static void jtDl
17b0: 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66  Error(sqlite3_vf
17c0: 73 2a 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63  s*, int nByte, c
17d0: 68 61 72 20 2a 7a 45 72 72 4d 73 67 29 3b 0a 73  har *zErrMsg);.s
17e0: 74 61 74 69 63 20 76 6f 69 64 20 28 2a 6a 74 44  tatic void (*jtD
17f0: 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f 76 66 73  lSym(sqlite3_vfs
1800: 2a 2c 76 6f 69 64 2a 2c 20 63 6f 6e 73 74 20 63  *,void*, const c
1810: 68 61 72 20 2a 7a 53 79 6d 62 6f 6c 29 29 28 76  har *zSymbol))(v
1820: 6f 69 64 29 3b 0a 73 74 61 74 69 63 20 76 6f 69  oid);.static voi
1830: 64 20 6a 74 44 6c 43 6c 6f 73 65 28 73 71 6c 69  d jtDlClose(sqli
1840: 74 65 33 5f 76 66 73 2a 2c 20 76 6f 69 64 2a 29  te3_vfs*, void*)
1850: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 52  ;.static int jtR
1860: 61 6e 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65  andomness(sqlite
1870: 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74  3_vfs*, int nByt
1880: 65 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0a  e, char *zOut);.
1890: 73 74 61 74 69 63 20 69 6e 74 20 6a 74 53 6c 65  static int jtSle
18a0: 65 70 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ep(sqlite3_vfs*,
18b0: 20 69 6e 74 20 6d 69 63 72 6f 73 65 63 6f 6e 64   int microsecond
18c0: 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  s);.static int j
18d0: 74 43 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c  tCurrentTime(sql
18e0: 69 74 65 33 5f 76 66 73 2a 2c 20 64 6f 75 62 6c  ite3_vfs*, doubl
18f0: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
1900: 6a 74 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  jtCurrentTimeInt
1910: 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  64(sqlite3_vfs*,
1920: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 2a 29   sqlite3_int64*)
1930: 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  ;..static sqlite
1940: 33 5f 76 66 73 20 6a 74 5f 76 66 73 20 3d 20 7b  3_vfs jt_vfs = {
1950: 0a 20 20 32 2c 20 20 20 20 20 20 20 20 20 20 20  .  2,           
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
1980: 0a 20 20 73 69 7a 65 6f 66 28 6a 74 5f 66 69 6c  .  sizeof(jt_fil
1990: 65 29 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  e),             
19a0: 20 20 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f    /* szOsFile */
19b0: 0a 20 20 4a 54 5f 4d 41 58 5f 50 41 54 48 4e 41  .  JT_MAX_PATHNA
19c0: 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ME,             
19d0: 20 20 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20    /* mxPathname 
19e0: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a      /* pNext */.
1a10: 20 20 4a 54 5f 56 46 53 5f 4e 41 4d 45 2c 20 20    JT_VFS_NAME,  
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30   /* zName */.  0
1a40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a60: 20 70 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 6a   pAppData */.  j
1a70: 74 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  tOpen,          
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1a90: 20 78 4f 70 65 6e 20 2a 2f 0a 20 20 6a 74 44 65   xOpen */.  jtDe
1aa0: 6c 65 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  lete,           
1ab0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1ac0: 65 6c 65 74 65 20 2a 2f 0a 20 20 6a 74 41 63 63  elete */.  jtAcc
1ad0: 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20 20  ess,            
1ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63            /* xAc
1af0: 63 65 73 73 20 2a 2f 0a 20 20 6a 74 46 75 6c 6c  cess */.  jtFull
1b00: 50 61 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20  Pathname,       
1b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c           /* xFul
1b20: 6c 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 6a  lPathname */.  j
1b30: 74 44 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20  tDlOpen,        
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b50: 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 6a 74   xDlOpen */.  jt
1b60: 44 6c 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20  DlError,        
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b80: 78 44 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 6a 74  xDlError */.  jt
1b90: 44 6c 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20  DlSym,          
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1bb0: 78 44 6c 53 79 6d 20 2a 2f 0a 20 20 6a 74 44 6c  xDlSym */.  jtDl
1bc0: 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20  Close,          
1bd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1be0: 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20 6a 74 52 61  lClose */.  jtRa
1bf0: 6e 64 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20  ndomness,       
1c00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52             /* xR
1c10: 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 6a  andomness */.  j
1c20: 74 53 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20  tSleep,         
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1c40: 20 78 53 6c 65 65 70 20 2a 2f 0a 20 20 6a 74 43   xSleep */.  jtC
1c50: 75 72 72 65 6e 74 54 69 6d 65 2c 20 20 20 20 20  urrentTime,     
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c70: 43 75 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 20  CurrentTime */. 
1c80: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 2f 2a 20 78 47 65 74 4c 61 73 74 45 72 72 6f 72  /* xGetLastError
1cb0: 20 2a 2f 0a 20 20 6a 74 43 75 72 72 65 6e 74 54   */.  jtCurrentT
1cc0: 69 6d 65 49 6e 74 36 34 20 20 20 20 20 20 20 20  imeInt64        
1cd0: 20 20 20 20 20 2f 2a 20 78 43 75 72 72 65 6e 74       /* xCurrent
1ce0: 54 69 6d 65 49 6e 74 36 34 20 2a 2f 0a 7d 3b 0a  TimeInt64 */.};.
1cf0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
1d00: 69 6f 5f 6d 65 74 68 6f 64 73 20 6a 74 5f 69 6f  io_methods jt_io
1d10: 5f 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 31  _methods = {.  1
1d20: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d40: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 6a   iVersion */.  j
1d50: 74 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  tClose,         
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d70: 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 6a 74 52   xClose */.  jtR
1d80: 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1da0: 52 65 61 64 20 2a 2f 0a 20 20 6a 74 57 72 69 74  Read */.  jtWrit
1db0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1dc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
1dd0: 74 65 20 2a 2f 0a 20 20 6a 74 54 72 75 6e 63 61  te */.  jtTrunca
1de0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1df0: 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
1e00: 61 74 65 20 2a 2f 0a 20 20 6a 74 53 79 6e 63 2c  ate */.  jtSync,
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
1e30: 20 2a 2f 0a 20 20 6a 74 46 69 6c 65 53 69 7a 65   */.  jtFileSize
1e40: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1e50: 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
1e60: 65 20 2a 2f 0a 20 20 6a 74 4c 6f 63 6b 2c 20 20  e */.  jtLock,  
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e80: 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
1e90: 2f 0a 20 20 6a 74 55 6e 6c 6f 63 6b 2c 20 20 20  /.  jtUnlock,   
1ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb0: 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
1ec0: 0a 20 20 6a 74 43 68 65 63 6b 52 65 73 65 72 76  .  jtCheckReserv
1ed0: 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
1ee0: 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
1ef0: 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 6a 74 46  vedLock */.  jtF
1f00: 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1f20: 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
1f30: 20 6a 74 53 65 63 74 6f 72 53 69 7a 65 2c 20 20   jtSectorSize,  
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
1f60: 2f 0a 20 20 6a 74 44 65 76 69 63 65 43 68 61 72  /.  jtDeviceChar
1f70: 61 63 74 65 72 69 73 74 69 63 73 20 20 20 20 20  acteristics     
1f80: 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61     /* xDeviceCha
1f90: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
1fa0: 7d 3b 0a 0a 73 74 72 75 63 74 20 4a 74 47 6c 6f  };..struct JtGlo
1fb0: 62 61 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  bal {.  sqlite3_
1fc0: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
1fd0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
1fe0: 20 56 46 53 20 2a 2f 0a 20 20 6a 74 5f 66 69 6c   VFS */.  jt_fil
1ff0: 65 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  e *pList;       
2000: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
2010: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 66 69 6c   of all open fil
2020: 65 73 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  es */.};.static 
2030: 73 74 72 75 63 74 20 4a 74 47 6c 6f 62 61 6c 20  struct JtGlobal 
2040: 67 20 3d 20 7b 30 2c 20 30 7d 3b 0a 0a 2f 2a 0a  g = {0, 0};../*.
2050: 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 74 6f 20  ** Functions to 
2060: 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
2070: 71 75 69 73 68 20 61 20 6d 75 74 65 78 20 74 6f  quish a mutex to
2080: 20 70 72 6f 74 65 63 74 20 67 2e 70 4c 69 73 74   protect g.pList
2090: 2e 20 54 68 65 0a 2a 2a 20 53 54 41 54 49 43 5f  . The.** STATIC_
20a0: 50 52 4e 47 20 6d 75 74 65 78 20 69 73 20 72 65  PRNG mutex is re
20b0: 75 73 65 64 2c 20 70 75 72 65 6c 79 20 66 6f 72  used, purely for
20c0: 20 74 68 65 20 73 61 6b 65 20 6f 66 20 63 6f 6e   the sake of con
20d0: 76 65 6e 69 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  venience..*/.sta
20e0: 74 69 63 20 76 6f 69 64 20 65 6e 74 65 72 4a 74  tic void enterJt
20f0: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
2100: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
2110: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
2120: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
2130: 54 45 58 5f 53 54 41 54 49 43 5f 50 52 4e 47 29  TEX_STATIC_PRNG)
2140: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
2150: 20 6c 65 61 76 65 4a 74 4d 75 74 65 78 28 76 6f   leaveJtMutex(vo
2160: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
2170: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
2180: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
2190: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
21a0: 49 43 5f 50 52 4e 47 29 29 3b 0a 7d 0a 0a 65 78  IC_PRNG));.}..ex
21b0: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
21c0: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
21d0: 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  g;.extern int sq
21e0: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
21f0: 69 74 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  it;.static void 
2200: 73 74 6f 70 5f 69 6f 65 72 72 5f 73 69 6d 75 6c  stop_ioerr_simul
2210: 61 74 69 6f 6e 28 69 6e 74 20 2a 70 69 53 61 76  ation(int *piSav
2220: 65 2c 20 69 6e 74 20 2a 70 69 53 61 76 65 32 29  e, int *piSave2)
2230: 7b 0a 20 20 2a 70 69 53 61 76 65 20 3d 20 73 71  {.  *piSave = sq
2240: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
2250: 65 6e 64 69 6e 67 3b 0a 20 20 2a 70 69 53 61 76  ending;.  *piSav
2260: 65 32 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  e2 = sqlite3_io_
2270: 65 72 72 6f 72 5f 68 69 74 3b 0a 20 20 73 71 6c  error_hit;.  sql
2280: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
2290: 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 20 20 73 71  nding = -1;.  sq
22a0: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68  lite3_io_error_h
22b0: 69 74 20 3d 20 30 3b 0a 7d 0a 73 74 61 74 69 63  it = 0;.}.static
22c0: 20 76 6f 69 64 20 73 74 61 72 74 5f 69 6f 65 72   void start_ioer
22d0: 72 5f 73 69 6d 75 6c 61 74 69 6f 6e 28 69 6e 74  r_simulation(int
22e0: 20 69 53 61 76 65 2c 20 69 6e 74 20 69 53 61 76   iSave, int iSav
22f0: 65 32 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  e2){.  sqlite3_i
2300: 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
2310: 3d 20 69 53 61 76 65 3b 0a 20 20 73 71 6c 69 74  = iSave;.  sqlit
2320: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 20  e3_io_error_hit 
2330: 3d 20 69 53 61 76 65 32 3b 0a 7d 0a 0a 2f 2a 0a  = iSave2;.}../*.
2340: 2a 2a 20 54 68 65 20 6a 74 5f 66 69 6c 65 20 70  ** The jt_file p
2350: 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
2360: 20 61 72 67 75 6d 65 6e 74 20 6d 61 79 20 6f 72   argument may or
2370: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 66 69   may not be a fi
2380: 6c 65 2d 68 61 6e 64 6c 65 0a 2a 2a 20 6f 70 65  le-handle.** ope
2390: 6e 20 6f 6e 20 61 20 6d 61 69 6e 20 64 61 74 61  n on a main data
23a0: 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74  base file. If it
23b0: 20 69 73 2c 20 61 6e 64 20 61 20 74 72 61 6e 73   is, and a trans
23c0: 61 63 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e  action is curren
23d0: 74 6c 79 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e  tly.** opened on
23e0: 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 6e 20   the file, then 
23f0: 64 69 73 63 61 72 64 20 61 6c 6c 20 74 72 61 6e  discard all tran
2400: 73 61 63 74 69 6f 6e 20 72 65 6c 61 74 65 64 20  saction related 
2410: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
2420: 76 6f 69 64 20 63 6c 6f 73 65 54 72 61 6e 73 61  void closeTransa
2430: 63 74 69 6f 6e 28 6a 74 5f 66 69 6c 65 20 2a 70  ction(jt_file *p
2440: 29 7b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  ){.  sqlite3Bitv
2450: 65 63 44 65 73 74 72 6f 79 28 70 2d 3e 70 57 72  ecDestroy(p->pWr
2460: 69 74 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74  itable);.  sqlit
2470: 65 33 5f 66 72 65 65 28 70 2d 3e 61 43 6b 73 75  e3_free(p->aCksu
2480: 6d 29 3b 0a 20 20 70 2d 3e 70 57 72 69 74 61 62  m);.  p->pWritab
2490: 6c 65 20 3d 20 30 3b 0a 20 20 70 2d 3e 61 43 6b  le = 0;.  p->aCk
24a0: 73 75 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 53  sum = 0;.  p->nS
24b0: 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  ync = 0;.}../*.*
24c0: 2a 20 43 6c 6f 73 65 20 61 6e 20 6a 74 2d 66 69  * Close an jt-fi
24d0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
24e0: 74 20 6a 74 43 6c 6f 73 65 28 73 71 6c 69 74 65  t jtClose(sqlite
24f0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
2500: 20 20 6a 74 5f 66 69 6c 65 20 2a 2a 70 70 3b 0a    jt_file **pp;.
2510: 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28    jt_file *p = (
2520: 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  jt_file *)pFile;
2530: 0a 0a 20 20 63 6c 6f 73 65 54 72 61 6e 73 61 63  ..  closeTransac
2540: 74 69 6f 6e 28 70 29 3b 0a 20 20 65 6e 74 65 72  tion(p);.  enter
2550: 4a 74 4d 75 74 65 78 28 29 3b 0a 20 20 69 66 28  JtMutex();.  if(
2560: 20 70 2d 3e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20   p->zName ){.   
2570: 20 66 6f 72 28 70 70 3d 26 67 2e 70 4c 69 73 74   for(pp=&g.pList
2580: 3b 20 2a 70 70 21 3d 70 3b 20 70 70 3d 26 28 2a  ; *pp!=p; pp=&(*
2590: 70 70 29 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20  pp)->pNext);.   
25a0: 20 2a 70 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b   *pp = p->pNext;
25b0: 0a 20 20 7d 0a 20 20 6c 65 61 76 65 4a 74 4d 75  .  }.  leaveJtMu
25c0: 74 65 78 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  tex();.  sqlite3
25d0: 4f 73 43 6c 6f 73 65 28 70 2d 3e 70 52 65 61 6c  OsClose(p->pReal
25e0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
25f0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
2600: 52 65 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61  Read data from a
2610: 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  n jt-file..*/.st
2620: 61 74 69 63 20 69 6e 74 20 6a 74 52 65 61 64 28  atic int jtRead(
2630: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
2640: 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20  *pFile, .  void 
2650: 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41  *zBuf, .  int iA
2660: 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e  mt, .  sqlite_in
2670: 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 6a  t64 iOfst.){.  j
2680: 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f  t_file *p = (jt_
2690: 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
26a0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
26b0: 52 65 61 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a  Read(p->pReal, z
26c0: 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74  Buf, iAmt, iOfst
26d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61  );.}../*.** Para
26e0: 6d 65 74 65 72 20 7a 4a 6f 75 72 6e 61 6c 20 69  meter zJournal i
26f0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
2700: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
2710: 74 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a  t is currently .
2720: 2a 2a 20 6f 70 65 6e 2e 20 54 68 69 73 20 66 75  ** open. This fu
2730: 6e 63 74 69 6f 6e 20 6c 6f 63 61 74 65 73 20 61  nction locates a
2740: 6e 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 68  nd returns the h
2750: 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20  andle opened on 
2760: 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e  the.** correspon
2770: 64 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69  ding database fi
2780: 6c 65 20 62 79 20 74 68 65 20 70 61 67 65 72 20  le by the pager 
2790: 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68  that currently h
27a0: 61 73 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  as the.** journa
27b0: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 2e 20 54  l file opened. T
27c0: 68 69 73 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20  his file-handle 
27d0: 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
27e0: 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69   the .** followi
27f0: 6e 67 20 70 72 6f 70 65 72 74 69 65 73 3a 0a 2a  ng properties:.*
2800: 2a 0a 2a 2a 20 20 20 61 29 20 53 51 4c 49 54 45  *.**   a) SQLITE
2810: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 77 61  _OPEN_MAIN_DB wa
2820: 73 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e  s specified when
2830: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
2840: 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29  ened..**.**   b)
2850: 20 54 68 65 20 66 69 6c 65 2d 6e 61 6d 65 20 73   The file-name s
2860: 70 65 63 69 66 69 65 64 20 77 68 65 6e 20 74 68  pecified when th
2870: 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65  e file was opene
2880: 64 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20 20 20  d matches.**    
2890: 20 20 61 6c 6c 20 62 75 74 20 74 68 65 20 66 69    all but the fi
28a0: 6e 61 6c 20 38 20 63 68 61 72 61 63 74 65 72 73  nal 8 characters
28b0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
28c0: 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  file name..**.**
28d0: 20 20 20 63 29 20 54 68 65 72 65 20 69 73 20 63     c) There is c
28e0: 75 72 72 65 6e 74 6c 79 20 61 20 72 65 73 65 72  urrently a reser
28f0: 76 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ved lock on the 
2900: 66 69 6c 65 2e 0a 2a 2a 2f 0a 73 74 61 74 69 63  file..**/.static
2910: 20 6a 74 5f 66 69 6c 65 20 2a 6c 6f 63 61 74 65   jt_file *locate
2920: 44 61 74 61 62 61 73 65 48 61 6e 64 6c 65 28 63  DatabaseHandle(c
2930: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a 6f 75 72  onst char *zJour
2940: 6e 61 6c 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20  nal){.  jt_file 
2950: 2a 70 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 65 6e  *pMain = 0;.  en
2960: 74 65 72 4a 74 4d 75 74 65 78 28 29 3b 0a 20 20  terJtMutex();.  
2970: 66 6f 72 28 70 4d 61 69 6e 3d 67 2e 70 4c 69 73  for(pMain=g.pLis
2980: 74 3b 20 70 4d 61 69 6e 3b 20 70 4d 61 69 6e 3d  t; pMain; pMain=
2990: 70 4d 61 69 6e 2d 3e 70 4e 65 78 74 29 7b 0a 20  pMain->pNext){. 
29a0: 20 20 20 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 28     int nName = (
29b0: 69 6e 74 29 28 73 74 72 6c 65 6e 28 7a 4a 6f 75  int)(strlen(zJou
29c0: 72 6e 61 6c 29 20 2d 20 73 74 72 6c 65 6e 28 22  rnal) - strlen("
29d0: 2d 6a 6f 75 72 6e 61 6c 22 29 29 3b 0a 20 20 20  -journal"));.   
29e0: 20 69 66 28 20 28 70 4d 61 69 6e 2d 3e 66 6c 61   if( (pMain->fla
29f0: 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  gs&SQLITE_OPEN_M
2a00: 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 26 26 20  AIN_DB).     && 
2a10: 28 28 69 6e 74 29 73 74 72 6c 65 6e 28 70 4d 61  ((int)strlen(pMa
2a20: 69 6e 2d 3e 7a 4e 61 6d 65 29 3d 3d 6e 4e 61 6d  in->zName)==nNam
2a30: 65 29 0a 20 20 20 20 20 26 26 20 30 3d 3d 6d 65  e).     && 0==me
2a40: 6d 63 6d 70 28 70 4d 61 69 6e 2d 3e 7a 4e 61 6d  mcmp(pMain->zNam
2a50: 65 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 6e 4e 61  e, zJournal, nNa
2a60: 6d 65 29 0a 20 20 20 20 20 26 26 20 28 70 4d 61  me).     && (pMa
2a70: 69 6e 2d 3e 65 4c 6f 63 6b 3e 3d 53 51 4c 49 54  in->eLock>=SQLIT
2a80: 45 5f 4c 4f 43 4b 5f 52 45 53 45 52 56 45 44 29  E_LOCK_RESERVED)
2a90: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62 72  .    ){.      br
2aa0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
2ab0: 20 6c 65 61 76 65 4a 74 4d 75 74 65 78 28 29 3b   leaveJtMutex();
2ac0: 0a 20 20 72 65 74 75 72 6e 20 70 4d 61 69 6e 3b  .  return pMain;
2ad0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
2ae0: 74 65 72 20 7a 20 70 6f 69 6e 74 73 20 74 6f 20  ter z points to 
2af0: 61 20 62 75 66 66 65 72 20 6f 66 20 34 20 62 79  a buffer of 4 by
2b00: 74 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74  tes in size cont
2b10: 61 69 6e 69 6e 67 20 61 20 0a 2a 2a 20 75 6e 73  aining a .** uns
2b20: 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
2b30: 65 67 65 72 20 73 74 6f 72 65 64 20 69 6e 20 62  eger stored in b
2b40: 69 67 2d 65 6e 64 69 61 6e 20 66 6f 72 6d 61 74  ig-endian format
2b50: 2e 20 44 65 63 6f 64 65 20 74 68 65 20 0a 2a 2a  . Decode the .**
2b60: 20 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74   integer and ret
2b70: 75 72 6e 20 69 74 73 20 76 61 6c 75 65 2e 0a 2a  urn its value..*
2b80: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 64 65 63  /.static u32 dec
2b90: 6f 64 65 55 69 6e 74 33 32 28 63 6f 6e 73 74 20  odeUint32(const 
2ba0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
2bb0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 28 7a 5b 30  ){.  return (z[0
2bc0: 5d 3c 3c 32 34 29 20 2b 20 28 7a 5b 31 5d 3c 3c  ]<<24) + (z[1]<<
2bd0: 31 36 29 20 2b 20 28 7a 5b 32 5d 3c 3c 38 29 20  16) + (z[2]<<8) 
2be0: 2b 20 7a 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  + z[3];.}../*.**
2bf0: 20 43 61 6c 63 75 6c 61 74 65 20 61 20 63 68 65   Calculate a che
2c00: 63 6b 73 75 6d 20 66 72 6f 6d 20 74 68 65 20 62  cksum from the b
2c10: 75 66 66 65 72 20 6f 66 20 6c 65 6e 67 74 68 20  uffer of length 
2c20: 6e 20 62 79 74 65 73 20 70 6f 69 6e 74 65 64 20  n bytes pointed 
2c30: 74 6f 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74  to.** by paramet
2c40: 65 72 20 7a 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  er z..*/.static 
2c50: 75 33 32 20 67 65 6e 43 6b 73 75 6d 28 63 6f 6e  u32 genCksum(con
2c60: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
2c70: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
2c80: 6e 74 20 69 3b 0a 20 20 75 33 32 20 63 6b 73 75  nt i;.  u32 cksu
2c90: 6d 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  m = 0;.  for(i=0
2ca0: 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
2cb0: 20 63 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 20 2b   cksum = cksum +
2cc0: 20 7a 5b 69 5d 20 2b 20 28 63 6b 73 75 6d 3c 3c   z[i] + (cksum<<
2cd0: 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  3);.  }.  return
2ce0: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
2cf0: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
2d00: 65 6e 74 2c 20 7a 42 75 66 2c 20 70 6f 69 6e 74  ent, zBuf, point
2d10: 73 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  s to a buffer co
2d20: 6e 74 61 69 6e 69 6e 67 20 61 20 32 38 20 62 79  ntaining a 28 by
2d30: 74 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64  te.** serialized
2d40: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
2d50: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
2d60: 65 73 65 72 69 61 6c 69 7a 65 73 20 66 6f 75 72  eserializes four
2d70: 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67   of the.** integ
2d80: 65 72 20 66 69 65 6c 64 73 20 63 6f 6e 74 61 69  er fields contai
2d90: 6e 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ned in the journ
2da0: 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 77 72  al header and wr
2db0: 69 74 65 73 20 74 68 65 69 72 0a 2a 2a 20 76 61  ites their.** va
2dc0: 6c 75 65 73 20 74 6f 20 74 68 65 20 6f 75 74 70  lues to the outp
2dd0: 75 74 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  ut variables..**
2de0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  .** SQLITE_OK is
2df0: 20 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65   returned if the
2e00: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
2e10: 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  is successfully 
2e20: 0a 2a 2a 20 64 65 63 6f 64 65 64 2e 20 4f 74 68  .** decoded. Oth
2e30: 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 45  erwise, SQLITE_E
2e40: 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  RROR..*/.static 
2e50: 69 6e 74 20 64 65 63 6f 64 65 4a 6f 75 72 6e 61  int decodeJourna
2e60: 6c 48 64 72 28 0a 20 20 63 6f 6e 73 74 20 75 6e  lHdr(.  const un
2e70: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75  signed char *zBu
2e80: 66 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  f,         /* In
2e90: 70 75 74 3a 20 32 38 20 62 79 74 65 20 6a 6f 75  put: 28 byte jou
2ea0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
2eb0: 20 75 33 32 20 2a 70 6e 52 65 63 2c 20 20 20 20   u32 *pnRec,    
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ed0: 20 20 20 20 2f 2a 20 4f 75 74 3a 20 4e 75 6d 62      /* Out: Numb
2ee0: 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 6c 65 64  er of journalled
2ef0: 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 75 33   records */.  u3
2f00: 32 20 2a 70 6e 50 61 67 65 2c 20 20 20 20 20 20  2 *pnPage,      
2f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f20: 20 2f 2a 20 4f 75 74 3a 20 4f 72 69 67 69 6e 61   /* Out: Origina
2f30: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
2f40: 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 33 32 20 2a  count */.  u32 *
2f50: 70 6e 53 65 63 74 6f 72 2c 20 20 20 20 20 20 20  pnSector,       
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2f70: 20 4f 75 74 3a 20 53 65 63 74 6f 72 20 73 69 7a   Out: Sector siz
2f80: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
2f90: 75 33 32 20 2a 70 6e 50 61 67 65 73 69 7a 65 20  u32 *pnPagesize 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 2f 2a 20 4f 75 74 3a 20 50 61 67 65 20     /* Out: Page 
2fc0: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  size in bytes */
2fd0: 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  .){.  unsigned c
2fe0: 68 61 72 20 61 4d 61 67 69 63 5b 5d 20 3d 20 7b  har aMagic[] = {
2ff0: 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30   0xd9, 0xd5, 0x0
3000: 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30  5, 0xf9, 0x20, 0
3010: 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 20  xa1, 0x63, 0xd7 
3020: 7d 3b 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  };.  if( memcmp(
3030: 61 4d 61 67 69 63 2c 20 7a 42 75 66 2c 20 38 29  aMagic, zBuf, 8)
3040: 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
3050: 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70 6e  _ERROR;.  if( pn
3060: 52 65 63 20 29 20 2a 70 6e 52 65 63 20 3d 20 64  Rec ) *pnRec = d
3070: 65 63 6f 64 65 55 69 6e 74 33 32 28 26 7a 42 75  ecodeUint32(&zBu
3080: 66 5b 38 5d 29 3b 0a 20 20 69 66 28 20 70 6e 50  f[8]);.  if( pnP
3090: 61 67 65 20 29 20 2a 70 6e 50 61 67 65 20 3d 20  age ) *pnPage = 
30a0: 64 65 63 6f 64 65 55 69 6e 74 33 32 28 26 7a 42  decodeUint32(&zB
30b0: 75 66 5b 31 36 5d 29 3b 0a 20 20 69 66 28 20 70  uf[16]);.  if( p
30c0: 6e 53 65 63 74 6f 72 20 29 20 2a 70 6e 53 65 63  nSector ) *pnSec
30d0: 74 6f 72 20 3d 20 64 65 63 6f 64 65 55 69 6e 74  tor = decodeUint
30e0: 33 32 28 26 7a 42 75 66 5b 32 30 5d 29 3b 0a 20  32(&zBuf[20]);. 
30f0: 20 69 66 28 20 70 6e 50 61 67 65 73 69 7a 65 20   if( pnPagesize 
3100: 29 20 2a 70 6e 50 61 67 65 73 69 7a 65 20 3d 20  ) *pnPagesize = 
3110: 64 65 63 6f 64 65 55 69 6e 74 33 32 28 26 7a 42  decodeUint32(&zB
3120: 75 66 5b 32 34 5d 29 3b 0a 20 20 72 65 74 75 72  uf[24]);.  retur
3130: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
3140: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
3150: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68  ion is called wh
3160: 65 6e 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  en a new transac
3170: 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2c 20  tion is opened, 
3180: 6a 75 73 74 20 61 66 74 65 72 0a 2a 2a 20 74 68  just after.** th
3190: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  e first journal-
31a0: 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
31b0: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
31c0: 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
31d0: 20 69 6e 74 20 6f 70 65 6e 54 72 61 6e 73 61 63   int openTransac
31e0: 74 69 6f 6e 28 6a 74 5f 66 69 6c 65 20 2a 70 4d  tion(jt_file *pM
31f0: 61 69 6e 2c 20 6a 74 5f 66 69 6c 65 20 2a 70 4a  ain, jt_file *pJ
3200: 6f 75 72 6e 61 6c 29 7b 0a 20 20 75 6e 73 69 67  ournal){.  unsig
3210: 6e 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b  ned char *aData;
3220: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
3230: 2a 70 20 3d 20 70 4d 61 69 6e 2d 3e 70 52 65 61  *p = pMain->pRea
3240: 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  l;.  int rc = SQ
3250: 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 63 6c 6f 73  LITE_OK;..  clos
3260: 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 4d 61  eTransaction(pMa
3270: 69 6e 29 3b 0a 20 20 61 44 61 74 61 20 3d 20 73  in);.  aData = s
3280: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 4d  qlite3_malloc(pM
3290: 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 29 3b  ain->nPagesize);
32a0: 0a 20 20 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61  .  pMain->pWrita
32b0: 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74  ble = sqlite3Bit
32c0: 76 65 63 43 72 65 61 74 65 28 70 4d 61 69 6e 2d  vecCreate(pMain-
32d0: 3e 6e 50 61 67 65 29 3b 0a 20 20 70 4d 61 69 6e  >nPage);.  pMain
32e0: 2d 3e 61 43 6b 73 75 6d 20 3d 20 73 71 6c 69 74  ->aCksum = sqlit
32f0: 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  e3_malloc(sizeof
3300: 28 75 33 32 29 20 2a 20 28 70 4d 61 69 6e 2d 3e  (u32) * (pMain->
3310: 6e 50 61 67 65 20 2b 20 31 29 29 3b 0a 20 20 70  nPage + 1));.  p
3320: 4a 6f 75 72 6e 61 6c 2d 3e 69 4d 61 78 4f 66 66  Journal->iMaxOff
3330: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 21 70 4d   = 0;..  if( !pM
3340: 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65 20 7c  ain->pWritable |
3350: 7c 20 21 70 4d 61 69 6e 2d 3e 61 43 6b 73 75 6d  | !pMain->aCksum
3360: 20 7c 7c 20 21 61 44 61 74 61 20 29 7b 0a 20 20   || !aData ){.  
3370: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f    rc = SQLITE_IO
3380: 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ERR_NOMEM;.  }el
3390: 73 65 20 69 66 28 20 70 4d 61 69 6e 2d 3e 6e 50  se if( pMain->nP
33a0: 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33 32  age>0 ){.    u32
33b0: 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 69 6e 74   iTrunk;.    int
33c0: 20 69 53 61 76 65 3b 0a 20 20 20 20 69 6e 74 20   iSave;.    int 
33d0: 69 53 61 76 65 32 3b 0a 0a 20 20 20 20 73 74 6f  iSave2;..    sto
33e0: 70 5f 69 6f 65 72 72 5f 73 69 6d 75 6c 61 74 69  p_ioerr_simulati
33f0: 6f 6e 28 26 69 53 61 76 65 2c 20 26 69 53 61 76  on(&iSave, &iSav
3400: 65 32 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  e2);..    /* Rea
3410: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
3420: 72 65 65 2d 6c 69 73 74 2e 20 41 64 64 20 74 68  ree-list. Add th
3430: 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 66 6f  e page-number fo
3440: 72 20 65 61 63 68 20 66 72 65 65 2d 6c 69 73 74  r each free-list
3450: 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20 74 6f 20  .    ** leaf to 
3460: 74 68 65 20 6a 74 5f 66 69 6c 65 2e 70 57 72 69  the jt_file.pWri
3470: 74 61 62 6c 65 20 62 69 74 76 65 63 2e 0a 20 20  table bitvec..  
3480: 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
3490: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 2c 20 61  lite3OsRead(p, a
34a0: 44 61 74 61 2c 20 70 4d 61 69 6e 2d 3e 6e 50 61  Data, pMain->nPa
34b0: 67 65 73 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20  gesize, 0);.    
34c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
34d0: 4b 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6e  K ){.      u32 n
34e0: 44 62 73 69 7a 65 20 3d 20 64 65 63 6f 64 65 55  Dbsize = decodeU
34f0: 69 6e 74 33 32 28 26 61 44 61 74 61 5b 32 38 5d  int32(&aData[28]
3500: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 44 62  );.      if( nDb
3510: 73 69 7a 65 3e 30 20 26 26 20 6d 65 6d 63 6d 70  size>0 && memcmp
3520: 28 26 61 44 61 74 61 5b 32 34 5d 2c 20 26 61 44  (&aData[24], &aD
3530: 61 74 61 5b 39 32 5d 2c 20 34 29 3d 3d 30 20 29  ata[92], 4)==0 )
3540: 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 69 50  {.        u32 iP
3550: 67 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  g;.        for(i
3560: 50 67 3d 6e 44 62 73 69 7a 65 2b 31 3b 20 69 50  Pg=nDbsize+1; iP
3570: 67 3c 3d 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 3b  g<=pMain->nPage;
3580: 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20   iPg++){.       
3590: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
35a0: 53 65 74 28 70 4d 61 69 6e 2d 3e 70 57 72 69 74  Set(pMain->pWrit
35b0: 61 62 6c 65 2c 20 69 50 67 29 3b 0a 20 20 20 20  able, iPg);.    
35c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35d0: 20 20 7d 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d    }.    iTrunk =
35e0: 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28 26 61   decodeUint32(&a
35f0: 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 77  Data[32]);.    w
3600: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
3610: 5f 4f 4b 20 26 26 20 69 54 72 75 6e 6b 3e 30 20  _OK && iTrunk>0 
3620: 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 4c 65  ){.      u32 nLe
3630: 61 66 3b 0a 20 20 20 20 20 20 75 33 32 20 69 4c  af;.      u32 iL
3640: 65 61 66 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eaf;.      sqlit
3650: 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 20 3d 20  e3_int64 iOff = 
3660: 28 69 36 34 29 28 69 54 72 75 6e 6b 2d 31 29 2a  (i64)(iTrunk-1)*
3670: 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65  pMain->nPagesize
3680: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
3690: 69 74 65 33 4f 73 52 65 61 64 28 70 2c 20 61 44  ite3OsRead(p, aD
36a0: 61 74 61 2c 20 70 4d 61 69 6e 2d 3e 6e 50 61 67  ata, pMain->nPag
36b0: 65 73 69 7a 65 2c 20 69 4f 66 66 29 3b 0a 20 20  esize, iOff);.  
36c0: 20 20 20 20 6e 4c 65 61 66 20 3d 20 64 65 63 6f      nLeaf = deco
36d0: 64 65 55 69 6e 74 33 32 28 26 61 44 61 74 61 5b  deUint32(&aData[
36e0: 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  4]);.      for(i
36f0: 4c 65 61 66 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  Leaf=0; rc==SQLI
3700: 54 45 5f 4f 4b 20 26 26 20 69 4c 65 61 66 3c 6e  TE_OK && iLeaf<n
3710: 4c 65 61 66 3b 20 69 4c 65 61 66 2b 2b 29 7b 0a  Leaf; iLeaf++){.
3720: 20 20 20 20 20 20 20 20 75 33 32 20 70 67 6e 6f          u32 pgno
3730: 20 3d 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28   = decodeUint32(
3740: 26 61 44 61 74 61 5b 38 2b 34 2a 69 4c 65 61 66  &aData[8+4*iLeaf
3750: 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ]);.        sqli
3760: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 4d 61  te3BitvecSet(pMa
3770: 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65 2c 20 70  in->pWritable, p
3780: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  gno);.      }.  
3790: 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 64 65 63      iTrunk = dec
37a0: 6f 64 65 55 69 6e 74 33 32 28 61 44 61 74 61 29  odeUint32(aData)
37b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
37c0: 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20 73 74  Calculate and st
37d0: 6f 72 65 20 61 20 63 68 65 63 6b 73 75 6d 20 66  ore a checksum f
37e0: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
37f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
3800: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  e. */.    if( rc
3810: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
3820: 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
3830: 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d     for(ii=0; rc=
3840: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
3850: 3c 28 69 6e 74 29 70 4d 61 69 6e 2d 3e 6e 50 61  <(int)pMain->nPa
3860: 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  ge; ii++){.     
3870: 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 28 69     i64 iOff = (i
3880: 36 34 29 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65  64)(pMain->nPage
3890: 73 69 7a 65 29 20 2a 20 28 69 36 34 29 69 69 3b  size) * (i64)ii;
38a0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f 66  .        if( iOf
38b0: 66 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  f==PENDING_BYTE 
38c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
38d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
38e0: 4f 73 52 65 61 64 28 70 4d 61 69 6e 2d 3e 70 52  OsRead(pMain->pR
38f0: 65 61 6c 2c 20 61 44 61 74 61 2c 20 70 4d 61 69  eal, aData, pMai
3900: 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 2c 20 69 4f  n->nPagesize, iO
3910: 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 61  ff);.        pMa
3920: 69 6e 2d 3e 61 43 6b 73 75 6d 5b 69 69 5d 20 3d  in->aCksum[ii] =
3930: 20 67 65 6e 43 6b 73 75 6d 28 61 44 61 74 61 2c   genCksum(aData,
3940: 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a   pMain->nPagesiz
3950: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
3960: 69 69 2b 31 3d 3d 28 69 6e 74 29 70 4d 61 69 6e  ii+1==(int)pMain
3970: 2d 3e 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53  ->nPage && rc==S
3980: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
3990: 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
39a0: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
39b0: 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OK;.        }.  
39c0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
39d0: 20 73 74 61 72 74 5f 69 6f 65 72 72 5f 73 69 6d   start_ioerr_sim
39e0: 75 6c 61 74 69 6f 6e 28 69 53 61 76 65 2c 20 69  ulation(iSave, i
39f0: 53 61 76 65 32 29 3b 0a 20 20 7d 0a 0a 20 20 73  Save2);.  }..  s
3a00: 71 6c 69 74 65 33 5f 66 72 65 65 28 61 44 61 74  qlite3_free(aDat
3a10: 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  a);.  return rc;
3a20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69  .}../*.** The fi
3a30: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  rst argument to 
3a40: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
3a50: 20 61 20 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f   a handle open o
3a60: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
3a70: 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  ..** This functi
3a80: 6f 6e 20 72 65 61 64 73 20 74 68 65 20 6a 6f 75  on reads the jou
3a90: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 61 64  rnal file and ad
3aa0: 64 73 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ds the page numb
3ab0: 65 72 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 70  er for each.** p
3ac0: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
3ad0: 61 6c 20 74 6f 20 74 68 65 20 42 69 74 76 65 63  al to the Bitvec
3ae0: 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20 61   object passed a
3af0: 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
3b00: 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  ument..*/.static
3b10: 20 69 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c   int readJournal
3b20: 46 69 6c 65 28 6a 74 5f 66 69 6c 65 20 2a 70 2c  File(jt_file *p,
3b30: 20 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 29   jt_file *pMain)
3b40: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
3b50: 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e  ITE_OK;.  unsign
3b60: 65 64 20 63 68 61 72 20 7a 42 75 66 5b 32 38 5d  ed char zBuf[28]
3b70: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
3b80: 20 2a 70 52 65 61 6c 20 3d 20 70 2d 3e 70 52 65   *pReal = p->pRe
3b90: 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e  al;.  sqlite3_in
3ba0: 74 36 34 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20  t64 iOff = 0;.  
3bb0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53  sqlite3_int64 iS
3bc0: 69 7a 65 20 3d 20 70 2d 3e 69 4d 61 78 4f 66 66  ize = p->iMaxOff
3bd0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
3be0: 72 20 2a 61 50 61 67 65 3b 0a 20 20 69 6e 74 20  r *aPage;.  int 
3bf0: 69 53 61 76 65 3b 0a 20 20 69 6e 74 20 69 53 61  iSave;.  int iSa
3c00: 76 65 32 3b 0a 0a 20 20 61 50 61 67 65 20 3d 20  ve2;..  aPage = 
3c10: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
3c20: 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 29  Main->nPagesize)
3c30: 3b 0a 20 20 69 66 28 20 21 61 50 61 67 65 20 29  ;.  if( !aPage )
3c40: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
3c50: 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b  ITE_IOERR_NOMEM;
3c60: 0a 20 20 7d 0a 0a 20 20 73 74 6f 70 5f 69 6f 65  .  }..  stop_ioe
3c70: 72 72 5f 73 69 6d 75 6c 61 74 69 6f 6e 28 26 69  rr_simulation(&i
3c80: 53 61 76 65 2c 20 26 69 53 61 76 65 32 29 3b 0a  Save, &iSave2);.
3c90: 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51  .  while( rc==SQ
3ca0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f 66 66 3c  LITE_OK && iOff<
3cb0: 69 53 69 7a 65 20 29 7b 0a 20 20 20 20 75 33 32  iSize ){.    u32
3cc0: 20 6e 52 65 63 2c 20 6e 50 61 67 65 2c 20 6e 53   nRec, nPage, nS
3cd0: 65 63 74 6f 72 2c 20 6e 50 61 67 65 73 69 7a 65  ector, nPagesize
3ce0: 3b 0a 20 20 20 20 75 33 32 20 69 69 3b 0a 0a 20  ;.    u32 ii;.. 
3cf0: 20 20 20 2f 2a 20 52 65 61 64 20 61 6e 64 20 64     /* Read and d
3d00: 65 63 6f 64 65 20 74 68 65 20 6e 65 78 74 20 6a  ecode the next j
3d10: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 72  ournal-header fr
3d20: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
3d30: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  ile. */.    rc =
3d40: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
3d50: 52 65 61 6c 2c 20 7a 42 75 66 2c 20 32 38 2c 20  Real, zBuf, 28, 
3d60: 69 4f 66 66 29 3b 0a 20 20 20 20 69 66 28 20 72  iOff);.    if( r
3d70: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 0a 20 20  c!=SQLITE_OK .  
3d80: 20 20 20 7c 7c 20 64 65 63 6f 64 65 4a 6f 75 72     || decodeJour
3d90: 6e 61 6c 48 64 72 28 7a 42 75 66 2c 20 26 6e 52  nalHdr(zBuf, &nR
3da0: 65 63 2c 20 26 6e 50 61 67 65 2c 20 26 6e 53 65  ec, &nPage, &nSe
3db0: 63 74 6f 72 2c 20 26 6e 50 61 67 65 73 69 7a 65  ctor, &nPagesize
3dc0: 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ) .    ){.      
3dd0: 67 6f 74 6f 20 66 69 6e 69 73 68 5f 72 6a 66 3b  goto finish_rjf;
3de0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f 66 66 20  .    }.    iOff 
3df0: 2b 3d 20 6e 53 65 63 74 6f 72 3b 0a 0a 20 20 20  += nSector;..   
3e00: 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a   if( nRec==0 ){.
3e10: 20 20 20 20 20 20 2f 2a 20 41 20 74 72 69 63 6b        /* A trick
3e20: 2e 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65  . There might be
3e30: 20 61 6e 6f 74 68 65 72 20 6a 6f 75 72 6e 61 6c   another journal
3e40: 2d 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74  -header immediat
3e50: 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a 20 66 6f  ely .      ** fo
3e60: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 6f 6e 65  llowing this one
3e70: 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
3e80: 30 20 72 65 63 6f 72 64 73 20 6d 65 61 6e 73 20  0 records means 
3e90: 30 20 72 65 63 6f 72 64 73 2c 20 0a 20 20 20 20  0 records, .    
3ea0: 20 20 2a 2a 20 6e 6f 74 20 22 72 65 61 64 20 75    ** not "read u
3eb0: 6e 74 69 6c 20 74 68 65 20 65 6e 64 20 6f 66 20  ntil the end of 
3ec0: 74 68 65 20 66 69 6c 65 22 2e 20 53 65 65 20 61  the file". See a
3ed0: 6c 73 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35  lso ticket #2565
3ee0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
3ef0: 20 69 66 28 20 69 53 69 7a 65 3e 3d 28 69 4f 66   if( iSize>=(iOf
3f00: 66 2b 6e 53 65 63 74 6f 72 29 20 29 7b 0a 20 20  f+nSector) ){.  
3f10: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
3f20: 65 33 4f 73 52 65 61 64 28 70 52 65 61 6c 2c 20  e3OsRead(pReal, 
3f30: 7a 42 75 66 2c 20 32 38 2c 20 69 4f 66 66 29 3b  zBuf, 28, iOff);
3f40: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
3f50: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 30 3d  =SQLITE_OK || 0=
3f60: 3d 64 65 63 6f 64 65 4a 6f 75 72 6e 61 6c 48 64  =decodeJournalHd
3f70: 72 28 7a 42 75 66 2c 20 30 2c 20 30 2c 20 30 2c  r(zBuf, 0, 0, 0,
3f80: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
3f90: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
3fa0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3fb0: 20 20 20 6e 52 65 63 20 3d 20 28 75 33 32 29 28     nRec = (u32)(
3fc0: 28 69 53 69 7a 65 2d 69 4f 66 66 29 20 2f 20 28  (iSize-iOff) / (
3fd0: 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65  pMain->nPagesize
3fe0: 2b 38 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  +8));.    }..   
3ff0: 20 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65   /* Read all the
4000: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
4010: 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72 6e 61 6c  llow the journal
4020: 2d 68 65 61 64 65 72 20 6a 75 73 74 20 72 65 61  -header just rea
4030: 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  d. */.    for(ii
4040: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
4050: 4b 20 26 26 20 69 69 3c 6e 52 65 63 20 26 26 20  K && ii<nRec && 
4060: 69 4f 66 66 3c 69 53 69 7a 65 3b 20 69 69 2b 2b  iOff<iSize; ii++
4070: 29 7b 0a 20 20 20 20 20 20 75 33 32 20 70 67 6e  ){.      u32 pgn
4080: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
4090: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 52 65 61  lite3OsRead(pRea
40a0: 6c 2c 20 7a 42 75 66 2c 20 34 2c 20 69 4f 66 66  l, zBuf, 4, iOff
40b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
40c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
40d0: 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 64 65 63        pgno = dec
40e0: 6f 64 65 55 69 6e 74 33 32 28 7a 42 75 66 29 3b  odeUint32(zBuf);
40f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
4100: 6f 3e 30 20 26 26 20 70 67 6e 6f 3c 3d 70 4d 61  o>0 && pgno<=pMa
4110: 69 6e 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20  in->nPage ){.   
4120: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71         if( 0==sq
4130: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
4140: 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65  pMain->pWritable
4150: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
4160: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
4170: 74 65 33 4f 73 52 65 61 64 28 70 52 65 61 6c 2c  te3OsRead(pReal,
4180: 20 61 50 61 67 65 2c 20 70 4d 61 69 6e 2d 3e 6e   aPage, pMain->n
4190: 50 61 67 65 73 69 7a 65 2c 20 69 4f 66 66 2b 34  Pagesize, iOff+4
41a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
41b0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
41c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
41d0: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 67 65    u32 cksum = ge
41e0: 6e 43 6b 73 75 6d 28 61 50 61 67 65 2c 20 70 4d  nCksum(aPage, pM
41f0: 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 29 3b  ain->nPagesize);
4200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
4210: 73 73 65 72 74 28 20 63 6b 73 75 6d 3d 3d 70 4d  ssert( cksum==pM
4220: 61 69 6e 2d 3e 61 43 6b 73 75 6d 5b 70 67 6e 6f  ain->aCksum[pgno
4230: 2d 31 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  -1] );.         
4240: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
4250: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
4260: 65 33 42 69 74 76 65 63 53 65 74 28 70 4d 61 69  e3BitvecSet(pMai
4270: 6e 2d 3e 70 57 72 69 74 61 62 6c 65 2c 20 70 67  n->pWritable, pg
4280: 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  no);.        }. 
4290: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 28         iOff += (
42a0: 38 20 2b 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65  8 + pMain->nPage
42b0: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  size);.      }. 
42c0: 20 20 20 7d 0a 0a 20 20 20 20 69 4f 66 66 20 3d     }..    iOff =
42d0: 20 28 28 69 4f 66 66 20 2b 20 28 6e 53 65 63 74   ((iOff + (nSect
42e0: 6f 72 2d 31 29 29 20 2f 20 6e 53 65 63 74 6f 72  or-1)) / nSector
42f0: 29 20 2a 20 6e 53 65 63 74 6f 72 3b 0a 20 20 7d  ) * nSector;.  }
4300: 0a 0a 66 69 6e 69 73 68 5f 72 6a 66 3a 0a 20 20  ..finish_rjf:.  
4310: 73 74 61 72 74 5f 69 6f 65 72 72 5f 73 69 6d 75  start_ioerr_simu
4320: 6c 61 74 69 6f 6e 28 69 53 61 76 65 2c 20 69 53  lation(iSave, iS
4330: 61 76 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  ave2);.  sqlite3
4340: 5f 66 72 65 65 28 61 50 61 67 65 29 3b 0a 20 20  _free(aPage);.  
4350: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
4360: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
4370: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
4380: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
4390: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
43a0: 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20 61   Write data to a
43b0: 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  n jt-file..*/.st
43c0: 61 74 69 63 20 69 6e 74 20 6a 74 57 72 69 74 65  atic int jtWrite
43d0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
43e0: 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63 6f 6e 73   *pFile, .  cons
43f0: 74 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20  t void *zBuf, . 
4400: 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71   int iAmt, .  sq
4410: 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74  lite_int64 iOfst
4420: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
4430: 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74  jt_file *p = (jt
4440: 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
4450: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 53 51   if( p->flags&SQ
4460: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
4470: 4f 55 52 4e 41 4c 20 29 7b 0a 20 20 20 20 69 66  OURNAL ){.    if
4480: 28 20 69 4f 66 73 74 3d 3d 30 20 29 7b 0a 20 20  ( iOfst==0 ){.  
4490: 20 20 20 20 6a 74 5f 66 69 6c 65 20 2a 70 4d 61      jt_file *pMa
44a0: 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61 74 61 62  in = locateDatab
44b0: 61 73 65 48 61 6e 64 6c 65 28 70 2d 3e 7a 4e 61  aseHandle(p->zNa
44c0: 6d 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  me);.      asser
44d0: 74 28 20 70 4d 61 69 6e 20 29 3b 0a 20 20 0a 20  t( pMain );.  . 
44e0: 20 20 20 20 20 69 66 28 20 69 41 6d 74 3d 3d 32       if( iAmt==2
44f0: 38 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  8 ){.        /* 
4500: 5a 65 72 6f 69 6e 67 20 74 68 65 20 66 69 72 73  Zeroing the firs
4510: 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 68  t journal-file h
4520: 65 61 64 65 72 2e 20 54 68 69 73 20 69 73 20 74  eader. This is t
4530: 68 65 20 65 6e 64 20 6f 66 20 61 0a 20 20 20 20  he end of a.    
4540: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
4550: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  on. */.        c
4560: 6c 6f 73 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  loseTransaction(
4570: 70 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20 7d 65  pMain);.      }e
4580: 6c 73 65 20 69 66 28 20 69 41 6d 74 21 3d 31 32  lse if( iAmt!=12
4590: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
45a0: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
45b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
45c0: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
45d0: 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 0a  e. This happens.
45e0: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
45f0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
4600: 20 66 69 72 73 74 20 73 74 61 72 74 65 64 2e 20   first started. 
4610: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 38 20 2a   */.        u8 *
4620: 7a 20 3d 20 28 75 38 20 2a 29 7a 42 75 66 3b 0a  z = (u8 *)zBuf;.
4630: 20 20 20 20 20 20 20 20 70 4d 61 69 6e 2d 3e 6e          pMain->n
4640: 50 61 67 65 20 3d 20 64 65 63 6f 64 65 55 69 6e  Page = decodeUin
4650: 74 33 32 28 26 7a 5b 31 36 5d 29 3b 0a 20 20 20  t32(&z[16]);.   
4660: 20 20 20 20 20 70 4d 61 69 6e 2d 3e 6e 50 61 67       pMain->nPag
4670: 65 73 69 7a 65 20 3d 20 64 65 63 6f 64 65 55 69  esize = decodeUi
4680: 6e 74 33 32 28 26 7a 5b 32 34 5d 29 3b 0a 20 20  nt32(&z[24]);.  
4690: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
46a0: 5f 4f 4b 21 3d 28 72 63 3d 6f 70 65 6e 54 72 61  _OK!=(rc=openTra
46b0: 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e 2c 20  nsaction(pMain, 
46c0: 70 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p)) ){.         
46d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
46e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
46f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69    }.    if( p->i
4700: 4d 61 78 4f 66 66 3c 28 69 4f 66 73 74 20 2b 20  MaxOff<(iOfst + 
4710: 69 41 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 70  iAmt) ){.      p
4720: 2d 3e 69 4d 61 78 4f 66 66 20 3d 20 69 4f 66 73  ->iMaxOff = iOfs
4730: 74 20 2b 20 69 41 6d 74 3b 0a 20 20 20 20 7d 0a  t + iAmt;.    }.
4740: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c    }..  if( p->fl
4750: 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
4760: 4d 41 49 4e 5f 44 42 20 26 26 20 70 2d 3e 70 57  MAIN_DB && p->pW
4770: 72 69 74 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  ritable ){.    i
4780: 66 28 20 69 41 6d 74 3c 28 69 6e 74 29 70 2d 3e  f( iAmt<(int)p->
4790: 6e 50 61 67 65 73 69 7a 65 20 0a 20 20 20 20 20  nPagesize .     
47a0: 26 26 20 70 2d 3e 6e 50 61 67 65 73 69 7a 65 25  && p->nPagesize%
47b0: 69 41 6d 74 3d 3d 30 20 0a 20 20 20 20 20 26 26  iAmt==0 .     &&
47c0: 20 69 4f 66 73 74 3e 3d 28 50 45 4e 44 49 4e 47   iOfst>=(PENDING
47d0: 5f 42 59 54 45 2b 35 31 32 29 20 0a 20 20 20 20  _BYTE+512) .    
47e0: 20 26 26 20 69 4f 66 73 74 2b 69 41 6d 74 3c 3d   && iOfst+iAmt<=
47f0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 70 2d 3e  PENDING_BYTE+p->
4800: 6e 50 61 67 65 73 69 7a 65 0a 20 20 20 20 29 7b  nPagesize.    ){
4810: 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 2e  .      /* No-op.
4820: 20 54 68 69 73 20 73 70 65 63 69 61 6c 20 63 61   This special ca
4830: 73 65 20 69 73 20 68 69 74 20 77 68 65 6e 20 74  se is hit when t
4840: 68 65 20 62 61 63 6b 75 70 20 63 6f 64 65 20 69  he backup code i
4850: 73 20 63 6f 70 79 69 6e 67 20 61 0a 20 20 20 20  s copying a.    
4860: 20 20 2a 2a 20 74 6f 20 61 20 64 61 74 61 62 61    ** to a databa
4870: 73 65 20 77 69 74 68 20 61 20 6c 61 72 67 65 72  se with a larger
4880: 20 70 61 67 65 2d 73 69 7a 65 20 74 68 61 6e 20   page-size than 
4890: 74 68 65 20 73 6f 75 72 63 65 20 64 61 74 61 62  the source datab
48a0: 61 73 65 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  ase and.      **
48b0: 20 69 74 20 6e 65 65 64 73 20 74 6f 20 66 69 6c   it needs to fil
48c0: 6c 20 69 6e 20 74 68 65 20 6e 6f 6e 2d 6c 6f 63  l in the non-loc
48d0: 6b 69 6e 67 2d 72 65 67 69 6f 6e 20 70 61 72 74  king-region part
48e0: 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   of the original
48f0: 0a 20 20 20 20 20 20 2a 2a 20 70 65 6e 64 69 6e  .      ** pendin
4900: 67 2d 62 79 74 65 20 70 61 67 65 2e 0a 20 20 20  g-byte page..   
4910: 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
4920: 0a 20 20 20 20 20 20 75 33 32 20 70 67 6e 6f 20  .      u32 pgno 
4930: 3d 20 28 75 33 32 29 28 69 4f 66 73 74 2f 70 2d  = (u32)(iOfst/p-
4940: 3e 6e 50 61 67 65 73 69 7a 65 20 2b 20 31 29 3b  >nPagesize + 1);
4950: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
4960: 69 41 6d 74 3d 3d 31 7c 7c 69 41 6d 74 3d 3d 28  iAmt==1||iAmt==(
4970: 69 6e 74 29 70 2d 3e 6e 50 61 67 65 73 69 7a 65  int)p->nPagesize
4980: 29 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ) &&.           
4990: 20 20 20 28 28 69 4f 66 73 74 2b 69 41 6d 74 29     ((iOfst+iAmt)
49a0: 25 70 2d 3e 6e 50 61 67 65 73 69 7a 65 29 3d 3d  %p->nPagesize)==
49b0: 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
49c0: 74 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 50 61 67  t( pgno<=p->nPag
49d0: 65 20 7c 7c 20 70 2d 3e 6e 53 79 6e 63 3e 30 20  e || p->nSync>0 
49e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
49f0: 20 70 67 6e 6f 3e 70 2d 3e 6e 50 61 67 65 20 7c   pgno>p->nPage |
4a00: 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
4a10: 65 73 74 28 70 2d 3e 70 57 72 69 74 61 62 6c 65  est(p->pWritable
4a20: 2c 20 70 67 6e 6f 29 20 29 3b 0a 20 20 20 20 7d  , pgno) );.    }
4a30: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c  .  }..  rc = sql
4a40: 69 74 65 33 4f 73 57 72 69 74 65 28 70 2d 3e 70  ite3OsWrite(p->p
4a50: 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74  Real, zBuf, iAmt
4a60: 2c 20 69 4f 66 73 74 29 3b 0a 20 20 69 66 28 20  , iOfst);.  if( 
4a70: 28 70 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  (p->flags&SQLITE
4a80: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
4a90: 41 4c 29 20 26 26 20 69 41 6d 74 3d 3d 31 32 20  AL) && iAmt==12 
4aa0: 29 7b 0a 20 20 20 20 6a 74 5f 66 69 6c 65 20 2a  ){.    jt_file *
4ab0: 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61  pMain = locateDa
4ac0: 74 61 62 61 73 65 48 61 6e 64 6c 65 28 70 2d 3e  tabaseHandle(p->
4ad0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 6e 74 20  zName);.    int 
4ae0: 72 63 32 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61  rc2 = readJourna
4af0: 6c 46 69 6c 65 28 70 2c 20 70 4d 61 69 6e 29 3b  lFile(p, pMain);
4b00: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
4b10: 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63  ITE_OK ) rc = rc
4b20: 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  2;.  }.  return 
4b30: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
4b40: 6e 63 61 74 65 20 61 6e 20 6a 74 2d 66 69 6c 65  ncate an jt-file
4b50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4b60: 6a 74 54 72 75 6e 63 61 74 65 28 73 71 6c 69 74  jtTruncate(sqlit
4b70: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
4b80: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69 7a  sqlite_int64 siz
4b90: 65 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70  e){.  jt_file *p
4ba0: 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46   = (jt_file *)pF
4bb0: 69 6c 65 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c  ile;.  if( p->fl
4bc0: 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
4bd0: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 26 26 20  MAIN_JOURNAL && 
4be0: 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  size==0 ){.    /
4bf0: 2a 20 54 72 75 6e 63 61 74 69 6e 67 20 61 20 6a  * Truncating a j
4c00: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
4c10: 73 20 69 73 20 74 68 65 20 65 6e 64 20 6f 66 20  s is the end of 
4c20: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a  a transaction. *
4c30: 2f 0a 20 20 20 20 6a 74 5f 66 69 6c 65 20 2a 70  /.    jt_file *p
4c40: 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61 74  Main = locateDat
4c50: 61 62 61 73 65 48 61 6e 64 6c 65 28 70 2d 3e 7a  abaseHandle(p->z
4c60: 4e 61 6d 65 29 3b 0a 20 20 20 20 63 6c 6f 73 65  Name);.    close
4c70: 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69  Transaction(pMai
4c80: 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d  n);.  }.  if( p-
4c90: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  >flags&SQLITE_OP
4ca0: 45 4e 5f 4d 41 49 4e 5f 44 42 20 26 26 20 70 2d  EN_MAIN_DB && p-
4cb0: 3e 70 57 72 69 74 61 62 6c 65 20 29 7b 0a 20 20  >pWritable ){.  
4cc0: 20 20 75 33 32 20 70 67 6e 6f 3b 0a 20 20 20 20    u32 pgno;.    
4cd0: 75 33 32 20 6c 6f 63 6b 69 6e 67 5f 70 61 67 65  u32 locking_page
4ce0: 20 3d 20 28 75 33 32 29 28 50 45 4e 44 49 4e 47   = (u32)(PENDING
4cf0: 5f 42 59 54 45 2f 70 2d 3e 6e 50 61 67 65 73 69  _BYTE/p->nPagesi
4d00: 7a 65 2b 31 29 3b 0a 20 20 20 20 66 6f 72 28 70  ze+1);.    for(p
4d10: 67 6e 6f 3d 28 75 33 32 29 28 73 69 7a 65 2f 70  gno=(u32)(size/p
4d20: 2d 3e 6e 50 61 67 65 73 69 7a 65 2b 31 29 3b 20  ->nPagesize+1); 
4d30: 70 67 6e 6f 3c 3d 70 2d 3e 6e 50 61 67 65 3b 20  pgno<=p->nPage; 
4d40: 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20 20 61  pgno++){.      a
4d50: 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 6c 6f 63  ssert( pgno==loc
4d60: 6b 69 6e 67 5f 70 61 67 65 20 7c 7c 20 73 71 6c  king_page || sql
4d70: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4d80: 2d 3e 70 57 72 69 74 61 62 6c 65 2c 20 70 67 6e  ->pWritable, pgn
4d90: 6f 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  o) );.    }.  }.
4da0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4db0: 4f 73 54 72 75 6e 63 61 74 65 28 70 2d 3e 70 52  OsTruncate(p->pR
4dc0: 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d 0a 0a 2f  eal, size);.}../
4dd0: 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20 6a 74 2d  *.** Sync an jt-
4de0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
4df0: 69 6e 74 20 6a 74 53 79 6e 63 28 73 71 6c 69 74  int jtSync(sqlit
4e00: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
4e10: 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 6a 74  int flags){.  jt
4e20: 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f 66  _file *p = (jt_f
4e30: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 0a 20 20  ile *)pFile;..  
4e40: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 53 51 4c  if( p->flags&SQL
4e50: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
4e60: 55 52 4e 41 4c 20 29 7b 0a 20 20 20 20 69 6e 74  URNAL ){.    int
4e70: 20 72 63 3b 0a 20 20 20 20 6a 74 5f 66 69 6c 65   rc;.    jt_file
4e80: 20 2a 70 4d 61 69 6e 3b 20 20 20 20 20 20 20 20   *pMain;        
4e90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
4ea0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 64 61 74  e associated dat
4eb0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20  abase file */.. 
4ec0: 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61     /* The journa
4ed0: 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
4ee0: 73 79 6e 63 65 64 2e 20 41 74 20 74 68 69 73 20  synced. At this 
4ef0: 70 6f 69 6e 74 2c 20 77 65 20 69 6e 73 70 65 63  point, we inspec
4f00: 74 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 6f  t the .    ** co
4f10: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 66 69  ntents of the fi
4f20: 6c 65 20 75 70 20 74 6f 20 74 68 69 73 20 70 6f  le up to this po
4f30: 69 6e 74 20 61 6e 64 20 73 65 74 20 65 61 63 68  int and set each
4f40: 20 62 69 74 20 69 6e 20 74 68 65 20 0a 20 20 20   bit in the .   
4f50: 20 2a 2a 20 6a 74 5f 66 69 6c 65 2e 70 57 72 69   ** jt_file.pWri
4f60: 74 61 62 6c 65 20 62 69 74 76 65 63 20 6f 66 20  table bitvec of 
4f70: 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
4f80: 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  e file associate
4f90: 64 20 77 69 74 68 0a 20 20 20 20 2a 2a 20 74 68  d with.    ** th
4fa0: 69 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  is journal file.
4fb0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 4d 61 69  .    */.    pMai
4fc0: 6e 20 3d 20 6c 6f 63 61 74 65 44 61 74 61 62 61  n = locateDataba
4fd0: 73 65 48 61 6e 64 6c 65 28 70 2d 3e 7a 4e 61 6d  seHandle(p->zNam
4fe0: 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70  e);.    assert(p
4ff0: 4d 61 69 6e 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  Main);..    /* S
5000: 65 74 20 74 68 65 20 62 69 74 76 65 63 20 76 61  et the bitvec va
5010: 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69 66 28 20  lues */.    if( 
5020: 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65  pMain->pWritable
5030: 20 29 7b 0a 20 20 20 20 20 20 70 4d 61 69 6e 2d   ){.      pMain-
5040: 3e 6e 53 79 6e 63 2b 2b 3b 0a 20 20 20 20 20 20  >nSync++;.      
5050: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
5060: 46 69 6c 65 28 70 2c 20 70 4d 61 69 6e 29 3b 0a  File(p, pMain);.
5070: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
5080: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5090: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
50a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
50b0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
50c0: 33 4f 73 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c  3OsSync(p->pReal
50d0: 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a  , flags);.}../*.
50e0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
50f0: 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20  rrent file-size 
5100: 6f 66 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a  of an jt-file..*
5110: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 46  /.static int jtF
5120: 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
5130: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  file *pFile, sql
5140: 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  ite_int64 *pSize
5150: 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20  ){.  jt_file *p 
5160: 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69  = (jt_file *)pFi
5170: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  le;.  return sql
5180: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
5190: 2d 3e 70 52 65 61 6c 2c 20 70 53 69 7a 65 29 3b  ->pReal, pSize);
51a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61  .}../*.** Lock a
51b0: 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  n jt-file..*/.st
51c0: 61 74 69 63 20 69 6e 74 20 6a 74 4c 6f 63 6b 28  atic int jtLock(
51d0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
51e0: 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ile, int eLock){
51f0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6a 74 5f  .  int rc;.  jt_
5200: 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f 66 69  file *p = (jt_fi
5210: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 63  le *)pFile;.  rc
5220: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
5230: 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b  (p->pReal, eLock
5240: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
5250: 49 54 45 5f 4f 4b 20 26 26 20 65 4c 6f 63 6b 3e  ITE_OK && eLock>
5260: 70 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  p->eLock ){.    
5270: 70 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b  p->eLock = eLock
5280: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5290: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  c;.}../*.** Unlo
52a0: 63 6b 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a  ck an jt-file..*
52b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 55  /.static int jtU
52c0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
52d0: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
52e0: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Lock){.  int rc;
52f0: 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20  .  jt_file *p = 
5300: 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  (jt_file *)pFile
5310: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
5320: 4f 73 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52 65 61  OsUnlock(p->pRea
5330: 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 69 66 28  l, eLock);.  if(
5340: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
5350: 26 20 65 4c 6f 63 6b 3c 70 2d 3e 65 4c 6f 63 6b  & eLock<p->eLock
5360: 20 29 7b 0a 20 20 20 20 70 2d 3e 65 4c 6f 63 6b   ){.    p->eLock
5370: 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20   = eLock;.  }.  
5380: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5390: 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 6f  .** Check if ano
53a0: 74 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65  ther file-handle
53b0: 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
53c0: 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 6a 74 2d  D lock on an jt-
53d0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
53e0: 69 6e 74 20 6a 74 43 68 65 63 6b 52 65 73 65 72  int jtCheckReser
53f0: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
5400: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
5410: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 6a 74   *pResOut){.  jt
5420: 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f 66  _file *p = (jt_f
5430: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72  ile *)pFile;.  r
5440: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 43  eturn sqlite3OsC
5450: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
5460: 28 70 2d 3e 70 52 65 61 6c 2c 20 70 52 65 73 4f  (p->pReal, pResO
5470: 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  ut);.}../*.** Fi
5480: 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le control metho
5490: 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70  d. For custom op
54a0: 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 6a  erations on an j
54b0: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
54c0: 63 20 69 6e 74 20 6a 74 46 69 6c 65 43 6f 6e 74  c int jtFileCont
54d0: 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
54e0: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c   *pFile, int op,
54f0: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
5500: 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74  jt_file *p = (jt
5510: 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
5520: 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
5530: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
5540: 65 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61  eControl(p->pRea
5550: 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 7d 0a  l, op, pArg);.}.
5560: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
5570: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e  e sector-size in
5580: 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 6a 74   bytes for an jt
5590: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
55a0: 20 69 6e 74 20 6a 74 53 65 63 74 6f 72 53 69 7a   int jtSectorSiz
55b0: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
55c0: 70 46 69 6c 65 29 7b 0a 20 20 6a 74 5f 66 69 6c  pFile){.  jt_fil
55d0: 65 20 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20  e *p = (jt_file 
55e0: 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  *)pFile;.  retur
55f0: 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  n sqlite3OsSecto
5600: 72 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 29 3b  rSize(p->pReal);
5610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5620: 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
5630: 61 63 74 65 72 69 73 74 69 63 20 66 6c 61 67 73  acteristic flags
5640: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e   supported by an
5650: 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61   jt-file..*/.sta
5660: 74 69 63 20 69 6e 74 20 6a 74 44 65 76 69 63 65  tic int jtDevice
5670: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
5680: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
5690: 69 6c 65 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20  ile){.  jt_file 
56a0: 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29  *p = (jt_file *)
56b0: 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
56c0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
56d0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
56e0: 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pReal);.}../*.
56f0: 2a 2a 20 4f 70 65 6e 20 61 6e 20 6a 74 20 66 69  ** Open an jt fi
5700: 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
5710: 61 74 69 63 20 69 6e 74 20 6a 74 4f 70 65 6e 28  atic int jtOpen(
5720: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
5730: 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68  pVfs,.  const ch
5740: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c  ar *zName,.  sql
5750: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
5760: 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20  ,.  int flags,. 
5770: 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a   int *pOutFlags.
5780: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6a  ){.  int rc;.  j
5790: 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f  t_file *p = (jt_
57a0: 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
57b0: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
57c0: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 20  = 0;.  p->pReal 
57d0: 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
57e0: 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 52  *)&p[1];.  p->pR
57f0: 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20  eal->pMethods = 
5800: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
5810: 33 4f 73 4f 70 65 6e 28 67 2e 70 56 66 73 2c 20  3OsOpen(g.pVfs, 
5820: 7a 4e 61 6d 65 2c 20 70 2d 3e 70 52 65 61 6c 2c  zName, p->pReal,
5830: 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67   flags, pOutFlag
5840: 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  s);.  assert( rc
5850: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
5860: 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
5870: 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 72 63  s==0 );.  if( rc
5880: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5890: 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f     pFile->pMetho
58a0: 64 73 20 3d 20 26 6a 74 5f 69 6f 5f 6d 65 74 68  ds = &jt_io_meth
58b0: 6f 64 73 3b 0a 20 20 20 20 70 2d 3e 65 4c 6f 63  ods;.    p->eLoc
58c0: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 7a 4e  k = 0;.    p->zN
58d0: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
58e0: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67   p->flags = flag
58f0: 73 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  s;.    p->pNext 
5900: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 72 69  = 0;.    p->pWri
5910: 74 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70  table = 0;.    p
5920: 2d 3e 61 43 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  ->aCksum = 0;.  
5930: 20 20 65 6e 74 65 72 4a 74 4d 75 74 65 78 28 29    enterJtMutex()
5940: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20  ;.    if( zName 
5950: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  ){.      p->pNex
5960: 74 20 3d 20 67 2e 70 4c 69 73 74 3b 0a 20 20 20  t = g.pList;.   
5970: 20 20 20 67 2e 70 4c 69 73 74 20 3d 20 70 3b 0a     g.pList = p;.
5980: 20 20 20 20 7d 0a 20 20 20 20 6c 65 61 76 65 4a      }.    leaveJ
5990: 74 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  tMutex();.  }.  
59a0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
59b0: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
59c0: 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a  ile located at z
59d0: 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72  Path. If the dir
59e0: 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73  Sync argument is
59f0: 20 74 72 75 65 2c 0a 2a 2a 20 65 6e 73 75 72 65   true,.** ensure
5a00: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5a10: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 61   modifications a
5a20: 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  re synced to dis
5a30: 6b 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  k before.** retu
5a40: 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
5a50: 20 69 6e 74 20 6a 74 44 65 6c 65 74 65 28 73 71   int jtDelete(sq
5a60: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
5a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
5a80: 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29  th, int dirSync)
5a90: 7b 0a 20 20 69 6e 74 20 6e 50 61 74 68 20 3d 20  {.  int nPath = 
5aa0: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 50 61 74  (int)strlen(zPat
5ab0: 68 29 3b 0a 20 20 69 66 28 20 6e 50 61 74 68 3e  h);.  if( nPath>
5ac0: 38 20 26 26 20 30 3d 3d 73 74 72 63 6d 70 28 22  8 && 0==strcmp("
5ad0: 2d 6a 6f 75 72 6e 61 6c 22 2c 20 26 7a 50 61 74  -journal", &zPat
5ae0: 68 5b 6e 50 61 74 68 2d 38 5d 29 20 29 7b 0a 20  h[nPath-8]) ){. 
5af0: 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 61     /* Deleting a
5b00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
5b10: 68 65 20 65 6e 64 20 6f 66 20 61 20 74 72 61 6e  he end of a tran
5b20: 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  saction. */.    
5b30: 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 20 3d  jt_file *pMain =
5b40: 20 6c 6f 63 61 74 65 44 61 74 61 62 61 73 65 48   locateDatabaseH
5b50: 61 6e 64 6c 65 28 7a 50 61 74 68 29 3b 0a 20 20  andle(zPath);.  
5b60: 20 20 69 66 28 20 70 4d 61 69 6e 20 29 7b 0a 20    if( pMain ){. 
5b70: 20 20 20 20 20 63 6c 6f 73 65 54 72 61 6e 73 61       closeTransa
5b80: 63 74 69 6f 6e 28 70 4d 61 69 6e 29 3b 0a 20 20  ction(pMain);.  
5b90: 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
5ba0: 6e 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74  n sqlite3OsDelet
5bb0: 65 28 67 2e 70 56 66 73 2c 20 7a 50 61 74 68 2c  e(g.pVfs, zPath,
5bc0: 20 64 69 72 53 79 6e 63 29 3b 0a 7d 0a 0a 2f 2a   dirSync);.}../*
5bd0: 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20 61 63 63  .** Test for acc
5be0: 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 2e  ess permissions.
5bf0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
5c00: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 70 65  the requested pe
5c10: 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 61  rmission.** is a
5c20: 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 66 61 6c  vailable, or fal
5c30: 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f  se otherwise..*/
5c40: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 41 63  .static int jtAc
5c50: 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65 33 5f  cess(.  sqlite3_
5c60: 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f  vfs *pVfs, .  co
5c70: 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c  nst char *zPath,
5c80: 20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 0a   .  int flags, .
5c90: 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 0a 29    int *pResOut.)
5ca0: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5cb0: 65 33 4f 73 41 63 63 65 73 73 28 67 2e 70 56 66  e3OsAccess(g.pVf
5cc0: 73 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67 73 2c  s, zPath, flags,
5cd0: 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a   pResOut);.}../*
5ce0: 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62 75 66  .** Populate buf
5cf0: 66 65 72 20 7a 4f 75 74 20 77 69 74 68 20 74 68  fer zOut with th
5d00: 65 20 66 75 6c 6c 20 63 61 6e 6f 6e 69 63 61 6c  e full canonical
5d10: 20 70 61 74 68 6e 61 6d 65 20 63 6f 72 72 65 73   pathname corres
5d20: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20 74 68  ponding.** to th
5d30: 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 20 7a 50  e pathname in zP
5d40: 61 74 68 2e 20 7a 4f 75 74 20 69 73 20 67 75 61  ath. zOut is gua
5d50: 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69 6e 74  ranteed to point
5d60: 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a 2a 20   to a buffer.** 
5d70: 6f 66 20 61 74 20 6c 65 61 73 74 20 28 4a 54 5f  of at least (JT_
5d80: 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31 29 20  MAX_PATHNAME+1) 
5d90: 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  bytes..*/.static
5da0: 20 69 6e 74 20 6a 74 46 75 6c 6c 50 61 74 68 6e   int jtFullPathn
5db0: 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 76  ame(.  sqlite3_v
5dc0: 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63 6f 6e  fs *pVfs, .  con
5dd0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20  st char *zPath, 
5de0: 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a 20 20  .  int nOut, .  
5df0: 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a 20 20  char *zOut.){.  
5e00: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
5e10: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 67 2e 70  FullPathname(g.p
5e20: 56 66 73 2c 20 7a 50 61 74 68 2c 20 6e 4f 75 74  Vfs, zPath, nOut
5e30: 2c 20 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , zOut);.}../*.*
5e40: 2a 20 4f 70 65 6e 20 74 68 65 20 64 79 6e 61 6d  * Open the dynam
5e50: 69 63 20 6c 69 62 72 61 72 79 20 6c 6f 63 61 74  ic library locat
5e60: 65 64 20 61 74 20 7a 50 61 74 68 20 61 6e 64 20  ed at zPath and 
5e70: 72 65 74 75 72 6e 20 61 20 68 61 6e 64 6c 65 2e  return a handle.
5e80: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5e90: 2a 6a 74 44 6c 4f 70 65 6e 28 73 71 6c 69 74 65  *jtDlOpen(sqlite
5ea0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e  3_vfs *pVfs, con
5eb0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68 29 7b  st char *zPath){
5ec0: 0a 20 20 72 65 74 75 72 6e 20 67 2e 70 56 66 73  .  return g.pVfs
5ed0: 2d 3e 78 44 6c 4f 70 65 6e 28 67 2e 70 56 66 73  ->xDlOpen(g.pVfs
5ee0: 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f 2a 0a  , zPath);.}../*.
5ef0: 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20  ** Populate the 
5f00: 62 75 66 66 65 72 20 7a 45 72 72 4d 73 67 20 28  buffer zErrMsg (
5f10: 73 69 7a 65 20 6e 42 79 74 65 20 62 79 74 65 73  size nByte bytes
5f20: 29 20 77 69 74 68 20 61 20 68 75 6d 61 6e 20 72  ) with a human r
5f30: 65 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66 2d 38  eadable.** utf-8
5f40: 20 73 74 72 69 6e 67 20 64 65 73 63 72 69 62 69   string describi
5f50: 6e 67 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ng the most rece
5f60: 6e 74 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74  nt error encount
5f70: 65 72 65 64 20 61 73 73 6f 63 69 61 74 65 64 20  ered associated 
5f80: 0a 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d 69 63  .** with dynamic
5f90: 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f 0a 73   libraries..*/.s
5fa0: 74 61 74 69 63 20 76 6f 69 64 20 6a 74 44 6c 45  tatic void jtDlE
5fb0: 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76 66 73  rror(sqlite3_vfs
5fc0: 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74   *pVfs, int nByt
5fd0: 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  e, char *zErrMsg
5fe0: 29 7b 0a 20 20 67 2e 70 56 66 73 2d 3e 78 44 6c  ){.  g.pVfs->xDl
5ff0: 45 72 72 6f 72 28 67 2e 70 56 66 73 2c 20 6e 42  Error(g.pVfs, nB
6000: 79 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 7d  yte, zErrMsg);.}
6010: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
6020: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
6030: 73 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c 20 69  symbol zSymbol i
6040: 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69  n the dynamic li
6050: 62 72 61 72 79 20 70 48 61 6e 64 6c 65 2e 0a 2a  brary pHandle..*
6060: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28 2a  /.static void (*
6070: 6a 74 44 6c 53 79 6d 28 73 71 6c 69 74 65 33 5f  jtDlSym(sqlite3_
6080: 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
6090: 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
60a0: 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a 20 20  zSym))(void){.  
60b0: 72 65 74 75 72 6e 20 67 2e 70 56 66 73 2d 3e 78  return g.pVfs->x
60c0: 44 6c 53 79 6d 28 67 2e 70 56 66 73 2c 20 70 2c  DlSym(g.pVfs, p,
60d0: 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zSym);.}../*.**
60e0: 20 43 6c 6f 73 65 20 74 68 65 20 64 79 6e 61 6d   Close the dynam
60f0: 69 63 20 6c 69 62 72 61 72 79 20 68 61 6e 64 6c  ic library handl
6100: 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  e pHandle..*/.st
6110: 61 74 69 63 20 76 6f 69 64 20 6a 74 44 6c 43 6c  atic void jtDlCl
6120: 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ose(sqlite3_vfs 
6130: 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70 48 61  *pVfs, void *pHa
6140: 6e 64 6c 65 29 7b 0a 20 20 67 2e 70 56 66 73 2d  ndle){.  g.pVfs-
6150: 3e 78 44 6c 43 6c 6f 73 65 28 67 2e 70 56 66 73  >xDlClose(g.pVfs
6160: 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a 0a 2f  , pHandle);.}../
6170: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68  *.** Populate th
6180: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
6190: 20 74 6f 20 62 79 20 7a 42 75 66 4f 75 74 20 77   to by zBufOut w
61a0: 69 74 68 20 6e 42 79 74 65 20 62 79 74 65 73 20  ith nByte bytes 
61b0: 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 64 61  of .** random da
61c0: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ta..*/.static in
61d0: 74 20 6a 74 52 61 6e 64 6f 6d 6e 65 73 73 28 73  t jtRandomness(s
61e0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
61f0: 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61  , int nByte, cha
6200: 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20 20 72  r *zBufOut){.  r
6210: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 52  eturn sqlite3OsR
6220: 61 6e 64 6f 6d 6e 65 73 73 28 67 2e 70 56 66 73  andomness(g.pVfs
6230: 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f 75 74  , nByte, zBufOut
6240: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c 65 65  );.}../*.** Slee
6250: 70 20 66 6f 72 20 6e 4d 69 63 72 6f 20 6d 69 63  p for nMicro mic
6260: 72 6f 73 65 63 6f 6e 64 73 2e 20 52 65 74 75 72  roseconds. Retur
6270: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
6280: 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 0a 2a 2a  microseconds .**
6290: 20 61 63 74 75 61 6c 6c 79 20 73 6c 65 70 74 2e   actually slept.
62a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
62b0: 74 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  tSleep(sqlite3_v
62c0: 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 4d  fs *pVfs, int nM
62d0: 69 63 72 6f 29 7b 0a 20 20 72 65 74 75 72 6e 20  icro){.  return 
62e0: 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70 28 67  sqlite3OsSleep(g
62f0: 2e 70 56 66 73 2c 20 6e 4d 69 63 72 6f 29 3b 0a  .pVfs, nMicro);.
6300: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
6310: 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d 65  the current time
6320: 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61 79   as a Julian Day
6330: 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54 69 6d   number in *pTim
6340: 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  eOut..*/.static 
6350: 69 6e 74 20 6a 74 43 75 72 72 65 6e 74 54 69 6d  int jtCurrentTim
6360: 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  e(sqlite3_vfs *p
6370: 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70 54 69  Vfs, double *pTi
6380: 6d 65 4f 75 74 29 7b 0a 20 20 72 65 74 75 72 6e  meOut){.  return
6390: 20 67 2e 70 56 66 73 2d 3e 78 43 75 72 72 65 6e   g.pVfs->xCurren
63a0: 74 54 69 6d 65 28 67 2e 70 56 66 73 2c 20 70 54  tTime(g.pVfs, pT
63b0: 69 6d 65 4f 75 74 29 3b 0a 7d 0a 2f 2a 0a 2a 2a  imeOut);.}./*.**
63c0: 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
63d0: 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a 75  ent time as a Ju
63e0: 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72 20  lian Day number 
63f0: 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f  in *pTimeOut..*/
6400: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 43 75  .static int jtCu
6410: 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 73  rrentTimeInt64(s
6420: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
6430: 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  , sqlite3_int64 
6440: 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 72 65  *pTimeOut){.  re
6450: 74 75 72 6e 20 67 2e 70 56 66 73 2d 3e 78 43 75  turn g.pVfs->xCu
6460: 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 67  rrentTimeInt64(g
6470: 2e 70 56 66 73 2c 20 70 54 69 6d 65 4f 75 74 29  .pVfs, pTimeOut)
6480: 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ;.}../**********
6490: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64b0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
64d0: 0a 2a 2a 20 53 74 61 72 74 20 6f 66 20 70 75 62  .** Start of pub
64e0: 6c 69 63 20 41 50 49 2e 0a 2a 2f 0a 0a 2f 2a 0a  lic API..*/../*.
64f0: 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74 68 65  ** Configure the
6500: 20 6a 74 20 56 46 53 20 61 73 20 61 20 77 72 61   jt VFS as a wra
6510: 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68 65 20  pper around the 
6520: 56 46 53 20 6e 61 6d 65 64 20 62 79 20 70 61 72  VFS named by par
6530: 61 6d 65 74 65 72 20 0a 2a 2a 20 7a 57 72 61 70  ameter .** zWrap
6540: 2e 20 49 66 20 74 68 65 20 69 73 44 65 66 61 75  . If the isDefau
6550: 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  lt parameter is 
6560: 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  true, then the j
6570: 74 20 56 46 53 20 69 73 20 69 6e 73 74 61 6c 6c  t VFS is install
6580: 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6e 65 77  ed.** as the new
6590: 20 64 65 66 61 75 6c 74 20 56 46 53 20 66 6f 72   default VFS for
65a0: 20 53 51 4c 69 74 65 20 63 6f 6e 6e 65 63 74 69   SQLite connecti
65b0: 6f 6e 73 2e 20 49 66 20 69 73 44 65 66 61 75 6c  ons. If isDefaul
65c0: 74 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 72 75 65  t is not.** true
65d0: 2c 20 74 68 65 6e 20 74 68 65 20 6a 74 20 56 46  , then the jt VF
65e0: 53 20 69 73 20 69 6e 73 74 61 6c 6c 65 64 20 61  S is installed a
65f0: 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e 20 49  s non-default. I
6600: 6e 20 74 68 69 73 20 63 61 73 65 20 69 74 0a 2a  n this case it.*
6610: 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65 20 76  * is available v
6620: 69 61 20 69 74 73 20 6e 61 6d 65 2c 20 22 6a 74  ia its name, "jt
6630: 22 2e 0a 2a 2f 0a 69 6e 74 20 6a 74 5f 72 65 67  "..*/.int jt_reg
6640: 69 73 74 65 72 28 63 68 61 72 20 2a 7a 57 72 61  ister(char *zWra
6650: 70 2c 20 69 6e 74 20 69 73 44 65 66 61 75 6c 74  p, int isDefault
6660: 29 7b 0a 20 20 67 2e 70 56 66 73 20 3d 20 73 71  ){.  g.pVfs = sq
6670: 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 7a  lite3_vfs_find(z
6680: 57 72 61 70 29 3b 0a 20 20 69 66 28 20 67 2e 70  Wrap);.  if( g.p
6690: 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Vfs==0 ){.    re
66a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
66b0: 52 3b 0a 20 20 7d 0a 20 20 6a 74 5f 76 66 73 2e  R;.  }.  jt_vfs.
66c0: 73 7a 4f 73 46 69 6c 65 20 3d 20 73 69 7a 65 6f  szOsFile = sizeo
66d0: 66 28 6a 74 5f 66 69 6c 65 29 20 2b 20 67 2e 70  f(jt_file) + g.p
66e0: 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 3b 0a 20  Vfs->szOsFile;. 
66f0: 20 69 66 28 20 67 2e 70 56 66 73 2d 3e 69 56 65   if( g.pVfs->iVe
6700: 72 73 69 6f 6e 3d 3d 31 20 29 7b 0a 20 20 20 20  rsion==1 ){.    
6710: 6a 74 5f 76 66 73 2e 69 56 65 72 73 69 6f 6e 20  jt_vfs.iVersion 
6720: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  = 1;.  }else if(
6730: 20 67 2e 70 56 66 73 2d 3e 78 43 75 72 72 65 6e   g.pVfs->xCurren
6740: 74 54 69 6d 65 49 6e 74 36 34 3d 3d 30 20 29 7b  tTimeInt64==0 ){
6750: 0a 20 20 20 20 6a 74 5f 76 66 73 2e 78 43 75 72  .    jt_vfs.xCur
6760: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 3d 20  rentTimeInt64 = 
6770: 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  0;.  }.  sqlite3
6780: 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26 6a  _vfs_register(&j
6790: 74 5f 76 66 73 2c 20 69 73 44 65 66 61 75 6c 74  t_vfs, isDefault
67a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
67b0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
67c0: 55 6e 69 6e 73 74 61 6c 6c 20 74 68 65 20 6a 74  Uninstall the jt
67d0: 20 56 46 53 2c 20 69 66 20 69 74 20 69 73 20 69   VFS, if it is i
67e0: 6e 73 74 61 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f 69  nstalled..*/.voi
67f0: 64 20 6a 74 5f 75 6e 72 65 67 69 73 74 65 72 28  d jt_unregister(
6800: 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
6810: 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28  _vfs_unregister(
6820: 26 6a 74 5f 76 66 73 29 3b 0a 7d 0a 0a 23 65 6e  &jt_vfs);.}..#en
6830: 64 69 66 0a                                      dif.