/ Hex Artifact Content
Login

Artifact 03313c693cca72959dcaaf79f8d76f21c01e19ff:


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 72 65 74 75 72 6e 20  tex();.  return 
25d0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
25e0: 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pReal);.}../*.
25f0: 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66 72 6f  ** Read data fro
2600: 6d 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f  m an jt-file..*/
2610: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 52 65  .static int jtRe
2620: 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ad(.  sqlite3_fi
2630: 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 76 6f  le *pFile, .  vo
2640: 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
2650: 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
2660: 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
2670: 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28    jt_file *p = (
2680: 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  jt_file *)pFile;
2690: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
26a0: 33 4f 73 52 65 61 64 28 70 2d 3e 70 52 65 61 6c  3OsRead(p->pReal
26b0: 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69 4f  , zBuf, iAmt, iO
26c0: 66 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  fst);.}../*.** P
26d0: 61 72 61 6d 65 74 65 72 20 7a 4a 6f 75 72 6e 61  arameter zJourna
26e0: 6c 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  l is the name of
26f0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   a journal file 
2700: 74 68 61 74 20 69 73 20 63 75 72 72 65 6e 74 6c  that is currentl
2710: 79 20 0a 2a 2a 20 6f 70 65 6e 2e 20 54 68 69 73  y .** open. This
2720: 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 61 74 65   function locate
2730: 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 68  s and returns th
2740: 65 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65 64 20  e handle opened 
2750: 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73  on the.** corres
2760: 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61 73 65  ponding database
2770: 20 66 69 6c 65 20 62 79 20 74 68 65 20 70 61 67   file by the pag
2780: 65 72 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c  er that currentl
2790: 79 20 68 61 73 20 74 68 65 0a 2a 2a 20 6a 6f 75  y has the.** jou
27a0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
27b0: 2e 20 54 68 69 73 20 66 69 6c 65 2d 68 61 6e 64  . This file-hand
27c0: 6c 65 20 69 73 20 69 64 65 6e 74 69 66 69 65 64  le is identified
27d0: 20 62 79 20 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c   by the .** foll
27e0: 6f 77 69 6e 67 20 70 72 6f 70 65 72 74 69 65 73  owing properties
27f0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 53 51 4c  :.**.**   a) SQL
2800: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42  ITE_OPEN_MAIN_DB
2810: 20 77 61 73 20 73 70 65 63 69 66 69 65 64 20 77   was specified w
2820: 68 65 6e 20 74 68 65 20 66 69 6c 65 20 77 61 73  hen the file was
2830: 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20   opened..**.**  
2840: 20 62 29 20 54 68 65 20 66 69 6c 65 2d 6e 61 6d   b) The file-nam
2850: 65 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e  e specified when
2860: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
2870: 65 6e 65 64 20 6d 61 74 63 68 65 73 0a 2a 2a 20  ened matches.** 
2880: 20 20 20 20 20 61 6c 6c 20 62 75 74 20 74 68 65       all but the
2890: 20 66 69 6e 61 6c 20 38 20 63 68 61 72 61 63 74   final 8 charact
28a0: 65 72 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ers of the journ
28b0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
28c0: 0a 2a 2a 20 20 20 63 29 20 54 68 65 72 65 20 69  .**   c) There i
28d0: 73 20 63 75 72 72 65 6e 74 6c 79 20 61 20 72 65  s currently a re
28e0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 6f 6e 20 74  served lock on t
28f0: 68 65 20 66 69 6c 65 2e 0a 2a 2a 2f 0a 73 74 61  he file..**/.sta
2900: 74 69 63 20 6a 74 5f 66 69 6c 65 20 2a 6c 6f 63  tic jt_file *loc
2910: 61 74 65 44 61 74 61 62 61 73 65 48 61 6e 64 6c  ateDatabaseHandl
2920: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4a  e(const char *zJ
2930: 6f 75 72 6e 61 6c 29 7b 0a 20 20 6a 74 5f 66 69  ournal){.  jt_fi
2940: 6c 65 20 2a 70 4d 61 69 6e 20 3d 20 30 3b 0a 20  le *pMain = 0;. 
2950: 20 65 6e 74 65 72 4a 74 4d 75 74 65 78 28 29 3b   enterJtMutex();
2960: 0a 20 20 66 6f 72 28 70 4d 61 69 6e 3d 67 2e 70  .  for(pMain=g.p
2970: 4c 69 73 74 3b 20 70 4d 61 69 6e 3b 20 70 4d 61  List; pMain; pMa
2980: 69 6e 3d 70 4d 61 69 6e 2d 3e 70 4e 65 78 74 29  in=pMain->pNext)
2990: 7b 0a 20 20 20 20 69 6e 74 20 6e 4e 61 6d 65 20  {.    int nName 
29a0: 3d 20 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61  = strlen(zJourna
29b0: 6c 29 20 2d 20 73 74 72 6c 65 6e 28 22 2d 6a 6f  l) - strlen("-jo
29c0: 75 72 6e 61 6c 22 29 3b 0a 20 20 20 20 69 66 28  urnal");.    if(
29d0: 20 28 70 4d 61 69 6e 2d 3e 66 6c 61 67 73 26 53   (pMain->flags&S
29e0: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
29f0: 44 42 29 0a 20 20 20 20 20 26 26 20 28 73 74 72  DB).     && (str
2a00: 6c 65 6e 28 70 4d 61 69 6e 2d 3e 7a 4e 61 6d 65  len(pMain->zName
2a10: 29 3d 3d 6e 4e 61 6d 65 29 0a 20 20 20 20 20 26  )==nName).     &
2a20: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 4d 61 69  & 0==memcmp(pMai
2a30: 6e 2d 3e 7a 4e 61 6d 65 2c 20 7a 4a 6f 75 72 6e  n->zName, zJourn
2a40: 61 6c 2c 20 6e 4e 61 6d 65 29 0a 20 20 20 20 20  al, nName).     
2a50: 26 26 20 28 70 4d 61 69 6e 2d 3e 65 4c 6f 63 6b  && (pMain->eLock
2a60: 3e 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 52 45  >=SQLITE_LOCK_RE
2a70: 53 45 52 56 45 44 29 0a 20 20 20 20 29 7b 0a 20  SERVED).    ){. 
2a80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2a90: 7d 0a 20 20 7d 0a 20 20 6c 65 61 76 65 4a 74 4d  }.  }.  leaveJtM
2aa0: 75 74 65 78 28 29 3b 0a 20 20 72 65 74 75 72 6e  utex();.  return
2ab0: 20 70 4d 61 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pMain;.}../*.**
2ac0: 20 50 61 72 61 6d 65 74 65 72 20 7a 20 70 6f 69   Parameter z poi
2ad0: 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72 20  nts to a buffer 
2ae0: 6f 66 20 34 20 62 79 74 65 73 20 69 6e 20 73 69  of 4 bytes in si
2af0: 7a 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20  ze containing a 
2b00: 0a 2a 2a 20 75 6e 73 69 67 6e 65 64 20 33 32 2d  .** unsigned 32-
2b10: 62 69 74 20 69 6e 74 65 67 65 72 20 73 74 6f 72  bit integer stor
2b20: 65 64 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  ed in big-endian
2b30: 20 66 6f 72 6d 61 74 2e 20 44 65 63 6f 64 65 20   format. Decode 
2b40: 74 68 65 20 0a 2a 2a 20 69 6e 74 65 67 65 72 20  the .** integer 
2b50: 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20 76  and return its v
2b60: 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  alue..*/.static 
2b70: 75 33 32 20 64 65 63 6f 64 65 55 69 6e 74 33 32  u32 decodeUint32
2b80: 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20  (const unsigned 
2b90: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 72 65 74 75  char *z){.  retu
2ba0: 72 6e 20 28 7a 5b 30 5d 3c 3c 32 34 29 20 2b 20  rn (z[0]<<24) + 
2bb0: 28 7a 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 7a 5b  (z[1]<<16) + (z[
2bc0: 32 5d 3c 3c 38 29 20 2b 20 7a 5b 33 5d 3b 0a 7d  2]<<8) + z[3];.}
2bd0: 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63 75 6c 61 74  ../*.** Calculat
2be0: 65 20 61 20 63 68 65 63 6b 73 75 6d 20 66 72 6f  e a checksum fro
2bf0: 6d 20 74 68 65 20 62 75 66 66 65 72 20 6f 66 20  m the buffer of 
2c00: 6c 65 6e 67 74 68 20 6e 20 62 79 74 65 73 20 70  length n bytes p
2c10: 6f 69 6e 74 65 64 20 74 6f 0a 2a 2a 20 62 79 20  ointed to.** by 
2c20: 70 61 72 61 6d 65 74 65 72 20 7a 2e 0a 2a 2f 0a  parameter z..*/.
2c30: 73 74 61 74 69 63 20 75 33 32 20 67 65 6e 43 6b  static u32 genCk
2c40: 73 75 6d 28 63 6f 6e 73 74 20 75 6e 73 69 67 6e  sum(const unsign
2c50: 65 64 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  ed char *z, int 
2c60: 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  n){.  int i;.  u
2c70: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  32 cksum = 0;.  
2c80: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  for(i=0; i<n; i+
2c90: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 3d 20  +){.    cksum = 
2ca0: 63 6b 73 75 6d 20 2b 20 7a 5b 69 5d 20 2b 20 28  cksum + z[i] + (
2cb0: 63 6b 73 75 6d 3c 3c 33 29 3b 0a 20 20 7d 0a 20  cksum<<3);.  }. 
2cc0: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
2cd0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
2ce0: 74 20 61 72 67 75 6d 65 6e 74 2c 20 7a 42 75 66  t argument, zBuf
2cf0: 2c 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  , points to a bu
2d00: 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ffer containing 
2d10: 61 20 32 38 20 62 79 74 65 0a 2a 2a 20 73 65 72  a 28 byte.** ser
2d20: 69 61 6c 69 7a 65 64 20 6a 6f 75 72 6e 61 6c 20  ialized journal 
2d30: 68 65 61 64 65 72 2e 20 54 68 69 73 20 66 75 6e  header. This fun
2d40: 63 74 69 6f 6e 20 64 65 73 65 72 69 61 6c 69 7a  ction deserializ
2d50: 65 73 20 66 6f 75 72 20 6f 66 20 74 68 65 0a 2a  es four of the.*
2d60: 2a 20 69 6e 74 65 67 65 72 20 66 69 65 6c 64 73  * integer fields
2d70: 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
2d80: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
2d90: 20 61 6e 64 20 77 72 69 74 65 73 20 74 68 65 69   and writes thei
2da0: 72 0a 2a 2a 20 76 61 6c 75 65 73 20 74 6f 20 74  r.** values to t
2db0: 68 65 20 6f 75 74 70 75 74 20 76 61 72 69 61 62  he output variab
2dc0: 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  les..**.** SQLIT
2dd0: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2de0: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d   if the journal-
2df0: 68 65 61 64 65 72 20 69 73 20 73 75 63 63 65 73  header is succes
2e00: 73 66 75 6c 6c 79 20 0a 2a 2a 20 64 65 63 6f 64  sfully .** decod
2e10: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53  ed. Otherwise, S
2e20: 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a  QLITE_ERROR..*/.
2e30: 73 74 61 74 69 63 20 69 6e 74 20 64 65 63 6f 64  static int decod
2e40: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 63  eJournalHdr(.  c
2e50: 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68  onst unsigned ch
2e60: 61 72 20 2a 7a 42 75 66 2c 20 20 20 20 20 20 20  ar *zBuf,       
2e70: 20 20 2f 2a 20 49 6e 70 75 74 3a 20 32 38 20 62    /* Input: 28 b
2e80: 79 74 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  yte journal head
2e90: 65 72 20 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 52  er */.  u32 *pnR
2ea0: 65 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ec,             
2eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75             /* Ou
2ec0: 74 3a 20 4e 75 6d 62 65 72 20 6f 66 20 6a 6f 75  t: Number of jou
2ed0: 72 6e 61 6c 6c 65 64 20 72 65 63 6f 72 64 73 20  rnalled records 
2ee0: 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 50 61 67 65  */.  u32 *pnPage
2ef0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2f00: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 3a 20          /* Out: 
2f10: 4f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  Original databas
2f20: 65 20 70 61 67 65 20 63 6f 75 6e 74 20 2a 2f 0a  e page count */.
2f30: 20 20 75 33 32 20 2a 70 6e 53 65 63 74 6f 72 2c    u32 *pnSector,
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 20 20 20 20 20 2f 2a 20 4f 75 74 3a 20 53 65 63       /* Out: Sec
2f60: 74 6f 72 20 73 69 7a 65 20 69 6e 20 62 79 74 65  tor size in byte
2f70: 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 50 61  s */.  u32 *pnPa
2f80: 67 65 73 69 7a 65 20 20 20 20 20 20 20 20 20 20  gesize          
2f90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2fa0: 3a 20 50 61 67 65 20 73 69 7a 65 20 69 6e 20 62  : Page size in b
2fb0: 79 74 65 73 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ytes */.){.  uns
2fc0: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
2fd0: 63 5b 5d 20 3d 20 7b 20 30 78 64 39 2c 20 30 78  c[] = { 0xd9, 0x
2fe0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
2ff0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
3000: 2c 20 30 78 64 37 20 7d 3b 0a 20 20 69 66 28 20  , 0xd7 };.  if( 
3010: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 7a  memcmp(aMagic, z
3020: 42 75 66 2c 20 38 29 20 29 20 72 65 74 75 72 6e  Buf, 8) ) return
3030: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
3040: 20 69 66 28 20 70 6e 52 65 63 20 29 20 2a 70 6e   if( pnRec ) *pn
3050: 52 65 63 20 3d 20 64 65 63 6f 64 65 55 69 6e 74  Rec = decodeUint
3060: 33 32 28 26 7a 42 75 66 5b 38 5d 29 3b 0a 20 20  32(&zBuf[8]);.  
3070: 69 66 28 20 70 6e 50 61 67 65 20 29 20 2a 70 6e  if( pnPage ) *pn
3080: 50 61 67 65 20 3d 20 64 65 63 6f 64 65 55 69 6e  Page = decodeUin
3090: 74 33 32 28 26 7a 42 75 66 5b 31 36 5d 29 3b 0a  t32(&zBuf[16]);.
30a0: 20 20 69 66 28 20 70 6e 53 65 63 74 6f 72 20 29    if( pnSector )
30b0: 20 2a 70 6e 53 65 63 74 6f 72 20 3d 20 64 65 63   *pnSector = dec
30c0: 6f 64 65 55 69 6e 74 33 32 28 26 7a 42 75 66 5b  odeUint32(&zBuf[
30d0: 32 30 5d 29 3b 0a 20 20 69 66 28 20 70 6e 50 61  20]);.  if( pnPa
30e0: 67 65 73 69 7a 65 20 29 20 2a 70 6e 50 61 67 65  gesize ) *pnPage
30f0: 73 69 7a 65 20 3d 20 64 65 63 6f 64 65 55 69 6e  size = decodeUin
3100: 74 33 32 28 26 7a 42 75 66 5b 32 34 5d 29 3b 0a  t32(&zBuf[24]);.
3110: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
3120: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  OK;.}../*.** Thi
3130: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
3140: 6c 6c 65 64 20 77 68 65 6e 20 61 20 6e 65 77 20  lled when a new 
3150: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 6f  transaction is o
3160: 70 65 6e 65 64 2c 20 6a 75 73 74 20 61 66 74 65  pened, just afte
3170: 72 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 6a  r.** the first j
3180: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73  ournal-header is
3190: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
31a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f  journal file..*/
31b0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
31c0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 6a 74 5f 66  Transaction(jt_f
31d0: 69 6c 65 20 2a 70 4d 61 69 6e 2c 20 6a 74 5f 66  ile *pMain, jt_f
31e0: 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 29 7b 0a  ile *pJournal){.
31f0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3200: 2a 61 44 61 74 61 3b 0a 20 20 73 71 6c 69 74 65  *aData;.  sqlite
3210: 33 5f 66 69 6c 65 20 2a 70 20 3d 20 70 4d 61 69  3_file *p = pMai
3220: 6e 2d 3e 70 52 65 61 6c 3b 0a 20 20 69 6e 74 20  n->pReal;.  int 
3230: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
3240: 0a 20 20 63 6c 6f 73 65 54 72 61 6e 73 61 63 74  .  closeTransact
3250: 69 6f 6e 28 70 4d 61 69 6e 29 3b 0a 20 20 61 44  ion(pMain);.  aD
3260: 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ata = sqlite3_ma
3270: 6c 6c 6f 63 28 70 4d 61 69 6e 2d 3e 6e 50 61 67  lloc(pMain->nPag
3280: 65 73 69 7a 65 29 3b 0a 20 20 70 4d 61 69 6e 2d  esize);.  pMain-
3290: 3e 70 57 72 69 74 61 62 6c 65 20 3d 20 73 71 6c  >pWritable = sql
32a0: 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
32b0: 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 29 3b 0a  (pMain->nPage);.
32c0: 20 20 70 4d 61 69 6e 2d 3e 61 43 6b 73 75 6d 20    pMain->aCksum 
32d0: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
32e0: 28 73 69 7a 65 6f 66 28 75 33 32 29 20 2a 20 28  (sizeof(u32) * (
32f0: 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 20 2b 20 31  pMain->nPage + 1
3300: 29 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 2d 3e  ));.  pJournal->
3310: 69 4d 61 78 4f 66 66 20 3d 20 30 3b 0a 0a 20 20  iMaxOff = 0;..  
3320: 69 66 28 20 21 70 4d 61 69 6e 2d 3e 70 57 72 69  if( !pMain->pWri
3330: 74 61 62 6c 65 20 7c 7c 20 21 70 4d 61 69 6e 2d  table || !pMain-
3340: 3e 61 43 6b 73 75 6d 20 7c 7c 20 21 61 44 61 74  >aCksum || !aDat
3350: 61 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  a ){.    rc = SQ
3360: 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
3370: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 4d  ;.  }else if( pM
3380: 61 69 6e 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a  ain->nPage>0 ){.
3390: 20 20 20 20 75 33 32 20 69 54 72 75 6e 6b 3b 0a      u32 iTrunk;.
33a0: 20 20 20 20 69 6e 74 20 69 53 61 76 65 3b 0a 20      int iSave;. 
33b0: 20 20 20 69 6e 74 20 69 53 61 76 65 32 3b 0a 0a     int iSave2;..
33c0: 20 20 20 20 73 74 6f 70 5f 69 6f 65 72 72 5f 73      stop_ioerr_s
33d0: 69 6d 75 6c 61 74 69 6f 6e 28 26 69 53 61 76 65  imulation(&iSave
33e0: 2c 20 26 69 53 61 76 65 32 29 3b 0a 0a 20 20 20  , &iSave2);..   
33f0: 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61 74   /* Read the dat
3400: 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74 2e  abase free-list.
3410: 20 41 64 64 20 74 68 65 20 70 61 67 65 2d 6e 75   Add the page-nu
3420: 6d 62 65 72 20 66 6f 72 20 65 61 63 68 20 66 72  mber for each fr
3430: 65 65 2d 6c 69 73 74 0a 20 20 20 20 2a 2a 20 6c  ee-list.    ** l
3440: 65 61 66 20 74 6f 20 74 68 65 20 6a 74 5f 66 69  eaf to the jt_fi
3450: 6c 65 2e 70 57 72 69 74 61 62 6c 65 20 62 69 74  le.pWritable bit
3460: 76 65 63 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  vec..    */.    
3470: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
3480: 61 64 28 70 2c 20 61 44 61 74 61 2c 20 70 4d 61  ad(p, aData, pMa
3490: 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 2c 20 30  in->nPagesize, 0
34a0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
34b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
34c0: 20 20 75 33 32 20 6e 44 62 73 69 7a 65 20 3d 20    u32 nDbsize = 
34d0: 64 65 63 6f 64 65 55 69 6e 74 33 32 28 26 61 44  decodeUint32(&aD
34e0: 61 74 61 5b 32 38 5d 29 3b 0a 20 20 20 20 20 20  ata[28]);.      
34f0: 69 66 28 20 6e 44 62 73 69 7a 65 3e 30 20 26 26  if( nDbsize>0 &&
3500: 20 6d 65 6d 63 6d 70 28 26 61 44 61 74 61 5b 32   memcmp(&aData[2
3510: 34 5d 2c 20 26 61 44 61 74 61 5b 39 32 5d 2c 20  4], &aData[92], 
3520: 34 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  4)==0 ){.       
3530: 20 75 33 32 20 69 50 67 3b 0a 20 20 20 20 20 20   u32 iPg;.      
3540: 20 20 66 6f 72 28 69 50 67 3d 6e 44 62 73 69 7a    for(iPg=nDbsiz
3550: 65 2b 31 3b 20 69 50 67 3c 3d 70 4d 61 69 6e 2d  e+1; iPg<=pMain-
3560: 3e 6e 50 61 67 65 3b 20 69 50 67 2b 2b 29 7b 0a  >nPage; iPg++){.
3570: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3580: 33 42 69 74 76 65 63 53 65 74 28 70 4d 61 69 6e  3BitvecSet(pMain
3590: 2d 3e 70 57 72 69 74 61 62 6c 65 2c 20 69 50 67  ->pWritable, iPg
35a0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
35c0: 54 72 75 6e 6b 20 3d 20 64 65 63 6f 64 65 55 69  Trunk = decodeUi
35d0: 6e 74 33 32 28 26 61 44 61 74 61 5b 33 32 5d 29  nt32(&aData[32])
35e0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d  ;.    while( rc=
35f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 54  =SQLITE_OK && iT
3600: 72 75 6e 6b 3e 30 20 29 7b 0a 20 20 20 20 20 20  runk>0 ){.      
3610: 75 33 32 20 6e 4c 65 61 66 3b 0a 20 20 20 20 20  u32 nLeaf;.     
3620: 20 75 33 32 20 69 4c 65 61 66 3b 0a 20 20 20 20   u32 iLeaf;.    
3630: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
3640: 69 4f 66 66 20 3d 20 28 69 54 72 75 6e 6b 2d 31  iOff = (iTrunk-1
3650: 29 2a 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69  )*pMain->nPagesi
3660: 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ze;.      rc = s
3670: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 2c 20  qlite3OsRead(p, 
3680: 61 44 61 74 61 2c 20 70 4d 61 69 6e 2d 3e 6e 50  aData, pMain->nP
3690: 61 67 65 73 69 7a 65 2c 20 69 4f 66 66 29 3b 0a  agesize, iOff);.
36a0: 20 20 20 20 20 20 6e 4c 65 61 66 20 3d 20 64 65        nLeaf = de
36b0: 63 6f 64 65 55 69 6e 74 33 32 28 26 61 44 61 74  codeUint32(&aDat
36c0: 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  a[4]);.      for
36d0: 28 69 4c 65 61 66 3d 30 3b 20 72 63 3d 3d 53 51  (iLeaf=0; rc==SQ
36e0: 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 65 61 66  LITE_OK && iLeaf
36f0: 3c 6e 4c 65 61 66 3b 20 69 4c 65 61 66 2b 2b 29  <nLeaf; iLeaf++)
3700: 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 70 67  {.        u32 pg
3710: 6e 6f 20 3d 20 64 65 63 6f 64 65 55 69 6e 74 33  no = decodeUint3
3720: 32 28 26 61 44 61 74 61 5b 38 2b 34 2a 69 4c 65  2(&aData[8+4*iLe
3730: 61 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  af]);.        sq
3740: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
3750: 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65 2c  Main->pWritable,
3760: 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a   pgno);.      }.
3770: 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20 64        iTrunk = d
3780: 65 63 6f 64 65 55 69 6e 74 33 32 28 61 44 61 74  ecodeUint32(aDat
3790: 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  a);.    }..    /
37a0: 2a 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 64 20  * Calculate and 
37b0: 73 74 6f 72 65 20 61 20 63 68 65 63 6b 73 75 6d  store a checksum
37c0: 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69   for each page i
37d0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
37e0: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
37f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
3800: 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
3810: 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 72       for(ii=0; r
3820: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
3830: 69 69 3c 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 3b  ii<pMain->nPage;
3840: 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
3850: 69 36 34 20 69 4f 66 66 20 3d 20 28 69 36 34 29  i64 iOff = (i64)
3860: 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a  (pMain->nPagesiz
3870: 65 29 20 2a 20 28 69 36 34 29 69 69 3b 0a 20 20  e) * (i64)ii;.  
3880: 20 20 20 20 20 20 69 66 28 20 69 4f 66 66 3d 3d        if( iOff==
3890: 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 29 20 63  PENDING_BYTE ) c
38a0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
38b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
38c0: 65 61 64 28 70 4d 61 69 6e 2d 3e 70 52 65 61 6c  ead(pMain->pReal
38d0: 2c 20 61 44 61 74 61 2c 20 70 4d 61 69 6e 2d 3e  , aData, pMain->
38e0: 6e 50 61 67 65 73 69 7a 65 2c 20 69 4f 66 66 29  nPagesize, iOff)
38f0: 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 69 6e 2d  ;.        pMain-
3900: 3e 61 43 6b 73 75 6d 5b 69 69 5d 20 3d 20 67 65  >aCksum[ii] = ge
3910: 6e 43 6b 73 75 6d 28 61 44 61 74 61 2c 20 70 4d  nCksum(aData, pM
3920: 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 29 3b  ain->nPagesize);
3930: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3940: 20 20 20 20 73 74 61 72 74 5f 69 6f 65 72 72 5f      start_ioerr_
3950: 73 69 6d 75 6c 61 74 69 6f 6e 28 69 53 61 76 65  simulation(iSave
3960: 2c 20 69 53 61 76 65 32 29 3b 0a 20 20 7d 0a 0a  , iSave2);.  }..
3970: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
3980: 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
3990: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
39a0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
39b0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
39c0: 20 69 73 20 61 20 68 61 6e 64 6c 65 20 6f 70 65   is a handle ope
39d0: 6e 20 6f 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n on a journal f
39e0: 69 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ile..** This fun
39f0: 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
3a00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
3a10: 20 61 64 64 73 20 74 68 65 20 70 61 67 65 20 6e   adds the page n
3a20: 75 6d 62 65 72 20 66 6f 72 20 65 61 63 68 0a 2a  umber for each.*
3a30: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  * page in the jo
3a40: 75 72 6e 61 6c 20 74 6f 20 74 68 65 20 42 69 74  urnal to the Bit
3a50: 76 65 63 20 6f 62 6a 65 63 74 20 70 61 73 73 65  vec object passe
3a60: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
3a70: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
3a80: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
3a90: 6e 61 6c 46 69 6c 65 28 6a 74 5f 66 69 6c 65 20  nalFile(jt_file 
3aa0: 2a 70 2c 20 6a 74 5f 66 69 6c 65 20 2a 70 4d 61  *p, jt_file *pMa
3ab0: 69 6e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  in){.  int rc = 
3ac0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73  SQLITE_OK;.  uns
3ad0: 69 67 6e 65 64 20 63 68 61 72 20 7a 42 75 66 5b  igned char zBuf[
3ae0: 32 38 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  28];.  sqlite3_f
3af0: 69 6c 65 20 2a 70 52 65 61 6c 20 3d 20 70 2d 3e  ile *pReal = p->
3b00: 70 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33  pReal;.  sqlite3
3b10: 5f 69 6e 74 36 34 20 69 4f 66 66 20 3d 20 30 3b  _int64 iOff = 0;
3b20: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
3b30: 20 69 53 69 7a 65 20 3d 20 70 2d 3e 69 4d 61 78   iSize = p->iMax
3b40: 4f 66 66 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  Off;.  unsigned 
3b50: 63 68 61 72 20 2a 61 50 61 67 65 3b 0a 20 20 69  char *aPage;.  i
3b60: 6e 74 20 69 53 61 76 65 3b 0a 20 20 69 6e 74 20  nt iSave;.  int 
3b70: 69 53 61 76 65 32 3b 0a 0a 20 20 61 50 61 67 65  iSave2;..  aPage
3b80: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
3b90: 63 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69  c(pMain->nPagesi
3ba0: 7a 65 29 3b 0a 20 20 69 66 28 20 21 61 50 61 67  ze);.  if( !aPag
3bb0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
3bc0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
3bd0: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 74 6f 70 5f  EM;.  }..  stop_
3be0: 69 6f 65 72 72 5f 73 69 6d 75 6c 61 74 69 6f 6e  ioerr_simulation
3bf0: 28 26 69 53 61 76 65 2c 20 26 69 53 61 76 65 32  (&iSave, &iSave2
3c00: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  );..  while( rc=
3c10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f  =SQLITE_OK && iO
3c20: 66 66 3c 69 53 69 7a 65 20 29 7b 0a 20 20 20 20  ff<iSize ){.    
3c30: 75 33 32 20 6e 52 65 63 2c 20 6e 50 61 67 65 2c  u32 nRec, nPage,
3c40: 20 6e 53 65 63 74 6f 72 2c 20 6e 50 61 67 65 73   nSector, nPages
3c50: 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 69 69 3b  ize;.    u32 ii;
3c60: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e  ..    /* Read an
3c70: 64 20 64 65 63 6f 64 65 20 74 68 65 20 6e 65 78  d decode the nex
3c80: 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
3c90: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
3ca0: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72  l file. */.    r
3cb0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
3cc0: 64 28 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 32  d(pReal, zBuf, 2
3cd0: 38 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 69 66  8, iOff);.    if
3ce0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3cf0: 0a 20 20 20 20 20 7c 7c 20 64 65 63 6f 64 65 4a  .     || decodeJ
3d00: 6f 75 72 6e 61 6c 48 64 72 28 7a 42 75 66 2c 20  ournalHdr(zBuf, 
3d10: 26 6e 52 65 63 2c 20 26 6e 50 61 67 65 2c 20 26  &nRec, &nPage, &
3d20: 6e 53 65 63 74 6f 72 2c 20 26 6e 50 61 67 65 73  nSector, &nPages
3d30: 69 7a 65 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ize) .    ){.   
3d40: 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 5f 72     goto finish_r
3d50: 6a 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f  jf;.    }.    iO
3d60: 66 66 20 2b 3d 20 6e 53 65 63 74 6f 72 3b 0a 0a  ff += nSector;..
3d70: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
3d80: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 74 72  ){.      /* A tr
3d90: 69 63 6b 2e 20 54 68 65 72 65 20 6d 69 67 68 74  ick. There might
3da0: 20 62 65 20 61 6e 6f 74 68 65 72 20 6a 6f 75 72   be another jour
3db0: 6e 61 6c 2d 68 65 61 64 65 72 20 69 6d 6d 65 64  nal-header immed
3dc0: 69 61 74 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  iately .      **
3dd0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
3de0: 6f 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  one. In this cas
3df0: 65 2c 20 30 20 72 65 63 6f 72 64 73 20 6d 65 61  e, 0 records mea
3e00: 6e 73 20 30 20 72 65 63 6f 72 64 73 2c 20 0a 20  ns 0 records, . 
3e10: 20 20 20 20 20 2a 2a 20 6e 6f 74 20 22 72 65 61       ** not "rea
3e20: 64 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 20  d until the end 
3e30: 6f 66 20 74 68 65 20 66 69 6c 65 22 2e 20 53 65  of the file". Se
3e40: 65 20 61 6c 73 6f 20 74 69 63 6b 65 74 20 23 32  e also ticket #2
3e50: 35 36 35 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  565..      */.  
3e60: 20 20 20 20 69 66 28 20 69 53 69 7a 65 3e 3d 28      if( iSize>=(
3e70: 69 4f 66 66 2b 6e 53 65 63 74 6f 72 29 20 29 7b  iOff+nSector) ){
3e80: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
3e90: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 52 65 61  lite3OsRead(pRea
3ea0: 6c 2c 20 7a 42 75 66 2c 20 32 38 2c 20 69 4f 66  l, zBuf, 28, iOf
3eb0: 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
3ec0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
3ed0: 20 30 3d 3d 64 65 63 6f 64 65 4a 6f 75 72 6e 61   0==decodeJourna
3ee0: 6c 48 64 72 28 7a 42 75 66 2c 20 30 2c 20 30 2c  lHdr(zBuf, 0, 0,
3ef0: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
3f00: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
3f10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3f20: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 53        nRec = (iS
3f30: 69 7a 65 2d 69 4f 66 66 29 20 2f 20 28 70 4d 61  ize-iOff) / (pMa
3f40: 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 2b 38 29  in->nPagesize+8)
3f50: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
3f60: 52 65 61 64 20 61 6c 6c 20 74 68 65 20 72 65 63  Read all the rec
3f70: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
3f80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
3f90: 64 65 72 20 6a 75 73 74 20 72 65 61 64 2e 20 2a  der just read. *
3fa0: 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  /.    for(ii=0; 
3fb0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
3fc0: 20 69 69 3c 6e 52 65 63 20 26 26 20 69 4f 66 66   ii<nRec && iOff
3fd0: 3c 69 53 69 7a 65 3b 20 69 69 2b 2b 29 7b 0a 20  <iSize; ii++){. 
3fe0: 20 20 20 20 20 75 33 32 20 70 67 6e 6f 3b 0a 20       u32 pgno;. 
3ff0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
4000: 33 4f 73 52 65 61 64 28 70 52 65 61 6c 2c 20 7a  3OsRead(pReal, z
4010: 42 75 66 2c 20 34 2c 20 69 4f 66 66 29 3b 0a 20  Buf, 4, iOff);. 
4020: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
4030: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
4040: 20 20 70 67 6e 6f 20 3d 20 64 65 63 6f 64 65 55    pgno = decodeU
4050: 69 6e 74 33 32 28 7a 42 75 66 29 3b 0a 20 20 20  int32(zBuf);.   
4060: 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 30 20       if( pgno>0 
4070: 26 26 20 70 67 6e 6f 3c 3d 70 4d 61 69 6e 2d 3e  && pgno<=pMain->
4080: 6e 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  nPage ){.       
4090: 20 20 20 69 66 28 20 30 3d 3d 73 71 6c 69 74 65     if( 0==sqlite
40a0: 33 42 69 74 76 65 63 54 65 73 74 28 70 4d 61 69  3BitvecTest(pMai
40b0: 6e 2d 3e 70 57 72 69 74 61 62 6c 65 2c 20 70 67  n->pWritable, pg
40c0: 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  no) ){.         
40d0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
40e0: 73 52 65 61 64 28 70 52 65 61 6c 2c 20 61 50 61  sRead(pReal, aPa
40f0: 67 65 2c 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65  ge, pMain->nPage
4100: 73 69 7a 65 2c 20 69 4f 66 66 2b 34 29 3b 0a 20  size, iOff+4);. 
4110: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
4120: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 75 33                u3
4140: 32 20 63 6b 73 75 6d 20 3d 20 67 65 6e 43 6b 73  2 cksum = genCks
4150: 75 6d 28 61 50 61 67 65 2c 20 70 4d 61 69 6e 2d  um(aPage, pMain-
4160: 3e 6e 50 61 67 65 73 69 7a 65 29 3b 0a 20 20 20  >nPagesize);.   
4170: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
4180: 74 28 20 63 6b 73 75 6d 3d 3d 70 4d 61 69 6e 2d  t( cksum==pMain-
4190: 3e 61 43 6b 73 75 6d 5b 70 67 6e 6f 2d 31 5d 20  >aCksum[pgno-1] 
41a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
41b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
41c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
41d0: 74 76 65 63 53 65 74 28 70 4d 61 69 6e 2d 3e 70  tvecSet(pMain->p
41e0: 57 72 69 74 61 62 6c 65 2c 20 70 67 6e 6f 29 3b  Writable, pgno);
41f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4200: 20 20 20 69 4f 66 66 20 2b 3d 20 28 38 20 2b 20     iOff += (8 + 
4210: 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65  pMain->nPagesize
4220: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
4230: 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20 28 28 69  ..    iOff = ((i
4240: 4f 66 66 20 2b 20 28 6e 53 65 63 74 6f 72 2d 31  Off + (nSector-1
4250: 29 29 20 2f 20 6e 53 65 63 74 6f 72 29 20 2a 20  )) / nSector) * 
4260: 6e 53 65 63 74 6f 72 3b 0a 20 20 7d 0a 0a 66 69  nSector;.  }..fi
4270: 6e 69 73 68 5f 72 6a 66 3a 0a 20 20 73 74 61 72  nish_rjf:.  star
4280: 74 5f 69 6f 65 72 72 5f 73 69 6d 75 6c 61 74 69  t_ioerr_simulati
4290: 6f 6e 28 69 53 61 76 65 2c 20 69 53 61 76 65 32  on(iSave, iSave2
42a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
42b0: 65 28 61 50 61 67 65 29 3b 0a 20 20 69 66 28 20  e(aPage);.  if( 
42c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
42d0: 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
42e0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
42f0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
4300: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  rc;.}../*.** Wri
4310: 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 6a 74  te data to an jt
4320: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
4330: 20 69 6e 74 20 6a 74 57 72 69 74 65 28 0a 20 20   int jtWrite(.  
4340: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
4350: 69 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 76 6f  ile, .  const vo
4360: 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e 74  id *zBuf, .  int
4370: 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74 65   iAmt, .  sqlite
4380: 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b 0a  _int64 iOfst.){.
4390: 20 20 69 6e 74 20 72 63 3b 0a 20 20 6a 74 5f 66    int rc;.  jt_f
43a0: 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f 66 69 6c  ile *p = (jt_fil
43b0: 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28  e *)pFile;.  if(
43c0: 20 70 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45   p->flags&SQLITE
43d0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e  _OPEN_MAIN_JOURN
43e0: 41 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 69 4f  AL ){.    if( iO
43f0: 66 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  fst==0 ){.      
4400: 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 20 3d  jt_file *pMain =
4410: 20 6c 6f 63 61 74 65 44 61 74 61 62 61 73 65 48   locateDatabaseH
4420: 61 6e 64 6c 65 28 70 2d 3e 7a 4e 61 6d 65 29 3b  andle(p->zName);
4430: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4440: 4d 61 69 6e 20 29 3b 0a 20 20 0a 20 20 20 20 20  Main );.  .     
4450: 20 69 66 28 20 69 41 6d 74 3d 3d 32 38 20 29 7b   if( iAmt==28 ){
4460: 0a 20 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f  .        /* Zero
4470: 69 6e 67 20 74 68 65 20 66 69 72 73 74 20 6a 6f  ing the first jo
4480: 75 72 6e 61 6c 2d 66 69 6c 65 20 68 65 61 64 65  urnal-file heade
4490: 72 2e 20 54 68 69 73 20 69 73 20 74 68 65 20 65  r. This is the e
44a0: 6e 64 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20  nd of a.        
44b0: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
44c0: 2a 2f 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65  */.        close
44d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69  Transaction(pMai
44e0: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n);.      }else 
44f0: 69 66 28 20 69 41 6d 74 21 3d 31 32 20 29 7b 0a  if( iAmt!=12 ){.
4500: 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 69          /* Writi
4510: 6e 67 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  ng the first jou
4520: 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 61  rnal header to a
4530: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
4540: 68 69 73 20 68 61 70 70 65 6e 73 0a 20 20 20 20  his happens.    
4550: 20 20 20 20 2a 2a 20 77 68 65 6e 20 61 20 74 72      ** when a tr
4560: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72  ansaction is fir
4570: 73 74 20 73 74 61 72 74 65 64 2e 20 20 2a 2f 0a  st started.  */.
4580: 20 20 20 20 20 20 20 20 75 38 20 2a 7a 20 3d 20          u8 *z = 
4590: 28 75 38 20 2a 29 7a 42 75 66 3b 0a 20 20 20 20  (u8 *)zBuf;.    
45a0: 20 20 20 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65      pMain->nPage
45b0: 20 3d 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28   = decodeUint32(
45c0: 26 7a 5b 31 36 5d 29 3b 0a 20 20 20 20 20 20 20  &z[16]);.       
45d0: 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a   pMain->nPagesiz
45e0: 65 20 3d 20 64 65 63 6f 64 65 55 69 6e 74 33 32  e = decodeUint32
45f0: 28 26 7a 5b 32 34 5d 29 3b 0a 20 20 20 20 20 20  (&z[24]);.      
4600: 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21    if( SQLITE_OK!
4610: 3d 28 72 63 3d 6f 70 65 6e 54 72 61 6e 73 61 63  =(rc=openTransac
4620: 74 69 6f 6e 28 70 4d 61 69 6e 2c 20 70 29 29 20  tion(pMain, p)) 
4630: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
4640: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
4650: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
4660: 20 20 20 20 69 66 28 20 70 2d 3e 69 4d 61 78 4f      if( p->iMaxO
4670: 66 66 3c 28 69 4f 66 73 74 20 2b 20 69 41 6d 74  ff<(iOfst + iAmt
4680: 29 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 4d  ) ){.      p->iM
4690: 61 78 4f 66 66 20 3d 20 69 4f 66 73 74 20 2b 20  axOff = iOfst + 
46a0: 69 41 6d 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  iAmt;.    }.  }.
46b0: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26  .  if( p->flags&
46c0: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
46d0: 5f 44 42 20 26 26 20 70 2d 3e 70 57 72 69 74 61  _DB && p->pWrita
46e0: 62 6c 65 20 29 7b 0a 20 20 20 20 69 66 28 20 69  ble ){.    if( i
46f0: 41 6d 74 3c 70 2d 3e 6e 50 61 67 65 73 69 7a 65  Amt<p->nPagesize
4700: 20 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 50 61   .     && p->nPa
4710: 67 65 73 69 7a 65 25 69 41 6d 74 3d 3d 30 20 0a  gesize%iAmt==0 .
4720: 20 20 20 20 20 26 26 20 69 4f 66 73 74 3e 3d 28       && iOfst>=(
4730: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32  PENDING_BYTE+512
4740: 29 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73 74  ) .     && iOfst
4750: 2b 69 41 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42  +iAmt<=PENDING_B
4760: 59 54 45 2b 70 2d 3e 6e 50 61 67 65 73 69 7a 65  YTE+p->nPagesize
4770: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a  .    ){.      /*
4780: 20 4e 6f 2d 6f 70 2e 20 54 68 69 73 20 73 70 65   No-op. This spe
4790: 63 69 61 6c 20 63 61 73 65 20 69 73 20 68 69 74  cial case is hit
47a0: 20 77 68 65 6e 20 74 68 65 20 62 61 63 6b 75 70   when the backup
47b0: 20 63 6f 64 65 20 69 73 20 63 6f 70 79 69 6e 67   code is copying
47c0: 20 61 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61   a.      ** to a
47d0: 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61   database with a
47e0: 20 6c 61 72 67 65 72 20 70 61 67 65 2d 73 69 7a   larger page-siz
47f0: 65 20 74 68 61 6e 20 74 68 65 20 73 6f 75 72 63  e than the sourc
4800: 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 0a 20  e database and. 
4810: 20 20 20 20 20 2a 2a 20 69 74 20 6e 65 65 64 73       ** it needs
4820: 20 74 6f 20 66 69 6c 6c 20 69 6e 20 74 68 65 20   to fill in the 
4830: 6e 6f 6e 2d 6c 6f 63 6b 69 6e 67 2d 72 65 67 69  non-locking-regi
4840: 6f 6e 20 70 61 72 74 20 6f 66 20 74 68 65 20 6f  on part of the o
4850: 72 69 67 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a  riginal.      **
4860: 20 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61   pending-byte pa
4870: 67 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ge..      */.   
4880: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33   }else{.      u3
4890: 32 20 70 67 6e 6f 20 3d 20 69 4f 66 73 74 2f 70  2 pgno = iOfst/p
48a0: 2d 3e 6e 50 61 67 65 73 69 7a 65 20 2b 20 31 3b  ->nPagesize + 1;
48b0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
48c0: 69 41 6d 74 3d 3d 31 7c 7c 69 41 6d 74 3d 3d 70  iAmt==1||iAmt==p
48d0: 2d 3e 6e 50 61 67 65 73 69 7a 65 29 20 26 26 20  ->nPagesize) && 
48e0: 28 28 69 4f 66 73 74 2b 69 41 6d 74 29 25 70 2d  ((iOfst+iAmt)%p-
48f0: 3e 6e 50 61 67 65 73 69 7a 65 29 3d 3d 30 20 29  >nPagesize)==0 )
4900: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
4910: 70 67 6e 6f 3c 3d 70 2d 3e 6e 50 61 67 65 20 7c  pgno<=p->nPage |
4920: 7c 20 70 2d 3e 6e 53 79 6e 63 3e 30 20 29 3b 0a  | p->nSync>0 );.
4930: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 67        assert( pg
4940: 6e 6f 3e 70 2d 3e 6e 50 61 67 65 20 7c 7c 20 73  no>p->nPage || s
4950: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
4960: 28 70 2d 3e 70 57 72 69 74 61 62 6c 65 2c 20 70  (p->pWritable, p
4970: 67 6e 6f 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  gno) );.    }.  
4980: 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  }..  rc = sqlite
4990: 33 4f 73 57 72 69 74 65 28 70 2d 3e 70 52 65 61  3OsWrite(p->pRea
49a0: 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20 69  l, zBuf, iAmt, i
49b0: 4f 66 73 74 29 3b 0a 20 20 69 66 28 20 28 70 2d  Ofst);.  if( (p-
49c0: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  >flags&SQLITE_OP
49d0: 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29  EN_MAIN_JOURNAL)
49e0: 20 26 26 20 69 41 6d 74 3d 3d 31 32 20 29 7b 0a   && iAmt==12 ){.
49f0: 20 20 20 20 6a 74 5f 66 69 6c 65 20 2a 70 4d 61      jt_file *pMa
4a00: 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61 74 61 62  in = locateDatab
4a10: 61 73 65 48 61 6e 64 6c 65 28 70 2d 3e 7a 4e 61  aseHandle(p->zNa
4a20: 6d 65 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 32  me);.    int rc2
4a30: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 46 69   = readJournalFi
4a40: 6c 65 28 70 2c 20 70 4d 61 69 6e 29 3b 0a 20 20  le(p, pMain);.  
4a50: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4a60: 5f 4f 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a  _OK ) rc = rc2;.
4a70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
4a80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
4a90: 74 65 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a  te an jt-file..*
4aa0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 54  /.static int jtT
4ab0: 72 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f  runcate(sqlite3_
4ac0: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  file *pFile, sql
4ad0: 69 74 65 5f 69 6e 74 36 34 20 73 69 7a 65 29 7b  ite_int64 size){
4ae0: 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20  .  jt_file *p = 
4af0: 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  (jt_file *)pFile
4b00: 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ;.  if( p->flags
4b10: 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  &SQLITE_OPEN_MAI
4b20: 4e 5f 4a 4f 55 52 4e 41 4c 20 26 26 20 73 69 7a  N_JOURNAL && siz
4b30: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  e==0 ){.    /* T
4b40: 72 75 6e 63 61 74 69 6e 67 20 61 20 6a 6f 75 72  runcating a jour
4b50: 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69  nal file. This i
4b60: 73 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 74  s the end of a t
4b70: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20  ransaction. */. 
4b80: 20 20 20 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69     jt_file *pMai
4b90: 6e 20 3d 20 6c 6f 63 61 74 65 44 61 74 61 62 61  n = locateDataba
4ba0: 73 65 48 61 6e 64 6c 65 28 70 2d 3e 7a 4e 61 6d  seHandle(p->zNam
4bb0: 65 29 3b 0a 20 20 20 20 63 6c 6f 73 65 54 72 61  e);.    closeTra
4bc0: 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e 29 3b  nsaction(pMain);
4bd0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c  .  }.  if( p->fl
4be0: 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
4bf0: 4d 41 49 4e 5f 44 42 20 26 26 20 70 2d 3e 70 57  MAIN_DB && p->pW
4c00: 72 69 74 61 62 6c 65 20 29 7b 0a 20 20 20 20 75  ritable ){.    u
4c10: 33 32 20 70 67 6e 6f 3b 0a 20 20 20 20 75 33 32  32 pgno;.    u32
4c20: 20 6c 6f 63 6b 69 6e 67 5f 70 61 67 65 20 3d 20   locking_page = 
4c30: 28 75 33 32 29 28 50 45 4e 44 49 4e 47 5f 42 59  (u32)(PENDING_BY
4c40: 54 45 2f 70 2d 3e 6e 50 61 67 65 73 69 7a 65 2b  TE/p->nPagesize+
4c50: 31 29 3b 0a 20 20 20 20 66 6f 72 28 70 67 6e 6f  1);.    for(pgno
4c60: 3d 73 69 7a 65 2f 70 2d 3e 6e 50 61 67 65 73 69  =size/p->nPagesi
4c70: 7a 65 2b 31 3b 20 70 67 6e 6f 3c 3d 70 2d 3e 6e  ze+1; pgno<=p->n
4c80: 50 61 67 65 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20  Page; pgno++){. 
4c90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e       assert( pgn
4ca0: 6f 3d 3d 6c 6f 63 6b 69 6e 67 5f 70 61 67 65 20  o==locking_page 
4cb0: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
4cc0: 54 65 73 74 28 70 2d 3e 70 57 72 69 74 61 62 6c  Test(p->pWritabl
4cd0: 65 2c 20 70 67 6e 6f 29 20 29 3b 0a 20 20 20 20  e, pgno) );.    
4ce0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  }.  }.  return s
4cf0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
4d00: 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69 7a 65 29  (p->pReal, size)
4d10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
4d20: 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  an jt-file..*/.s
4d30: 74 61 74 69 63 20 69 6e 74 20 6a 74 53 79 6e 63  tatic int jtSync
4d40: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
4d50: 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29  File, int flags)
4d60: 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d  {.  jt_file *p =
4d70: 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c   (jt_file *)pFil
4d80: 65 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61  e;..  if( p->fla
4d90: 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  gs&SQLITE_OPEN_M
4da0: 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 7b 0a 20  AIN_JOURNAL ){. 
4db0: 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 6a     int rc;.    j
4dc0: 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 3b 20 20  t_file *pMain;  
4dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4de0: 20 2f 2a 20 54 68 65 20 61 73 73 6f 63 69 61 74   /* The associat
4df0: 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ed database file
4e00: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20   */..    /* The 
4e10: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
4e20: 62 65 69 6e 67 20 73 79 6e 63 65 64 2e 20 41 74  being synced. At
4e30: 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20   this point, we 
4e40: 69 6e 73 70 65 63 74 20 74 68 65 20 0a 20 20 20  inspect the .   
4e50: 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20   ** contents of 
4e60: 74 68 65 20 66 69 6c 65 20 75 70 20 74 6f 20 74  the file up to t
4e70: 68 69 73 20 70 6f 69 6e 74 20 61 6e 64 20 73 65  his point and se
4e80: 74 20 65 61 63 68 20 62 69 74 20 69 6e 20 74 68  t each bit in th
4e90: 65 20 0a 20 20 20 20 2a 2a 20 6a 74 5f 66 69 6c  e .    ** jt_fil
4ea0: 65 2e 70 57 72 69 74 61 62 6c 65 20 62 69 74 76  e.pWritable bitv
4eb0: 65 63 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64  ec of the main d
4ec0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73 73  atabase file ass
4ed0: 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20 20  ociated with.   
4ee0: 20 2a 2a 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c   ** this journal
4ef0: 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
4f00: 20 20 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65    pMain = locate
4f10: 44 61 74 61 62 61 73 65 48 61 6e 64 6c 65 28 70  DatabaseHandle(p
4f20: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73  ->zName);.    as
4f30: 73 65 72 74 28 70 4d 61 69 6e 29 3b 0a 0a 20 20  sert(pMain);..  
4f40: 20 20 2f 2a 20 53 65 74 20 74 68 65 20 62 69 74    /* Set the bit
4f50: 76 65 63 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  vec values */.  
4f60: 20 20 69 66 28 20 70 4d 61 69 6e 2d 3e 70 57 72    if( pMain->pWr
4f70: 69 74 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20  itable ){.      
4f80: 70 4d 61 69 6e 2d 3e 6e 53 79 6e 63 2b 2b 3b 0a  pMain->nSync++;.
4f90: 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a        rc = readJ
4fa0: 6f 75 72 6e 61 6c 46 69 6c 65 28 70 2c 20 70 4d  ournalFile(p, pM
4fb0: 61 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ain);.      if( 
4fc0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
4fd0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
4fe0: 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
4ff0: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
5000: 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 2d  sqlite3OsSync(p-
5010: 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 29 3b 0a  >pReal, flags);.
5020: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
5030: 74 68 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65  the current file
5040: 2d 73 69 7a 65 20 6f 66 20 61 6e 20 6a 74 2d 66  -size of an jt-f
5050: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
5060: 6e 74 20 6a 74 46 69 6c 65 53 69 7a 65 28 73 71  nt jtFileSize(sq
5070: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
5080: 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  e, sqlite_int64 
5090: 2a 70 53 69 7a 65 29 7b 0a 20 20 6a 74 5f 66 69  *pSize){.  jt_fi
50a0: 6c 65 20 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65  le *p = (jt_file
50b0: 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75   *)pFile;.  retu
50c0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  rn sqlite3OsFile
50d0: 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70  Size(p->pReal, p
50e0: 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Size);.}../*.** 
50f0: 4c 6f 63 6b 20 61 6e 20 6a 74 2d 66 69 6c 65 2e  Lock an jt-file.
5100: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
5110: 74 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  tLock(sqlite3_fi
5120: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
5130: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Lock){.  int rc;
5140: 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20  .  jt_file *p = 
5150: 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  (jt_file *)pFile
5160: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
5170: 4f 73 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  OsLock(p->pReal,
5180: 20 65 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72   eLock);.  if( r
5190: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
51a0: 65 4c 6f 63 6b 3e 70 2d 3e 65 4c 6f 63 6b 20 29  eLock>p->eLock )
51b0: 7b 0a 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 20 3d  {.    p->eLock =
51c0: 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65   eLock;.  }.  re
51d0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
51e0: 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20 6a 74 2d 66  * Unlock an jt-f
51f0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
5200: 6e 74 20 6a 74 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt jtUnlock(sqli
5210: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
5220: 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69   int eLock){.  i
5230: 6e 74 20 72 63 3b 0a 20 20 6a 74 5f 66 69 6c 65  nt rc;.  jt_file
5240: 20 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a   *p = (jt_file *
5250: 29 70 46 69 6c 65 3b 0a 20 20 72 63 20 3d 20 73  )pFile;.  rc = s
5260: 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70  qlite3OsUnlock(p
5270: 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b  ->pReal, eLock);
5280: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5290: 45 5f 4f 4b 20 26 26 20 65 4c 6f 63 6b 3c 70 2d  E_OK && eLock<p-
52a0: 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 2d  >eLock ){.    p-
52b0: 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a  >eLock = eLock;.
52c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
52d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  .}../*.** Check 
52e0: 69 66 20 61 6e 6f 74 68 65 72 20 66 69 6c 65 2d  if another file-
52f0: 68 61 6e 64 6c 65 20 68 6f 6c 64 73 20 61 20 52  handle holds a R
5300: 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
5310: 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  an jt-file..*/.s
5320: 74 61 74 69 63 20 69 6e 74 20 6a 74 43 68 65 63  tatic int jtChec
5330: 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71  kReservedLock(sq
5340: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
5350: 65 2c 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29  e, int *pResOut)
5360: 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d  {.  jt_file *p =
5370: 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c   (jt_file *)pFil
5380: 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  e;.  return sqli
5390: 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76  te3OsCheckReserv
53a0: 65 64 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c  edLock(p->pReal,
53b0: 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a   pResOut);.}../*
53c0: 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c  .** File control
53d0: 20 6d 65 74 68 6f 64 2e 20 46 6f 72 20 63 75 73   method. For cus
53e0: 74 6f 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f  tom operations o
53f0: 6e 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f  n an jt-file..*/
5400: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 46 69  .static int jtFi
5410: 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65  leControl(sqlite
5420: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
5430: 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72  nt op, void *pAr
5440: 67 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70  g){.  jt_file *p
5450: 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46   = (jt_file *)pF
5460: 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ile;.  return sq
5470: 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72  lite3OsFileContr
5480: 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c  ol(p->pReal, op,
5490: 20 70 41 72 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pArg);.}../*.**
54a0: 20 52 65 74 75 72 6e 20 74 68 65 20 73 65 63 74   Return the sect
54b0: 6f 72 2d 73 69 7a 65 20 69 6e 20 62 79 74 65 73  or-size in bytes
54c0: 20 66 6f 72 20 61 6e 20 6a 74 2d 66 69 6c 65 2e   for an jt-file.
54d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
54e0: 74 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69  tSectorSize(sqli
54f0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29  te3_file *pFile)
5500: 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d  {.  jt_file *p =
5510: 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c   (jt_file *)pFil
5520: 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  e;.  return sqli
5530: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
5540: 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a  p->pReal);.}../*
5550: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  .** Return the d
5560: 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72 69  evice characteri
5570: 73 74 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f  stic flags suppo
5580: 72 74 65 64 20 62 79 20 61 6e 20 6a 74 2d 66 69  rted by an jt-fi
5590: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
55a0: 74 20 6a 74 44 65 76 69 63 65 43 68 61 72 61 63  t jtDeviceCharac
55b0: 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74 65  teristics(sqlite
55c0: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
55d0: 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28    jt_file *p = (
55e0: 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  jt_file *)pFile;
55f0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5600: 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
5610: 65 72 69 73 74 69 63 73 28 70 2d 3e 70 52 65 61  eristics(p->pRea
5620: 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  l);.}../*.** Ope
5630: 6e 20 61 6e 20 6a 74 20 66 69 6c 65 20 68 61 6e  n an jt file han
5640: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dle..*/.static i
5650: 6e 74 20 6a 74 4f 70 65 6e 28 0a 20 20 73 71 6c  nt jtOpen(.  sql
5660: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a  ite3_vfs *pVfs,.
5670: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5680: 61 6d 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66  ame,.  sqlite3_f
5690: 69 6c 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e  ile *pFile,.  in
56a0: 74 20 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a  t flags,.  int *
56b0: 70 4f 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69  pOutFlags.){.  i
56c0: 6e 74 20 72 63 3b 0a 20 20 6a 74 5f 66 69 6c 65  nt rc;.  jt_file
56d0: 20 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a   *p = (jt_file *
56e0: 29 70 46 69 6c 65 3b 0a 20 20 70 46 69 6c 65 2d  )pFile;.  pFile-
56f0: 3e 70 4d 65 74 68 6f 64 73 20 3d 20 30 3b 0a 20  >pMethods = 0;. 
5700: 20 70 2d 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c   p->pReal = (sql
5710: 69 74 65 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31  ite3_file *)&p[1
5720: 5d 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70  ];.  p->pReal->p
5730: 4d 65 74 68 6f 64 73 20 3d 20 30 3b 0a 20 20 72  Methods = 0;.  r
5740: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
5750: 6e 28 67 2e 70 56 66 73 2c 20 7a 4e 61 6d 65 2c  n(g.pVfs, zName,
5760: 20 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73   p->pReal, flags
5770: 2c 20 70 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20  , pOutFlags);.  
5780: 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
5790: 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e 70 52 65 61  TE_OK || p->pRea
57a0: 6c 2d 3e 70 4d 65 74 68 6f 64 73 3d 3d 30 20 29  l->pMethods==0 )
57b0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
57c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69  TE_OK ){.    pFi
57d0: 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20 26  le->pMethods = &
57e0: 6a 74 5f 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20  jt_io_methods;. 
57f0: 20 20 20 70 2d 3e 65 4c 6f 63 6b 20 3d 20 30 3b     p->eLock = 0;
5800: 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20  .    p->zName = 
5810: 7a 4e 61 6d 65 3b 0a 20 20 20 20 70 2d 3e 66 6c  zName;.    p->fl
5820: 61 67 73 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20  ags = flags;.   
5830: 20 70 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20   p->pNext = 0;. 
5840: 20 20 20 70 2d 3e 70 57 72 69 74 61 62 6c 65 20     p->pWritable 
5850: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 61 43 6b 73  = 0;.    p->aCks
5860: 75 6d 20 3d 20 30 3b 0a 20 20 20 20 65 6e 74 65  um = 0;.    ente
5870: 72 4a 74 4d 75 74 65 78 28 29 3b 0a 20 20 20 20  rJtMutex();.    
5880: 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20  if( zName ){.   
5890: 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20 67 2e     p->pNext = g.
58a0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 67 2e 70  pList;.      g.p
58b0: 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  List = p;.    }.
58c0: 20 20 20 20 6c 65 61 76 65 4a 74 4d 75 74 65 78      leaveJtMutex
58d0: 28 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ();.  }.  return
58e0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65   rc;.}../*.** De
58f0: 6c 65 74 65 20 74 68 65 20 66 69 6c 65 20 6c 6f  lete the file lo
5900: 63 61 74 65 64 20 61 74 20 7a 50 61 74 68 2e 20  cated at zPath. 
5910: 49 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61  If the dirSync a
5920: 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c  rgument is true,
5930: 0a 2a 2a 20 65 6e 73 75 72 65 20 74 68 65 20 66  .** ensure the f
5940: 69 6c 65 2d 73 79 73 74 65 6d 20 6d 6f 64 69 66  ile-system modif
5950: 69 63 61 74 69 6f 6e 73 20 61 72 65 20 73 79 6e  ications are syn
5960: 63 65 64 20 74 6f 20 64 69 73 6b 20 62 65 66 6f  ced to disk befo
5970: 72 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e  re.** returning.
5980: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
5990: 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f  tDelete(sqlite3_
59a0: 76 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74  vfs *pVfs, const
59b0: 20 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e   char *zPath, in
59c0: 74 20 64 69 72 53 79 6e 63 29 7b 0a 20 20 69 6e  t dirSync){.  in
59d0: 74 20 6e 50 61 74 68 20 3d 20 73 74 72 6c 65 6e  t nPath = strlen
59e0: 28 7a 50 61 74 68 29 3b 0a 20 20 69 66 28 20 6e  (zPath);.  if( n
59f0: 50 61 74 68 3e 38 20 26 26 20 30 3d 3d 73 74 72  Path>8 && 0==str
5a00: 63 6d 70 28 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20  cmp("-journal", 
5a10: 26 7a 50 61 74 68 5b 6e 50 61 74 68 2d 38 5d 29  &zPath[nPath-8])
5a20: 20 29 7b 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74   ){.    /* Delet
5a30: 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ing a journal fi
5a40: 6c 65 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 61  le. The end of a
5a50: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f   transaction. */
5a60: 0a 20 20 20 20 6a 74 5f 66 69 6c 65 20 2a 70 4d  .    jt_file *pM
5a70: 61 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61 74 61  ain = locateData
5a80: 62 61 73 65 48 61 6e 64 6c 65 28 7a 50 61 74 68  baseHandle(zPath
5a90: 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61 69 6e  );.    if( pMain
5aa0: 20 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 54   ){.      closeT
5ab0: 72 61 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e  ransaction(pMain
5ac0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
5ad0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
5ae0: 44 65 6c 65 74 65 28 67 2e 70 56 66 73 2c 20 7a  Delete(g.pVfs, z
5af0: 50 61 74 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a  Path, dirSync);.
5b00: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f  }../*.** Test fo
5b10: 72 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73  r access permiss
5b20: 69 6f 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75  ions. Return tru
5b30: 65 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74  e if the request
5b40: 65 64 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a  ed permission.**
5b50: 20 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f   is available, o
5b60: 72 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  r false otherwis
5b70: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5b80: 20 6a 74 41 63 63 65 73 73 28 0a 20 20 73 71 6c   jtAccess(.  sql
5b90: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
5ba0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5bb0: 50 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61  Path, .  int fla
5bc0: 67 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73  gs, .  int *pRes
5bd0: 4f 75 74 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Out.){.  return 
5be0: 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
5bf0: 67 2e 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 66  g.pVfs, zPath, f
5c00: 6c 61 67 73 2c 20 70 52 65 73 4f 75 74 29 3b 0a  lags, pResOut);.
5c10: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74  }../*.** Populat
5c20: 65 20 62 75 66 66 65 72 20 7a 4f 75 74 20 77 69  e buffer zOut wi
5c30: 74 68 20 74 68 65 20 66 75 6c 6c 20 63 61 6e 6f  th the full cano
5c40: 6e 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 63  nical pathname c
5c50: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
5c60: 74 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20  to the pathname 
5c70: 69 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20 69  in zPath. zOut i
5c80: 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20  s guaranteed to 
5c90: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
5ca0: 72 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73 74  r.** of at least
5cb0: 20 28 4a 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d   (JT_MAX_PATHNAM
5cc0: 45 2b 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73  E+1) bytes..*/.s
5cd0: 74 61 74 69 63 20 69 6e 74 20 6a 74 46 75 6c 6c  tatic int jtFull
5ce0: 50 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69  Pathname(.  sqli
5cf0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a  te3_vfs *pVfs, .
5d00: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
5d10: 61 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74  ath, .  int nOut
5d20: 2c 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a  , .  char *zOut.
5d30: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
5d40: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
5d50: 65 28 67 2e 70 56 66 73 2c 20 7a 50 61 74 68 2c  e(g.pVfs, zPath,
5d60: 20 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d 0a   nOut, zOut);.}.
5d70: 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20  ./*.** Open the 
5d80: 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20  dynamic library 
5d90: 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74 68  located at zPath
5da0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 68 61   and return a ha
5db0: 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ndle..*/.static 
5dc0: 76 6f 69 64 20 2a 6a 74 44 6c 4f 70 65 6e 28 73  void *jtDlOpen(s
5dd0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
5de0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
5df0: 61 74 68 29 7b 0a 20 20 72 65 74 75 72 6e 20 67  ath){.  return g
5e00: 2e 70 56 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 67  .pVfs->xDlOpen(g
5e10: 2e 70 56 66 73 2c 20 7a 50 61 74 68 29 3b 0a 7d  .pVfs, zPath);.}
5e20: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
5e30: 20 74 68 65 20 62 75 66 66 65 72 20 7a 45 72 72   the buffer zErr
5e40: 4d 73 67 20 28 73 69 7a 65 20 6e 42 79 74 65 20  Msg (size nByte 
5e50: 62 79 74 65 73 29 20 77 69 74 68 20 61 20 68 75  bytes) with a hu
5e60: 6d 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a 2a 20  man readable.** 
5e70: 75 74 66 2d 38 20 73 74 72 69 6e 67 20 64 65 73  utf-8 string des
5e80: 63 72 69 62 69 6e 67 20 74 68 65 20 6d 6f 73 74  cribing the most
5e90: 20 72 65 63 65 6e 74 20 65 72 72 6f 72 20 65 6e   recent error en
5ea0: 63 6f 75 6e 74 65 72 65 64 20 61 73 73 6f 63 69  countered associ
5eb0: 61 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 64 79  ated .** with dy
5ec0: 6e 61 6d 69 63 20 6c 69 62 72 61 72 69 65 73 2e  namic libraries.
5ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5ee0: 6a 74 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  jtDlError(sqlite
5ef0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
5f00: 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45   nByte, char *zE
5f10: 72 72 4d 73 67 29 7b 0a 20 20 67 2e 70 56 66 73  rrMsg){.  g.pVfs
5f20: 2d 3e 78 44 6c 45 72 72 6f 72 28 67 2e 70 56 66  ->xDlError(g.pVf
5f30: 73 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73  s, nByte, zErrMs
5f40: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  g);.}../*.** Ret
5f50: 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
5f60: 20 74 68 65 20 73 79 6d 62 6f 6c 20 7a 53 79 6d   the symbol zSym
5f70: 62 6f 6c 20 69 6e 20 74 68 65 20 64 79 6e 61 6d  bol in the dynam
5f80: 69 63 20 6c 69 62 72 61 72 79 20 70 48 61 6e 64  ic library pHand
5f90: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
5fa0: 69 64 20 28 2a 6a 74 44 6c 53 79 6d 28 73 71 6c  id (*jtDlSym(sql
5fb0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
5fc0: 76 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63  void *p, const c
5fd0: 68 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64  har *zSym))(void
5fe0: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e 70 56  ){.  return g.pV
5ff0: 66 73 2d 3e 78 44 6c 53 79 6d 28 67 2e 70 56 66  fs->xDlSym(g.pVf
6000: 73 2c 20 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a  s, p, zSym);.}..
6010: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20  /*.** Close the 
6020: 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20  dynamic library 
6030: 68 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a  handle pHandle..
6040: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
6050: 74 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33  tDlClose(sqlite3
6060: 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64  _vfs *pVfs, void
6070: 20 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 67 2e   *pHandle){.  g.
6080: 70 56 66 73 2d 3e 78 44 6c 43 6c 6f 73 65 28 67  pVfs->xDlClose(g
6090: 2e 70 56 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b  .pVfs, pHandle);
60a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61  .}../*.** Popula
60b0: 74 65 20 74 68 65 20 62 75 66 66 65 72 20 70 6f  te the buffer po
60c0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 42 75 66  inted to by zBuf
60d0: 4f 75 74 20 77 69 74 68 20 6e 42 79 74 65 20 62  Out with nByte b
60e0: 79 74 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e 64  ytes of .** rand
60f0: 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74  om data..*/.stat
6100: 69 63 20 69 6e 74 20 6a 74 52 61 6e 64 6f 6d 6e  ic int jtRandomn
6110: 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ess(sqlite3_vfs 
6120: 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65  *pVfs, int nByte
6130: 2c 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29  , char *zBufOut)
6140: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
6150: 65 33 4f 73 52 61 6e 64 6f 6d 6e 65 73 73 28 67  e3OsRandomness(g
6160: 2e 70 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 42  .pVfs, nByte, zB
6170: 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ufOut);.}../*.**
6180: 20 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72   Sleep for nMicr
6190: 6f 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20  o microseconds. 
61a0: 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65  Return the numbe
61b0: 72 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64  r of microsecond
61c0: 73 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73  s .** actually s
61d0: 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lept..*/.static 
61e0: 69 6e 74 20 6a 74 53 6c 65 65 70 28 73 71 6c 69  int jtSleep(sqli
61f0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69  te3_vfs *pVfs, i
6200: 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 72 65  nt nMicro){.  re
6210: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 6c  turn sqlite3OsSl
6220: 65 65 70 28 67 2e 70 56 66 73 2c 20 6e 4d 69 63  eep(g.pVfs, nMic
6230: 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ro);.}../*.** Re
6240: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
6250: 20 74 69 6d 65 20 61 73 20 61 20 4a 75 6c 69 61   time as a Julia
6260: 6e 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 20  n Day number in 
6270: 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74  *pTimeOut..*/.st
6280: 61 74 69 63 20 69 6e 74 20 6a 74 43 75 72 72 65  atic int jtCurre
6290: 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76  ntTime(sqlite3_v
62a0: 66 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65  fs *pVfs, double
62b0: 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 72   *pTimeOut){.  r
62c0: 65 74 75 72 6e 20 67 2e 70 56 66 73 2d 3e 78 43  eturn g.pVfs->xC
62d0: 75 72 72 65 6e 74 54 69 6d 65 28 67 2e 70 56 66  urrentTime(g.pVf
62e0: 73 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a  s, pTimeOut);.}.
62f0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
6300: 20 63 75 72 72 65 6e 74 20 74 69 6d 65 20 61 73   current time as
6310: 20 61 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75   a Julian Day nu
6320: 6d 62 65 72 20 69 6e 20 2a 70 54 69 6d 65 4f 75  mber in *pTimeOu
6330: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
6340: 20 6a 74 43 75 72 72 65 6e 74 54 69 6d 65 49 6e   jtCurrentTimeIn
6350: 74 36 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20  t64(sqlite3_vfs 
6360: 2a 70 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69  *pVfs, sqlite3_i
6370: 6e 74 36 34 20 2a 70 54 69 6d 65 4f 75 74 29 7b  nt64 *pTimeOut){
6380: 0a 20 20 72 65 74 75 72 6e 20 67 2e 70 56 66 73  .  return g.pVfs
6390: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
63a0: 74 36 34 28 67 2e 70 56 66 73 2c 20 70 54 69 6d  t64(g.pVfs, pTim
63b0: 65 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a  eOut);.}../*****
63c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6400: 2a 2a 2a 2a 2a 0a 2a 2a 20 53 74 61 72 74 20 6f  *****.** Start o
6410: 66 20 70 75 62 6c 69 63 20 41 50 49 2e 0a 2a 2f  f public API..*/
6420: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72  ../*.** Configur
6430: 65 20 74 68 65 20 6a 74 20 56 46 53 20 61 73 20  e the jt VFS as 
6440: 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e 64  a wrapper around
6450: 20 74 68 65 20 56 46 53 20 6e 61 6d 65 64 20 62   the VFS named b
6460: 79 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20  y parameter .** 
6470: 7a 57 72 61 70 2e 20 49 66 20 74 68 65 20 69 73  zWrap. If the is
6480: 44 65 66 61 75 6c 74 20 70 61 72 61 6d 65 74 65  Default paramete
6490: 72 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  r is true, then 
64a0: 74 68 65 20 6a 74 20 56 46 53 20 69 73 20 69 6e  the jt VFS is in
64b0: 73 74 61 6c 6c 65 64 0a 2a 2a 20 61 73 20 74 68  stalled.** as th
64c0: 65 20 6e 65 77 20 64 65 66 61 75 6c 74 20 56 46  e new default VF
64d0: 53 20 66 6f 72 20 53 51 4c 69 74 65 20 63 6f 6e  S for SQLite con
64e0: 6e 65 63 74 69 6f 6e 73 2e 20 49 66 20 69 73 44  nections. If isD
64f0: 65 66 61 75 6c 74 20 69 73 20 6e 6f 74 0a 2a 2a  efault is not.**
6500: 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20   true, then the 
6510: 6a 74 20 56 46 53 20 69 73 20 69 6e 73 74 61 6c  jt VFS is instal
6520: 6c 65 64 20 61 73 20 6e 6f 6e 2d 64 65 66 61 75  led as non-defau
6530: 6c 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  lt. In this case
6540: 20 69 74 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61   it.** is availa
6550: 62 6c 65 20 76 69 61 20 69 74 73 20 6e 61 6d 65  ble via its name
6560: 2c 20 22 6a 74 22 2e 0a 2a 2f 0a 69 6e 74 20 6a  , "jt"..*/.int j
6570: 74 5f 72 65 67 69 73 74 65 72 28 63 68 61 72 20  t_register(char 
6580: 2a 7a 57 72 61 70 2c 20 69 6e 74 20 69 73 44 65  *zWrap, int isDe
6590: 66 61 75 6c 74 29 7b 0a 20 20 67 2e 70 56 66 73  fault){.  g.pVfs
65a0: 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66   = sqlite3_vfs_f
65b0: 69 6e 64 28 7a 57 72 61 70 29 3b 0a 20 20 69 66  ind(zWrap);.  if
65c0: 28 20 67 2e 70 56 66 73 3d 3d 30 20 29 7b 0a 20  ( g.pVfs==0 ){. 
65d0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
65e0: 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 6a 74  _ERROR;.  }.  jt
65f0: 5f 76 66 73 2e 73 7a 4f 73 46 69 6c 65 20 3d 20  _vfs.szOsFile = 
6600: 73 69 7a 65 6f 66 28 6a 74 5f 66 69 6c 65 29 20  sizeof(jt_file) 
6610: 2b 20 67 2e 70 56 66 73 2d 3e 73 7a 4f 73 46 69  + g.pVfs->szOsFi
6620: 6c 65 3b 0a 20 20 69 66 28 20 67 2e 70 56 66 73  le;.  if( g.pVfs
6630: 2d 3e 69 56 65 72 73 69 6f 6e 3d 3d 31 20 29 7b  ->iVersion==1 ){
6640: 0a 20 20 20 20 6a 74 5f 76 66 73 2e 69 56 65 72  .    jt_vfs.iVer
6650: 73 69 6f 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  sion = 1;.  }els
6660: 65 20 69 66 28 20 67 2e 70 56 66 73 2d 3e 78 43  e if( g.pVfs->xC
6670: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 3d  urrentTimeInt64=
6680: 3d 30 20 29 7b 0a 20 20 20 20 6a 74 5f 76 66 73  =0 ){.    jt_vfs
6690: 2e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74  .xCurrentTimeInt
66a0: 36 34 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71  64 = 0;.  }.  sq
66b0: 6c 69 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74  lite3_vfs_regist
66c0: 65 72 28 26 6a 74 5f 76 66 73 2c 20 69 73 44 65  er(&jt_vfs, isDe
66d0: 66 61 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e  fault);.  return
66e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
66f0: 2a 0a 2a 2a 20 55 6e 69 6e 73 74 61 6c 6c 20 74  *.** Uninstall t
6700: 68 65 20 6a 74 20 56 46 53 2c 20 69 66 20 69 74  he jt VFS, if it
6710: 20 69 73 20 69 6e 73 74 61 6c 6c 65 64 2e 0a 2a   is installed..*
6720: 2f 0a 76 6f 69 64 20 6a 74 5f 75 6e 72 65 67 69  /.void jt_unregi
6730: 73 74 65 72 28 76 6f 69 64 29 7b 0a 20 20 73 71  ster(void){.  sq
6740: 6c 69 74 65 33 5f 76 66 73 5f 75 6e 72 65 67 69  lite3_vfs_unregi
6750: 73 74 65 72 28 26 6a 74 5f 76 66 73 29 3b 0a 7d  ster(&jt_vfs);.}
6760: 0a 0a 23 65 6e 64 69 66 0a                       ..#endif.