/ Hex Artifact Content
Login

Artifact 619f2aa10e0d7a5f87c0f06825bc61dfce1c6b9c7f3ad990fb13de6c3b8874a3:


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 73 74 61 74 69 63 20 69 6e 74 20 6a 74 47  ;.static int jtG
1940: 65 74 4c 61 73 74 45 72 72 6f 72 28 73 71 6c 69  etLastError(sqli
1950: 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 2c 20 63  te3_vfs*, int, c
1960: 68 61 72 2a 29 3b 0a 0a 73 74 61 74 69 63 20 73  har*);..static s
1970: 71 6c 69 74 65 33 5f 76 66 73 20 6a 74 5f 76 66  qlite3_vfs jt_vf
1980: 73 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20 20  s = {.  2,      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69         /* iVersi
19b0: 6f 6e 20 2a 2f 0a 20 20 73 69 7a 65 6f 66 28 6a  on */.  sizeof(j
19c0: 74 5f 66 69 6c 65 29 2c 20 20 20 20 20 20 20 20  t_file),        
19d0: 20 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69         /* szOsFi
19e0: 6c 65 20 2a 2f 0a 20 20 4a 54 5f 4d 41 58 5f 50  le */.  JT_MAX_P
19f0: 41 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20  ATHNAME,        
1a00: 20 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68         /* mxPath
1a10: 6e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20  name */.  0,    
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 20 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78           /* pNex
1a40: 74 20 2a 2f 0a 20 20 4a 54 5f 56 46 53 5f 4e 41  t */.  JT_VFS_NA
1a50: 4d 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ME,             
1a60: 20 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a        /* zName *
1a70: 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20  /.  0,          
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a     /* pAppData *
1aa0: 2f 0a 20 20 6a 74 4f 70 65 6e 2c 20 20 20 20 20  /.  jtOpen,     
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ac0: 20 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20     /* xOpen */. 
1ad0: 20 6a 74 44 65 6c 65 74 65 2c 20 20 20 20 20 20   jtDelete,      
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 2f 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20  /* xDelete */.  
1b00: 6a 74 41 63 63 65 73 73 2c 20 20 20 20 20 20 20  jtAccess,       
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1b20: 2a 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 6a  * xAccess */.  j
1b30: 74 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20  tFullPathname,  
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1b50: 20 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a   xFullPathname *
1b60: 2f 0a 20 20 6a 74 44 6c 4f 70 65 6e 2c 20 20 20  /.  jtDlOpen,   
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f     /* xDlOpen */
1b90: 0a 20 20 6a 74 44 6c 45 72 72 6f 72 2c 20 20 20  .  jtDlError,   
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f    /* xDlError */
1bc0: 0a 20 20 6a 74 44 6c 53 79 6d 2c 20 20 20 20 20  .  jtDlSym,     
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1be0: 20 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20    /* xDlSym */. 
1bf0: 20 6a 74 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20   jtDlClose,     
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c10: 2f 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20  /* xDlClose */. 
1c20: 20 6a 74 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20   jtRandomness,  
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 2f 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a  /* xRandomness *
1c50: 2f 0a 20 20 6a 74 53 6c 65 65 70 2c 20 20 20 20  /.  jtSleep,    
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a     /* xSleep */.
1c80: 20 20 6a 74 43 75 72 72 65 6e 74 54 69 6d 65 2c    jtCurrentTime,
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65   /* xCurrentTime
1cb0: 20 2a 2f 0a 20 20 6a 74 47 65 74 4c 61 73 74 45   */.  jtGetLastE
1cc0: 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  rror,           
1cd0: 20 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74       /* xGetLast
1ce0: 45 72 72 6f 72 20 2a 2f 0a 20 20 6a 74 43 75 72  Error */.  jtCur
1cf0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 20 20  rentTimeInt64   
1d00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75            /* xCu
1d10: 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a  rrentTimeInt64 *
1d20: 2f 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c  /.};..static sql
1d30: 69 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20  ite3_io_methods 
1d40: 6a 74 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20  jt_io_methods = 
1d50: 7b 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20  {.  1,          
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a     /* iVersion *
1d80: 2f 0a 20 20 6a 74 43 6c 6f 73 65 2c 20 20 20 20  /.  jtClose,    
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 20 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a     /* xClose */.
1db0: 20 20 6a 74 52 65 61 64 2c 20 20 20 20 20 20 20    jtRead,       
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dd0: 20 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 6a   /* xRead */.  j
1de0: 74 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20  tWrite,         
1df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e00: 20 78 57 72 69 74 65 20 2a 2f 0a 20 20 6a 74 54   xWrite */.  jtT
1e10: 72 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20  runcate,        
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e30: 54 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 6a 74  Truncate */.  jt
1e40: 53 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20  Sync,           
1e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e60: 78 53 79 6e 63 20 2a 2f 0a 20 20 6a 74 46 69 6c  xSync */.  jtFil
1e70: 65 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20  eSize,          
1e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1e90: 6c 65 53 69 7a 65 20 2a 2f 0a 20 20 6a 74 4c 6f  leSize */.  jtLo
1ea0: 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ck,             
1eb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c             /* xL
1ec0: 6f 63 6b 20 2a 2f 0a 20 20 6a 74 55 6e 6c 6f 63  ock */.  jtUnloc
1ed0: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1ee0: 20 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f          /* xUnlo
1ef0: 63 6b 20 2a 2f 0a 20 20 6a 74 43 68 65 63 6b 52  ck */.  jtCheckR
1f00: 65 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20  eservedLock,    
1f10: 20 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b         /* xCheck
1f20: 52 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a  ReservedLock */.
1f30: 20 20 6a 74 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c    jtFileControl,
1f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f50: 20 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c   /* xFileControl
1f60: 20 2a 2f 0a 20 20 6a 74 53 65 63 74 6f 72 53 69   */.  jtSectorSi
1f70: 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ze,             
1f80: 20 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53       /* xSectorS
1f90: 69 7a 65 20 2a 2f 0a 20 20 6a 74 44 65 76 69 63  ize */.  jtDevic
1fa0: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fb0: 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69          /* xDevi
1fc0: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1fd0: 73 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20  s */.};..struct 
1fe0: 4a 74 47 6c 6f 62 61 6c 20 7b 0a 20 20 73 71 6c  JtGlobal {.  sql
1ff0: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20  ite3_vfs *pVfs; 
2000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2010: 61 72 65 6e 74 20 56 46 53 20 2a 2f 0a 20 20 6a  arent VFS */.  j
2020: 74 5f 66 69 6c 65 20 2a 70 4c 69 73 74 3b 20 20  t_file *pList;  
2030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2040: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65   List of all ope
2050: 6e 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b 0a 73 74  n files */.};.st
2060: 61 74 69 63 20 73 74 72 75 63 74 20 4a 74 47 6c  atic struct JtGl
2070: 6f 62 61 6c 20 67 20 3d 20 7b 30 2c 20 30 7d 3b  obal g = {0, 0};
2080: 0a 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e  ../*.** Function
2090: 73 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20  s to obtain and 
20a0: 72 65 6c 69 6e 71 75 69 73 68 20 61 20 6d 75 74  relinquish a mut
20b0: 65 78 20 74 6f 20 70 72 6f 74 65 63 74 20 67 2e  ex to protect g.
20c0: 70 4c 69 73 74 2e 20 54 68 65 0a 2a 2a 20 53 54  pList. The.** ST
20d0: 41 54 49 43 5f 50 52 4e 47 20 6d 75 74 65 78 20  ATIC_PRNG mutex 
20e0: 69 73 20 72 65 75 73 65 64 2c 20 70 75 72 65 6c  is reused, purel
20f0: 79 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f  y for the sake o
2100: 66 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2e 0a 2a  f convenience..*
2110: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e  /.static void en
2120: 74 65 72 4a 74 4d 75 74 65 78 28 76 6f 69 64 29  terJtMutex(void)
2130: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  {.  sqlite3_mute
2140: 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f  x_enter(sqlite3_
2150: 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
2160: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
2170: 50 52 4e 47 29 29 3b 0a 7d 0a 73 74 61 74 69 63  PRNG));.}.static
2180: 20 76 6f 69 64 20 6c 65 61 76 65 4a 74 4d 75 74   void leaveJtMut
2190: 65 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69  ex(void){.  sqli
21a0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
21b0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
21c0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
21d0: 5f 53 54 41 54 49 43 5f 50 52 4e 47 29 29 3b 0a  _STATIC_PRNG));.
21e0: 7d 0a 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  }..extern int sq
21f0: 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
2200: 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
2210: 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
2220: 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
2230: 76 6f 69 64 20 73 74 6f 70 5f 69 6f 65 72 72 5f  void stop_ioerr_
2240: 73 69 6d 75 6c 61 74 69 6f 6e 28 69 6e 74 20 2a  simulation(int *
2250: 70 69 53 61 76 65 2c 20 69 6e 74 20 2a 70 69 53  piSave, int *piS
2260: 61 76 65 32 29 7b 0a 20 20 2a 70 69 53 61 76 65  ave2){.  *piSave
2270: 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
2280: 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 2a  ror_pending;.  *
2290: 70 69 53 61 76 65 32 20 3d 20 73 71 6c 69 74 65  piSave2 = sqlite
22a0: 33 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a  3_io_error_hit;.
22b0: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
22c0: 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b  or_pending = -1;
22d0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
22e0: 72 6f 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a 73  ror_hit = 0;.}.s
22f0: 74 61 74 69 63 20 76 6f 69 64 20 73 74 61 72 74  tatic void start
2300: 5f 69 6f 65 72 72 5f 73 69 6d 75 6c 61 74 69 6f  _ioerr_simulatio
2310: 6e 28 69 6e 74 20 69 53 61 76 65 2c 20 69 6e 74  n(int iSave, int
2320: 20 69 53 61 76 65 32 29 7b 0a 20 20 73 71 6c 69   iSave2){.  sqli
2330: 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
2340: 64 69 6e 67 20 3d 20 69 53 61 76 65 3b 0a 20 20  ding = iSave;.  
2350: 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
2360: 5f 68 69 74 20 3d 20 69 53 61 76 65 32 3b 0a 7d  _hit = iSave2;.}
2370: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 74 5f 66  ../*.** The jt_f
2380: 69 6c 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ile pointed to b
2390: 79 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  y the argument m
23a0: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
23b0: 20 61 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 2a   a file-handle.*
23c0: 2a 20 6f 70 65 6e 20 6f 6e 20 61 20 6d 61 69 6e  * open on a main
23d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
23e0: 49 66 20 69 74 20 69 73 2c 20 61 6e 64 20 61 20  If it is, and a 
23f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2400: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 70 65 6e  urrently.** open
2410: 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2c 20  ed on the file, 
2420: 74 68 65 6e 20 64 69 73 63 61 72 64 20 61 6c 6c  then discard all
2430: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6c   transaction rel
2440: 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ated data..*/.st
2450: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 54  atic void closeT
2460: 72 61 6e 73 61 63 74 69 6f 6e 28 6a 74 5f 66 69  ransaction(jt_fi
2470: 6c 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  le *p){.  sqlite
2480: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
2490: 2d 3e 70 57 72 69 74 61 62 6c 65 29 3b 0a 20 20  ->pWritable);.  
24a0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
24b0: 61 43 6b 73 75 6d 29 3b 0a 20 20 70 2d 3e 70 57  aCksum);.  p->pW
24c0: 72 69 74 61 62 6c 65 20 3d 20 30 3b 0a 20 20 70  ritable = 0;.  p
24d0: 2d 3e 61 43 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  ->aCksum = 0;.  
24e0: 70 2d 3e 6e 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  p->nSync = 0;.}.
24f0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
2500: 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  jt-file..*/.stat
2510: 69 63 20 69 6e 74 20 6a 74 43 6c 6f 73 65 28 73  ic int jtClose(s
2520: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2530: 6c 65 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a  le){.  jt_file *
2540: 2a 70 70 3b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a  *pp;.  jt_file *
2550: 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70  p = (jt_file *)p
2560: 46 69 6c 65 3b 0a 0a 20 20 63 6c 6f 73 65 54 72  File;..  closeTr
2570: 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
2580: 65 6e 74 65 72 4a 74 4d 75 74 65 78 28 29 3b 0a  enterJtMutex();.
2590: 20 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 20 29    if( p->zName )
25a0: 7b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 67 2e  {.    for(pp=&g.
25b0: 70 4c 69 73 74 3b 20 2a 70 70 21 3d 70 3b 20 70  pList; *pp!=p; p
25c0: 70 3d 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  p=&(*pp)->pNext)
25d0: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ;.    *pp = p->p
25e0: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 6c 65 61 76  Next;.  }.  leav
25f0: 65 4a 74 4d 75 74 65 78 28 29 3b 0a 20 20 73 71  eJtMutex();.  sq
2600: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 2d 3e  lite3OsClose(p->
2610: 70 52 65 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e  pReal);.  return
2620: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2630: 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61 20 66  *.** Read data f
2640: 72 6f 6d 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a  rom an jt-file..
2650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74  */.static int jt
2660: 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65 33 5f  Read(.  sqlite3_
2670: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20  file *pFile, .  
2680: 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69  void *zBuf, .  i
2690: 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69  nt iAmt, .  sqli
26a0: 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29  te_int64 iOfst.)
26b0: 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d  {.  jt_file *p =
26c0: 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c   (jt_file *)pFil
26d0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  e;.  return sqli
26e0: 74 65 33 4f 73 52 65 61 64 28 70 2d 3e 70 52 65  te3OsRead(p->pRe
26f0: 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74 2c 20  al, zBuf, iAmt, 
2700: 69 4f 66 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  iOfst);.}../*.**
2710: 20 50 61 72 61 6d 65 74 65 72 20 7a 4a 6f 75 72   Parameter zJour
2720: 6e 61 6c 20 69 73 20 74 68 65 20 6e 61 6d 65 20  nal is the name 
2730: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  of a journal fil
2740: 65 20 74 68 61 74 20 69 73 20 63 75 72 72 65 6e  e that is curren
2750: 74 6c 79 20 0a 2a 2a 20 6f 70 65 6e 2e 20 54 68  tly .** open. Th
2760: 69 73 20 66 75 6e 63 74 69 6f 6e 20 6c 6f 63 61  is function loca
2770: 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e 73 20  tes and returns 
2780: 74 68 65 20 68 61 6e 64 6c 65 20 6f 70 65 6e 65  the handle opene
2790: 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72  d on the.** corr
27a0: 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
27b0: 73 65 20 66 69 6c 65 20 62 79 20 74 68 65 20 70  se file by the p
27c0: 61 67 65 72 20 74 68 61 74 20 63 75 72 72 65 6e  ager that curren
27d0: 74 6c 79 20 68 61 73 20 74 68 65 0a 2a 2a 20 6a  tly has the.** j
27e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e  ournal file open
27f0: 65 64 2e 20 54 68 69 73 20 66 69 6c 65 2d 68 61  ed. This file-ha
2800: 6e 64 6c 65 20 69 73 20 69 64 65 6e 74 69 66 69  ndle is identifi
2810: 65 64 20 62 79 20 74 68 65 20 0a 2a 2a 20 66 6f  ed by the .** fo
2820: 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72 74 69  llowing properti
2830: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 53  es:.**.**   a) S
2840: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f  QLITE_OPEN_MAIN_
2850: 44 42 20 77 61 73 20 73 70 65 63 69 66 69 65 64  DB was specified
2860: 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65 20 77   when the file w
2870: 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a 2a 2a  as opened..**.**
2880: 20 20 20 62 29 20 54 68 65 20 66 69 6c 65 2d 6e     b) The file-n
2890: 61 6d 65 20 73 70 65 63 69 66 69 65 64 20 77 68  ame specified wh
28a0: 65 6e 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  en the file was 
28b0: 6f 70 65 6e 65 64 20 6d 61 74 63 68 65 73 0a 2a  opened matches.*
28c0: 2a 20 20 20 20 20 20 61 6c 6c 20 62 75 74 20 74  *      all but t
28d0: 68 65 20 66 69 6e 61 6c 20 38 20 63 68 61 72 61  he final 8 chara
28e0: 63 74 65 72 73 20 6f 66 20 74 68 65 20 6a 6f 75  cters of the jou
28f0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a  rnal file name..
2900: 2a 2a 0a 2a 2a 20 20 20 63 29 20 54 68 65 72 65  **.**   c) There
2910: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 61 20   is currently a 
2920: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 6f 6e  reserved lock on
2930: 20 74 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20   the file. This 
2940: 0a 2a 2a 20 20 20 20 20 20 63 6f 6e 64 69 74 69  .**      conditi
2950: 6f 6e 20 69 73 20 77 61 69 76 65 64 20 69 66 20  on is waived if 
2960: 74 68 65 20 6e 6f 4c 6f 63 6b 20 61 72 67 75 6d  the noLock argum
2970: 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  ent is non-zero.
2980: 0a 2a 2a 2f 0a 73 74 61 74 69 63 20 6a 74 5f 66  .**/.static jt_f
2990: 69 6c 65 20 2a 6c 6f 63 61 74 65 44 61 74 61 62  ile *locateDatab
29a0: 61 73 65 48 61 6e 64 6c 65 28 63 6f 6e 73 74 20  aseHandle(const 
29b0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 2c 20  char *zJournal, 
29c0: 69 6e 74 20 6e 6f 4c 6f 63 6b 29 7b 0a 20 20 6a  int noLock){.  j
29d0: 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 20 3d 20  t_file *pMain = 
29e0: 30 3b 0a 20 20 65 6e 74 65 72 4a 74 4d 75 74 65  0;.  enterJtMute
29f0: 78 28 29 3b 0a 20 20 66 6f 72 28 70 4d 61 69 6e  x();.  for(pMain
2a00: 3d 67 2e 70 4c 69 73 74 3b 20 70 4d 61 69 6e 3b  =g.pList; pMain;
2a10: 20 70 4d 61 69 6e 3d 70 4d 61 69 6e 2d 3e 70 4e   pMain=pMain->pN
2a20: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e  ext){.    int nN
2a30: 61 6d 65 20 3d 20 28 69 6e 74 29 28 73 74 72 6c  ame = (int)(strl
2a40: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 20 2d 20 73  en(zJournal) - s
2a50: 74 72 6c 65 6e 28 22 2d 6a 6f 75 72 6e 61 6c 22  trlen("-journal"
2a60: 29 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4d 61  ));.    if( (pMa
2a70: 69 6e 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45  in->flags&SQLITE
2a80: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20  _OPEN_MAIN_DB). 
2a90: 20 20 20 20 26 26 20 28 28 69 6e 74 29 73 74 72      && ((int)str
2aa0: 6c 65 6e 28 70 4d 61 69 6e 2d 3e 7a 4e 61 6d 65  len(pMain->zName
2ab0: 29 3d 3d 6e 4e 61 6d 65 29 0a 20 20 20 20 20 26  )==nName).     &
2ac0: 26 20 30 3d 3d 6d 65 6d 63 6d 70 28 70 4d 61 69  & 0==memcmp(pMai
2ad0: 6e 2d 3e 7a 4e 61 6d 65 2c 20 7a 4a 6f 75 72 6e  n->zName, zJourn
2ae0: 61 6c 2c 20 6e 4e 61 6d 65 29 0a 20 20 20 20 20  al, nName).     
2af0: 26 26 20 28 28 70 4d 61 69 6e 2d 3e 65 4c 6f 63  && ((pMain->eLoc
2b00: 6b 3e 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 52  k>=SQLITE_LOCK_R
2b10: 45 53 45 52 56 45 44 29 20 7c 7c 20 6e 6f 4c 6f  ESERVED) || noLo
2b20: 63 6b 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ck).    ){.     
2b30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
2b40: 7d 0a 20 20 6c 65 61 76 65 4a 74 4d 75 74 65 78  }.  leaveJtMutex
2b50: 28 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4d 61  ();.  return pMa
2b60: 69 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  in;.}../*.** Par
2b70: 61 6d 65 74 65 72 20 7a 20 70 6f 69 6e 74 73 20  ameter z points 
2b80: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 34  to a buffer of 4
2b90: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 20 63   bytes in size c
2ba0: 6f 6e 74 61 69 6e 69 6e 67 20 61 20 0a 2a 2a 20  ontaining a .** 
2bb0: 75 6e 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  unsigned 32-bit 
2bc0: 69 6e 74 65 67 65 72 20 73 74 6f 72 65 64 20 69  integer stored i
2bd0: 6e 20 62 69 67 2d 65 6e 64 69 61 6e 20 66 6f 72  n big-endian for
2be0: 6d 61 74 2e 20 44 65 63 6f 64 65 20 74 68 65 20  mat. Decode the 
2bf0: 0a 2a 2a 20 69 6e 74 65 67 65 72 20 61 6e 64 20  .** integer and 
2c00: 72 65 74 75 72 6e 20 69 74 73 20 76 61 6c 75 65  return its value
2c10: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
2c20: 64 65 63 6f 64 65 55 69 6e 74 33 32 28 63 6f 6e  decodeUint32(con
2c30: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
2c40: 20 2a 7a 29 7b 0a 20 20 72 65 74 75 72 6e 20 28   *z){.  return (
2c50: 7a 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 7a 5b 31  z[0]<<24) + (z[1
2c60: 5d 3c 3c 31 36 29 20 2b 20 28 7a 5b 32 5d 3c 3c  ]<<16) + (z[2]<<
2c70: 38 29 20 2b 20 7a 5b 33 5d 3b 0a 7d 0a 0a 2f 2a  8) + z[3];.}../*
2c80: 0a 2a 2a 20 43 61 6c 63 75 6c 61 74 65 20 61 20  .** Calculate a 
2c90: 63 68 65 63 6b 73 75 6d 20 66 72 6f 6d 20 74 68  checksum from th
2ca0: 65 20 62 75 66 66 65 72 20 6f 66 20 6c 65 6e 67  e buffer of leng
2cb0: 74 68 20 6e 20 62 79 74 65 73 20 70 6f 69 6e 74  th n bytes point
2cc0: 65 64 20 74 6f 0a 2a 2a 20 62 79 20 70 61 72 61  ed to.** by para
2cd0: 6d 65 74 65 72 20 7a 2e 0a 2a 2f 0a 73 74 61 74  meter z..*/.stat
2ce0: 69 63 20 75 33 32 20 67 65 6e 43 6b 73 75 6d 28  ic u32 genCksum(
2cf0: 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63  const unsigned c
2d00: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
2d10: 20 20 69 6e 74 20 69 3b 0a 20 20 75 33 32 20 63    int i;.  u32 c
2d20: 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 66 6f 72 28  ksum = 0;.  for(
2d30: 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
2d40: 20 20 20 20 63 6b 73 75 6d 20 3d 20 63 6b 73 75      cksum = cksu
2d50: 6d 20 2b 20 7a 5b 69 5d 20 2b 20 28 63 6b 73 75  m + z[i] + (cksu
2d60: 6d 3c 3c 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  m<<3);.  }.  ret
2d70: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
2d80: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 61 72  .** The first ar
2d90: 67 75 6d 65 6e 74 2c 20 7a 42 75 66 2c 20 70 6f  gument, zBuf, po
2da0: 69 6e 74 73 20 74 6f 20 61 20 62 75 66 66 65 72  ints to a buffer
2db0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 61 20 32 38   containing a 28
2dc0: 20 62 79 74 65 0a 2a 2a 20 73 65 72 69 61 6c 69   byte.** seriali
2dd0: 7a 65 64 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  zed journal head
2de0: 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f  er. This functio
2df0: 6e 20 64 65 73 65 72 69 61 6c 69 7a 65 73 20 66  n deserializes f
2e00: 6f 75 72 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  our of the.** in
2e10: 74 65 67 65 72 20 66 69 65 6c 64 73 20 63 6f 6e  teger fields con
2e20: 74 61 69 6e 65 64 20 69 6e 20 74 68 65 20 6a 6f  tained in the jo
2e30: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 61 6e 64  urnal header and
2e40: 20 77 72 69 74 65 73 20 74 68 65 69 72 0a 2a 2a   writes their.**
2e50: 20 76 61 6c 75 65 73 20 74 6f 20 74 68 65 20 6f   values to the o
2e60: 75 74 70 75 74 20 76 61 72 69 61 62 6c 65 73 2e  utput variables.
2e70: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
2e80: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
2e90: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  the journal-head
2ea0: 65 72 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  er is successful
2eb0: 6c 79 20 0a 2a 2a 20 64 65 63 6f 64 65 64 2e 20  ly .** decoded. 
2ec0: 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
2ed0: 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74  E_ERROR..*/.stat
2ee0: 69 63 20 69 6e 74 20 64 65 63 6f 64 65 4a 6f 75  ic int decodeJou
2ef0: 72 6e 61 6c 48 64 72 28 0a 20 20 63 6f 6e 73 74  rnalHdr(.  const
2f00: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
2f10: 7a 42 75 66 2c 20 20 20 20 20 20 20 20 20 2f 2a  zBuf,         /*
2f20: 20 49 6e 70 75 74 3a 20 32 38 20 62 79 74 65 20   Input: 28 byte 
2f30: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
2f40: 2f 0a 20 20 75 33 32 20 2a 70 6e 52 65 63 2c 20  /.  u32 *pnRec, 
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f60: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 3a 20 4e         /* Out: N
2f70: 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
2f80: 6c 65 64 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20  led records */. 
2f90: 20 75 33 32 20 2a 70 6e 50 61 67 65 2c 20 20 20   u32 *pnPage,   
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 20 20 2f 2a 20 4f 75 74 3a 20 4f 72 69 67      /* Out: Orig
2fc0: 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  inal database pa
2fd0: 67 65 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 75 33  ge count */.  u3
2fe0: 32 20 2a 70 6e 53 65 63 74 6f 72 2c 20 20 20 20  2 *pnSector,    
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 20 2f 2a 20 4f 75 74 3a 20 53 65 63 74 6f 72 20   /* Out: Sector 
3010: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 2a 2f  size in bytes */
3020: 0a 20 20 75 33 32 20 2a 70 6e 50 61 67 65 73 69  .  u32 *pnPagesi
3030: 7a 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ze              
3040: 20 20 20 20 20 20 2f 2a 20 4f 75 74 3a 20 50 61        /* Out: Pa
3050: 67 65 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73  ge size in bytes
3060: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
3070: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 5d 20  d char aMagic[] 
3080: 3d 20 7b 20 30 78 64 39 2c 20 30 78 64 35 2c 20  = { 0xd9, 0xd5, 
3090: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
30a0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
30b0: 64 37 20 7d 3b 0a 20 20 69 66 28 20 6d 65 6d 63  d7 };.  if( memc
30c0: 6d 70 28 61 4d 61 67 69 63 2c 20 7a 42 75 66 2c  mp(aMagic, zBuf,
30d0: 20 38 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c   8) ) return SQL
30e0: 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 69 66 28  ITE_ERROR;.  if(
30f0: 20 70 6e 52 65 63 20 29 20 2a 70 6e 52 65 63 20   pnRec ) *pnRec 
3100: 3d 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28 26  = decodeUint32(&
3110: 7a 42 75 66 5b 38 5d 29 3b 0a 20 20 69 66 28 20  zBuf[8]);.  if( 
3120: 70 6e 50 61 67 65 20 29 20 2a 70 6e 50 61 67 65  pnPage ) *pnPage
3130: 20 3d 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28   = decodeUint32(
3140: 26 7a 42 75 66 5b 31 36 5d 29 3b 0a 20 20 69 66  &zBuf[16]);.  if
3150: 28 20 70 6e 53 65 63 74 6f 72 20 29 20 2a 70 6e  ( pnSector ) *pn
3160: 53 65 63 74 6f 72 20 3d 20 64 65 63 6f 64 65 55  Sector = decodeU
3170: 69 6e 74 33 32 28 26 7a 42 75 66 5b 32 30 5d 29  int32(&zBuf[20])
3180: 3b 0a 20 20 69 66 28 20 70 6e 50 61 67 65 73 69  ;.  if( pnPagesi
3190: 7a 65 20 29 20 2a 70 6e 50 61 67 65 73 69 7a 65  ze ) *pnPagesize
31a0: 20 3d 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28   = decodeUint32(
31b0: 26 7a 42 75 66 5b 32 34 5d 29 3b 0a 20 20 72 65  &zBuf[24]);.  re
31c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
31d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
31e0: 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
31f0: 20 77 68 65 6e 20 61 20 6e 65 77 20 74 72 61 6e   when a new tran
3200: 73 61 63 74 69 6f 6e 20 69 73 20 6f 70 65 6e 65  saction is opene
3210: 64 2c 20 6a 75 73 74 20 61 66 74 65 72 0a 2a 2a  d, just after.**
3220: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
3230: 61 6c 2d 68 65 61 64 65 72 20 69 73 20 77 72 69  al-header is wri
3240: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
3250: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  nal file..*/.sta
3260: 74 69 63 20 69 6e 74 20 6f 70 65 6e 54 72 61 6e  tic int openTran
3270: 73 61 63 74 69 6f 6e 28 6a 74 5f 66 69 6c 65 20  saction(jt_file 
3280: 2a 70 4d 61 69 6e 2c 20 6a 74 5f 66 69 6c 65 20  *pMain, jt_file 
3290: 2a 70 4a 6f 75 72 6e 61 6c 29 7b 0a 20 20 75 6e  *pJournal){.  un
32a0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 44 61  signed char *aDa
32b0: 74 61 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  ta;.  sqlite3_fi
32c0: 6c 65 20 2a 70 20 3d 20 70 4d 61 69 6e 2d 3e 70  le *p = pMain->p
32d0: 52 65 61 6c 3b 0a 20 20 69 6e 74 20 72 63 20 3d  Real;.  int rc =
32e0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 63   SQLITE_OK;..  c
32f0: 6c 6f 73 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  loseTransaction(
3300: 70 4d 61 69 6e 29 3b 0a 20 20 61 44 61 74 61 20  pMain);.  aData 
3310: 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
3320: 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a  (pMain->nPagesiz
3330: 65 29 3b 0a 20 20 70 4d 61 69 6e 2d 3e 70 57 72  e);.  pMain->pWr
3340: 69 74 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33  itable = sqlite3
3350: 42 69 74 76 65 63 43 72 65 61 74 65 28 70 4d 61  BitvecCreate(pMa
3360: 69 6e 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 70 4d  in->nPage);.  pM
3370: 61 69 6e 2d 3e 61 43 6b 73 75 6d 20 3d 20 73 71  ain->aCksum = sq
3380: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a  lite3_malloc(siz
3390: 65 6f 66 28 75 33 32 29 20 2a 20 28 70 4d 61 69  eof(u32) * (pMai
33a0: 6e 2d 3e 6e 50 61 67 65 20 2b 20 31 29 29 3b 0a  n->nPage + 1));.
33b0: 20 20 70 4a 6f 75 72 6e 61 6c 2d 3e 69 4d 61 78    pJournal->iMax
33c0: 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  Off = 0;..  if( 
33d0: 21 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c  !pMain->pWritabl
33e0: 65 20 7c 7c 20 21 70 4d 61 69 6e 2d 3e 61 43 6b  e || !pMain->aCk
33f0: 73 75 6d 20 7c 7c 20 21 61 44 61 74 61 20 29 7b  sum || !aData ){
3400: 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
3410: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
3420: 7d 65 6c 73 65 20 69 66 28 20 70 4d 61 69 6e 2d  }else if( pMain-
3430: 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  >nPage>0 ){.    
3440: 75 33 32 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20  u32 iTrunk;.    
3450: 69 6e 74 20 69 53 61 76 65 3b 0a 20 20 20 20 69  int iSave;.    i
3460: 6e 74 20 69 53 61 76 65 32 3b 0a 0a 20 20 20 20  nt iSave2;..    
3470: 73 74 6f 70 5f 69 6f 65 72 72 5f 73 69 6d 75 6c  stop_ioerr_simul
3480: 61 74 69 6f 6e 28 26 69 53 61 76 65 2c 20 26 69  ation(&iSave, &i
3490: 53 61 76 65 32 29 3b 0a 0a 20 20 20 20 2f 2a 20  Save2);..    /* 
34a0: 52 65 61 64 20 74 68 65 20 64 61 74 61 62 61 73  Read the databas
34b0: 65 20 66 72 65 65 2d 6c 69 73 74 2e 20 41 64 64  e free-list. Add
34c0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
34d0: 20 66 6f 72 20 65 61 63 68 20 66 72 65 65 2d 6c   for each free-l
34e0: 69 73 74 0a 20 20 20 20 2a 2a 20 6c 65 61 66 20  ist.    ** leaf 
34f0: 74 6f 20 74 68 65 20 6a 74 5f 66 69 6c 65 2e 70  to the jt_file.p
3500: 57 72 69 74 61 62 6c 65 20 62 69 74 76 65 63 2e  Writable bitvec.
3510: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
3520: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
3530: 2c 20 61 44 61 74 61 2c 20 70 4d 61 69 6e 2d 3e  , aData, pMain->
3540: 6e 50 61 67 65 73 69 7a 65 2c 20 30 29 3b 0a 20  nPagesize, 0);. 
3550: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
3560: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 33  E_OK ){.      u3
3570: 32 20 6e 44 62 73 69 7a 65 20 3d 20 64 65 63 6f  2 nDbsize = deco
3580: 64 65 55 69 6e 74 33 32 28 26 61 44 61 74 61 5b  deUint32(&aData[
3590: 32 38 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  28]);.      if( 
35a0: 6e 44 62 73 69 7a 65 3e 30 20 26 26 20 6d 65 6d  nDbsize>0 && mem
35b0: 63 6d 70 28 26 61 44 61 74 61 5b 32 34 5d 2c 20  cmp(&aData[24], 
35c0: 26 61 44 61 74 61 5b 39 32 5d 2c 20 34 29 3d 3d  &aData[92], 4)==
35d0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32  0 ){.        u32
35e0: 20 69 50 67 3b 0a 20 20 20 20 20 20 20 20 66 6f   iPg;.        fo
35f0: 72 28 69 50 67 3d 6e 44 62 73 69 7a 65 2b 31 3b  r(iPg=nDbsize+1;
3600: 20 69 50 67 3c 3d 70 4d 61 69 6e 2d 3e 6e 50 61   iPg<=pMain->nPa
3610: 67 65 3b 20 69 50 67 2b 2b 29 7b 0a 20 20 20 20  ge; iPg++){.    
3620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
3630: 76 65 63 53 65 74 28 70 4d 61 69 6e 2d 3e 70 57  vecSet(pMain->pW
3640: 72 69 74 61 62 6c 65 2c 20 69 50 67 29 3b 0a 20  ritable, iPg);. 
3650: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3660: 0a 20 20 20 20 7d 0a 20 20 20 20 69 54 72 75 6e  .    }.    iTrun
3670: 6b 20 3d 20 64 65 63 6f 64 65 55 69 6e 74 33 32  k = decodeUint32
3680: 28 26 61 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20  (&aData[32]);.  
3690: 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c    while( rc==SQL
36a0: 49 54 45 5f 4f 4b 20 26 26 20 69 54 72 75 6e 6b  ITE_OK && iTrunk
36b0: 3e 30 20 29 7b 0a 20 20 20 20 20 20 75 33 32 20  >0 ){.      u32 
36c0: 6e 4c 65 61 66 3b 0a 20 20 20 20 20 20 75 33 32  nLeaf;.      u32
36d0: 20 69 4c 65 61 66 3b 0a 20 20 20 20 20 20 73 71   iLeaf;.      sq
36e0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66  lite3_int64 iOff
36f0: 20 3d 20 28 69 36 34 29 28 69 54 72 75 6e 6b 2d   = (i64)(iTrunk-
3700: 31 29 2a 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73  1)*pMain->nPages
3710: 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ize;.      rc = 
3720: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 2c  sqlite3OsRead(p,
3730: 20 61 44 61 74 61 2c 20 70 4d 61 69 6e 2d 3e 6e   aData, pMain->n
3740: 50 61 67 65 73 69 7a 65 2c 20 69 4f 66 66 29 3b  Pagesize, iOff);
3750: 0a 20 20 20 20 20 20 6e 4c 65 61 66 20 3d 20 64  .      nLeaf = d
3760: 65 63 6f 64 65 55 69 6e 74 33 32 28 26 61 44 61  ecodeUint32(&aDa
3770: 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20 20 66 6f  ta[4]);.      fo
3780: 72 28 69 4c 65 61 66 3d 30 3b 20 72 63 3d 3d 53  r(iLeaf=0; rc==S
3790: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4c 65 61  QLITE_OK && iLea
37a0: 66 3c 6e 4c 65 61 66 3b 20 69 4c 65 61 66 2b 2b  f<nLeaf; iLeaf++
37b0: 29 7b 0a 20 20 20 20 20 20 20 20 75 33 32 20 70  ){.        u32 p
37c0: 67 6e 6f 20 3d 20 64 65 63 6f 64 65 55 69 6e 74  gno = decodeUint
37d0: 33 32 28 26 61 44 61 74 61 5b 38 2b 34 2a 69 4c  32(&aData[8+4*iL
37e0: 65 61 66 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  eaf]);.        s
37f0: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
3800: 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65  pMain->pWritable
3810: 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  , pgno);.      }
3820: 0a 20 20 20 20 20 20 69 54 72 75 6e 6b 20 3d 20  .      iTrunk = 
3830: 64 65 63 6f 64 65 55 69 6e 74 33 32 28 61 44 61  decodeUint32(aDa
3840: 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ta);.    }..    
3850: 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 61 6e 64  /* Calculate and
3860: 20 73 74 6f 72 65 20 61 20 63 68 65 63 6b 73 75   store a checksu
3870: 6d 20 66 6f 72 20 65 61 63 68 20 70 61 67 65 20  m for each page 
3880: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
3890: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
38a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
38b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a  {.      int ii;.
38c0: 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20        for(ii=0; 
38d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
38e0: 20 69 69 3c 28 69 6e 74 29 70 4d 61 69 6e 2d 3e   ii<(int)pMain->
38f0: 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20  nPage; ii++){.  
3900: 20 20 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d        i64 iOff =
3910: 20 28 69 36 34 29 28 70 4d 61 69 6e 2d 3e 6e 50   (i64)(pMain->nP
3920: 61 67 65 73 69 7a 65 29 20 2a 20 28 69 36 34 29  agesize) * (i64)
3930: 69 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ii;.        if( 
3940: 69 4f 66 66 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  iOff==PENDING_BY
3950: 54 45 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  TE ) continue;. 
3960: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
3970: 74 65 33 4f 73 52 65 61 64 28 70 4d 61 69 6e 2d  te3OsRead(pMain-
3980: 3e 70 52 65 61 6c 2c 20 61 44 61 74 61 2c 20 70  >pReal, aData, p
3990: 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 2c  Main->nPagesize,
39a0: 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20   iOff);.        
39b0: 70 4d 61 69 6e 2d 3e 61 43 6b 73 75 6d 5b 69 69  pMain->aCksum[ii
39c0: 5d 20 3d 20 67 65 6e 43 6b 73 75 6d 28 61 44 61  ] = genCksum(aDa
39d0: 74 61 2c 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65  ta, pMain->nPage
39e0: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 69  size);.        i
39f0: 66 28 20 69 69 2b 31 3d 3d 28 69 6e 74 29 70 4d  f( ii+1==(int)pM
3a00: 61 69 6e 2d 3e 6e 50 61 67 65 20 26 26 20 72 63  ain->nPage && rc
3a10: 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53  ==SQLITE_IOERR_S
3a20: 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20  HORT_READ ){.   
3a30: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
3a40: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 7d  TE_OK;.        }
3a50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
3a60: 20 20 20 20 73 74 61 72 74 5f 69 6f 65 72 72 5f      start_ioerr_
3a70: 73 69 6d 75 6c 61 74 69 6f 6e 28 69 53 61 76 65  simulation(iSave
3a80: 2c 20 69 53 61 76 65 32 29 3b 0a 20 20 7d 0a 0a  , iSave2);.  }..
3a90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
3aa0: 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
3ab0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  rc;.}../*.** The
3ac0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   first argument 
3ad0: 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  to this function
3ae0: 20 69 73 20 61 20 68 61 6e 64 6c 65 20 6f 70 65   is a handle ope
3af0: 6e 20 6f 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n on a journal f
3b00: 69 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ile..** This fun
3b10: 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
3b20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
3b30: 20 61 64 64 73 20 74 68 65 20 70 61 67 65 20 6e   adds the page n
3b40: 75 6d 62 65 72 20 66 6f 72 20 65 61 63 68 0a 2a  umber for each.*
3b50: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  * page in the jo
3b60: 75 72 6e 61 6c 20 74 6f 20 74 68 65 20 42 69 74  urnal to the Bit
3b70: 76 65 63 20 6f 62 6a 65 63 74 20 70 61 73 73 65  vec object passe
3b80: 64 20 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20  d as the second 
3b90: 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61  argument..*/.sta
3ba0: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
3bb0: 6e 61 6c 46 69 6c 65 28 6a 74 5f 66 69 6c 65 20  nalFile(jt_file 
3bc0: 2a 70 2c 20 6a 74 5f 66 69 6c 65 20 2a 70 4d 61  *p, jt_file *pMa
3bd0: 69 6e 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  in){.  int rc = 
3be0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 75 6e 73  SQLITE_OK;.  uns
3bf0: 69 67 6e 65 64 20 63 68 61 72 20 7a 42 75 66 5b  igned char zBuf[
3c00: 32 38 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  28];.  sqlite3_f
3c10: 69 6c 65 20 2a 70 52 65 61 6c 20 3d 20 70 2d 3e  ile *pReal = p->
3c20: 70 52 65 61 6c 3b 0a 20 20 73 71 6c 69 74 65 33  pReal;.  sqlite3
3c30: 5f 69 6e 74 36 34 20 69 4f 66 66 20 3d 20 30 3b  _int64 iOff = 0;
3c40: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
3c50: 20 69 53 69 7a 65 20 3d 20 70 2d 3e 69 4d 61 78   iSize = p->iMax
3c60: 4f 66 66 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  Off;.  unsigned 
3c70: 63 68 61 72 20 2a 61 50 61 67 65 3b 0a 20 20 69  char *aPage;.  i
3c80: 6e 74 20 69 53 61 76 65 3b 0a 20 20 69 6e 74 20  nt iSave;.  int 
3c90: 69 53 61 76 65 32 3b 0a 0a 20 20 61 50 61 67 65  iSave2;..  aPage
3ca0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
3cb0: 63 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69  c(pMain->nPagesi
3cc0: 7a 65 29 3b 0a 20 20 69 66 28 20 21 61 50 61 67  ze);.  if( !aPag
3cd0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
3ce0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
3cf0: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 74 6f 70 5f  EM;.  }..  stop_
3d00: 69 6f 65 72 72 5f 73 69 6d 75 6c 61 74 69 6f 6e  ioerr_simulation
3d10: 28 26 69 53 61 76 65 2c 20 26 69 53 61 76 65 32  (&iSave, &iSave2
3d20: 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d  );..  while( rc=
3d30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4f  =SQLITE_OK && iO
3d40: 66 66 3c 69 53 69 7a 65 20 29 7b 0a 20 20 20 20  ff<iSize ){.    
3d50: 75 33 32 20 6e 52 65 63 2c 20 6e 50 61 67 65 2c  u32 nRec, nPage,
3d60: 20 6e 53 65 63 74 6f 72 2c 20 6e 50 61 67 65 73   nSector, nPages
3d70: 69 7a 65 3b 0a 20 20 20 20 75 33 32 20 69 69 3b  ize;.    u32 ii;
3d80: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6e  ..    /* Read an
3d90: 64 20 64 65 63 6f 64 65 20 74 68 65 20 6e 65 78  d decode the nex
3da0: 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  t journal-header
3db0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
3dc0: 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 72  l file. */.    r
3dd0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
3de0: 64 28 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 32  d(pReal, zBuf, 2
3df0: 38 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 69 66  8, iOff);.    if
3e00: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
3e10: 0a 20 20 20 20 20 7c 7c 20 64 65 63 6f 64 65 4a  .     || decodeJ
3e20: 6f 75 72 6e 61 6c 48 64 72 28 7a 42 75 66 2c 20  ournalHdr(zBuf, 
3e30: 26 6e 52 65 63 2c 20 26 6e 50 61 67 65 2c 20 26  &nRec, &nPage, &
3e40: 6e 53 65 63 74 6f 72 2c 20 26 6e 50 61 67 65 73  nSector, &nPages
3e50: 69 7a 65 29 20 0a 20 20 20 20 29 7b 0a 20 20 20  ize) .    ){.   
3e60: 20 20 20 67 6f 74 6f 20 66 69 6e 69 73 68 5f 72     goto finish_r
3e70: 6a 66 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 4f  jf;.    }.    iO
3e80: 66 66 20 2b 3d 20 6e 53 65 63 74 6f 72 3b 0a 0a  ff += nSector;..
3e90: 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
3ea0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 20 74 72  ){.      /* A tr
3eb0: 69 63 6b 2e 20 54 68 65 72 65 20 6d 69 67 68 74  ick. There might
3ec0: 20 62 65 20 61 6e 6f 74 68 65 72 20 6a 6f 75 72   be another jour
3ed0: 6e 61 6c 2d 68 65 61 64 65 72 20 69 6d 6d 65 64  nal-header immed
3ee0: 69 61 74 65 6c 79 20 0a 20 20 20 20 20 20 2a 2a  iately .      **
3ef0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20   following this 
3f00: 6f 6e 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  one. In this cas
3f10: 65 2c 20 30 20 72 65 63 6f 72 64 73 20 6d 65 61  e, 0 records mea
3f20: 6e 73 20 30 20 72 65 63 6f 72 64 73 2c 20 0a 20  ns 0 records, . 
3f30: 20 20 20 20 20 2a 2a 20 6e 6f 74 20 22 72 65 61       ** not "rea
3f40: 64 20 75 6e 74 69 6c 20 74 68 65 20 65 6e 64 20  d until the end 
3f50: 6f 66 20 74 68 65 20 66 69 6c 65 22 2e 20 53 65  of the file". Se
3f60: 65 20 61 6c 73 6f 20 74 69 63 6b 65 74 20 23 32  e also ticket #2
3f70: 35 36 35 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  565..      */.  
3f80: 20 20 20 20 69 66 28 20 69 53 69 7a 65 3e 3d 28      if( iSize>=(
3f90: 69 4f 66 66 2b 6e 53 65 63 74 6f 72 29 20 29 7b  iOff+nSector) ){
3fa0: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
3fb0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 52 65 61  lite3OsRead(pRea
3fc0: 6c 2c 20 7a 42 75 66 2c 20 32 38 2c 20 69 4f 66  l, zBuf, 28, iOf
3fd0: 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
3fe0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
3ff0: 20 30 3d 3d 64 65 63 6f 64 65 4a 6f 75 72 6e 61   0==decodeJourna
4000: 6c 48 64 72 28 7a 42 75 66 2c 20 30 2c 20 30 2c  lHdr(zBuf, 0, 0,
4010: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
4020: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
4030: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4040: 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 75 33        nRec = (u3
4050: 32 29 28 28 69 53 69 7a 65 2d 69 4f 66 66 29 20  2)((iSize-iOff) 
4060: 2f 20 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73  / (pMain->nPages
4070: 69 7a 65 2b 38 29 29 3b 0a 20 20 20 20 7d 0a 0a  ize+8));.    }..
4080: 20 20 20 20 2f 2a 20 52 65 61 64 20 61 6c 6c 20      /* Read all 
4090: 74 68 65 20 72 65 63 6f 72 64 73 20 74 68 61 74  the records that
40a0: 20 66 6f 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72   follow the jour
40b0: 6e 61 6c 2d 68 65 61 64 65 72 20 6a 75 73 74 20  nal-header just 
40c0: 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72  read. */.    for
40d0: 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54  (ii=0; rc==SQLIT
40e0: 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 52 65 63 20  E_OK && ii<nRec 
40f0: 26 26 20 69 4f 66 66 3c 69 53 69 7a 65 3b 20 69  && iOff<iSize; i
4100: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 33 32 20  i++){.      u32 
4110: 70 67 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d  pgno;.      rc =
4120: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
4130: 52 65 61 6c 2c 20 7a 42 75 66 2c 20 34 2c 20 69  Real, zBuf, 4, i
4140: 4f 66 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Off);.      if( 
4150: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
4160: 0a 20 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20  .        pgno = 
4170: 64 65 63 6f 64 65 55 69 6e 74 33 32 28 7a 42 75  decodeUint32(zBu
4180: 66 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  f);.        if( 
4190: 70 67 6e 6f 3e 30 20 26 26 20 70 67 6e 6f 3c 3d  pgno>0 && pgno<=
41a0: 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 20 29 7b 0a  pMain->nPage ){.
41b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d            if( 0=
41c0: 3d 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65  =sqlite3BitvecTe
41d0: 73 74 28 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61  st(pMain->pWrita
41e0: 62 6c 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20  ble, pgno) ){.  
41f0: 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
4200: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 52 65  qlite3OsRead(pRe
4210: 61 6c 2c 20 61 50 61 67 65 2c 20 70 4d 61 69 6e  al, aPage, pMain
4220: 2d 3e 6e 50 61 67 65 73 69 7a 65 2c 20 69 4f 66  ->nPagesize, iOf
4230: 66 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  f+4);.          
4240: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
4250: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
4260: 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 20 3d       u32 cksum =
4270: 20 67 65 6e 43 6b 73 75 6d 28 61 50 61 67 65 2c   genCksum(aPage,
4280: 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a   pMain->nPagesiz
4290: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
42a0: 20 20 61 73 73 65 72 74 28 20 63 6b 73 75 6d 3d    assert( cksum=
42b0: 3d 70 4d 61 69 6e 2d 3e 61 43 6b 73 75 6d 5b 70  =pMain->aCksum[p
42c0: 67 6e 6f 2d 31 5d 20 29 3b 0a 20 20 20 20 20 20  gno-1] );.      
42d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
42e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
42f0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
4300: 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65 2c  Main->pWritable,
4310: 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20   pgno);.        
4320: 7d 0a 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b  }.        iOff +
4330: 3d 20 28 38 20 2b 20 70 4d 61 69 6e 2d 3e 6e 50  = (8 + pMain->nP
4340: 61 67 65 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  agesize);.      
4350: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 4f 66  }.    }..    iOf
4360: 66 20 3d 20 28 28 69 4f 66 66 20 2b 20 28 6e 53  f = ((iOff + (nS
4370: 65 63 74 6f 72 2d 31 29 29 20 2f 20 6e 53 65 63  ector-1)) / nSec
4380: 74 6f 72 29 20 2a 20 6e 53 65 63 74 6f 72 3b 0a  tor) * nSector;.
4390: 20 20 7d 0a 0a 66 69 6e 69 73 68 5f 72 6a 66 3a    }..finish_rjf:
43a0: 0a 20 20 73 74 61 72 74 5f 69 6f 65 72 72 5f 73  .  start_ioerr_s
43b0: 69 6d 75 6c 61 74 69 6f 6e 28 69 53 61 76 65 2c  imulation(iSave,
43c0: 20 69 53 61 76 65 32 29 3b 0a 20 20 73 71 6c 69   iSave2);.  sqli
43d0: 74 65 33 5f 66 72 65 65 28 61 50 61 67 65 29 3b  te3_free(aPage);
43e0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
43f0: 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
4400: 41 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  AD ){.    rc = S
4410: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
4420: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
4430: 0a 2a 2a 20 57 72 69 74 65 20 64 61 74 61 20 74  .** Write data t
4440: 6f 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f  o an jt-file..*/
4450: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 57 72  .static int jtWr
4460: 69 74 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 66  ite(.  sqlite3_f
4470: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63  ile *pFile, .  c
4480: 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66 2c  onst void *zBuf,
4490: 20 0a 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20   .  int iAmt, . 
44a0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f   sqlite_int64 iO
44b0: 66 73 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  fst.){.  int rc;
44c0: 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20  .  jt_file *p = 
44d0: 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  (jt_file *)pFile
44e0: 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ;.  if( p->flags
44f0: 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  &SQLITE_OPEN_MAI
4500: 4e 5f 4a 4f 55 52 4e 41 4c 20 29 7b 0a 20 20 20  N_JOURNAL ){.   
4510: 20 69 66 28 20 69 4f 66 73 74 3d 3d 30 20 29 7b   if( iOfst==0 ){
4520: 0a 20 20 20 20 20 20 6a 74 5f 66 69 6c 65 20 2a  .      jt_file *
4530: 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61  pMain = locateDa
4540: 74 61 62 61 73 65 48 61 6e 64 6c 65 28 70 2d 3e  tabaseHandle(p->
4550: 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 20  zName, 0);.     
4560: 20 61 73 73 65 72 74 28 20 70 4d 61 69 6e 20 29   assert( pMain )
4570: 3b 0a 20 20 0a 20 20 20 20 20 20 69 66 28 20 69  ;.  .      if( i
4580: 41 6d 74 3d 3d 32 38 20 29 7b 0a 20 20 20 20 20  Amt==28 ){.     
4590: 20 20 20 2f 2a 20 5a 65 72 6f 69 6e 67 20 74 68     /* Zeroing th
45a0: 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d  e first journal-
45b0: 66 69 6c 65 20 68 65 61 64 65 72 2e 20 54 68 69  file header. Thi
45c0: 73 20 69 73 20 74 68 65 20 65 6e 64 20 6f 66 20  s is the end of 
45d0: 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61  a.        ** tra
45e0: 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20  nsaction. */.   
45f0: 20 20 20 20 20 63 6c 6f 73 65 54 72 61 6e 73 61       closeTransa
4600: 63 74 69 6f 6e 28 70 4d 61 69 6e 29 3b 0a 20 20  ction(pMain);.  
4610: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 41      }else if( iA
4620: 6d 74 21 3d 31 32 20 29 7b 0a 20 20 20 20 20 20  mt!=12 ){.      
4630: 20 20 2f 2a 20 57 72 69 74 69 6e 67 20 74 68 65    /* Writing the
4640: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
4650: 65 61 64 65 72 20 74 6f 20 61 20 6a 6f 75 72 6e  eader to a journ
4660: 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 68 61  al file. This ha
4670: 70 70 65 6e 73 0a 20 20 20 20 20 20 20 20 2a 2a  ppens.        **
4680: 20 77 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74   when a transact
4690: 69 6f 6e 20 69 73 20 66 69 72 73 74 20 73 74 61  ion is first sta
46a0: 72 74 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  rted.  */.      
46b0: 20 20 75 38 20 2a 7a 20 3d 20 28 75 38 20 2a 29    u8 *z = (u8 *)
46c0: 7a 42 75 66 3b 0a 20 20 20 20 20 20 20 20 70 4d  zBuf;.        pM
46d0: 61 69 6e 2d 3e 6e 50 61 67 65 20 3d 20 64 65 63  ain->nPage = dec
46e0: 6f 64 65 55 69 6e 74 33 32 28 26 7a 5b 31 36 5d  odeUint32(&z[16]
46f0: 29 3b 0a 20 20 20 20 20 20 20 20 70 4d 61 69 6e  );.        pMain
4700: 2d 3e 6e 50 61 67 65 73 69 7a 65 20 3d 20 64 65  ->nPagesize = de
4710: 63 6f 64 65 55 69 6e 74 33 32 28 26 7a 5b 32 34  codeUint32(&z[24
4720: 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ]);.        if( 
4730: 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 3d 6f  SQLITE_OK!=(rc=o
4740: 70 65 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  penTransaction(p
4750: 4d 61 69 6e 2c 20 70 29 29 20 29 7b 0a 20 20 20  Main, p)) ){.   
4760: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
4770: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4780: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
4790: 28 20 70 2d 3e 69 4d 61 78 4f 66 66 3c 28 69 4f  ( p->iMaxOff<(iO
47a0: 66 73 74 20 2b 20 69 41 6d 74 29 20 29 7b 0a 20  fst + iAmt) ){. 
47b0: 20 20 20 20 20 70 2d 3e 69 4d 61 78 4f 66 66 20       p->iMaxOff 
47c0: 3d 20 69 4f 66 73 74 20 2b 20 69 41 6d 74 3b 0a  = iOfst + iAmt;.
47d0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
47e0: 20 70 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45   p->flags&SQLITE
47f0: 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 26 26  _OPEN_MAIN_DB &&
4800: 20 70 2d 3e 70 57 72 69 74 61 62 6c 65 20 29 7b   p->pWritable ){
4810: 0a 20 20 20 20 69 66 28 20 69 41 6d 74 3c 28 69  .    if( iAmt<(i
4820: 6e 74 29 70 2d 3e 6e 50 61 67 65 73 69 7a 65 20  nt)p->nPagesize 
4830: 0a 20 20 20 20 20 26 26 20 70 2d 3e 6e 50 61 67  .     && p->nPag
4840: 65 73 69 7a 65 25 69 41 6d 74 3d 3d 30 20 0a 20  esize%iAmt==0 . 
4850: 20 20 20 20 26 26 20 69 4f 66 73 74 3e 3d 28 50      && iOfst>=(P
4860: 45 4e 44 49 4e 47 5f 42 59 54 45 2b 35 31 32 29  ENDING_BYTE+512)
4870: 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73 74 2b   .     && iOfst+
4880: 69 41 6d 74 3c 3d 50 45 4e 44 49 4e 47 5f 42 59  iAmt<=PENDING_BY
4890: 54 45 2b 70 2d 3e 6e 50 61 67 65 73 69 7a 65 0a  TE+p->nPagesize.
48a0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20      ){.      /* 
48b0: 4e 6f 2d 6f 70 2e 20 54 68 69 73 20 73 70 65 63  No-op. This spec
48c0: 69 61 6c 20 63 61 73 65 20 69 73 20 68 69 74 20  ial case is hit 
48d0: 77 68 65 6e 20 74 68 65 20 62 61 63 6b 75 70 20  when the backup 
48e0: 63 6f 64 65 20 69 73 20 63 6f 70 79 69 6e 67 20  code is copying 
48f0: 61 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20  a.      ** to a 
4900: 64 61 74 61 62 61 73 65 20 77 69 74 68 20 61 20  database with a 
4910: 6c 61 72 67 65 72 20 70 61 67 65 2d 73 69 7a 65  larger page-size
4920: 20 74 68 61 6e 20 74 68 65 20 73 6f 75 72 63 65   than the source
4930: 20 64 61 74 61 62 61 73 65 20 61 6e 64 0a 20 20   database and.  
4940: 20 20 20 20 2a 2a 20 69 74 20 6e 65 65 64 73 20      ** it needs 
4950: 74 6f 20 66 69 6c 6c 20 69 6e 20 74 68 65 20 6e  to fill in the n
4960: 6f 6e 2d 6c 6f 63 6b 69 6e 67 2d 72 65 67 69 6f  on-locking-regio
4970: 6e 20 70 61 72 74 20 6f 66 20 74 68 65 20 6f 72  n part of the or
4980: 69 67 69 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20  iginal.      ** 
4990: 70 65 6e 64 69 6e 67 2d 62 79 74 65 20 70 61 67  pending-byte pag
49a0: 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
49b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 33 32  }else{.      u32
49c0: 20 70 67 6e 6f 20 3d 20 28 75 33 32 29 28 69 4f   pgno = (u32)(iO
49d0: 66 73 74 2f 70 2d 3e 6e 50 61 67 65 73 69 7a 65  fst/p->nPagesize
49e0: 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73   + 1);.      ass
49f0: 65 72 74 28 20 28 69 41 6d 74 3d 3d 31 7c 7c 69  ert( (iAmt==1||i
4a00: 41 6d 74 3d 3d 28 69 6e 74 29 70 2d 3e 6e 50 61  Amt==(int)p->nPa
4a10: 67 65 73 69 7a 65 29 20 26 26 0a 20 20 20 20 20  gesize) &&.     
4a20: 20 20 20 20 20 20 20 20 20 28 28 69 4f 66 73 74           ((iOfst
4a30: 2b 69 41 6d 74 29 25 70 2d 3e 6e 50 61 67 65 73  +iAmt)%p->nPages
4a40: 69 7a 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ize)==0 );.     
4a50: 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e   /* The followin
4a60: 67 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65  g assert() state
4a70: 6d 65 6e 74 73 20 6d 61 79 20 66 61 69 6c 20 69  ments may fail i
4a80: 66 20 74 68 69 73 20 6c 61 79 65 72 20 69 73 20  f this layer is 
4a90: 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 77 69  used.      ** wi
4aa0: 74 68 20 61 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  th a connection 
4ab0: 69 6e 20 22 50 52 41 47 4d 41 20 73 79 6e 63 68  in "PRAGMA synch
4ac0: 72 6f 6e 6f 75 73 3d 6f 66 66 22 20 6d 6f 64 65  ronous=off" mode
4ad0: 2e 20 49 66 20 74 68 65 79 0a 20 20 20 20 20 20  . If they.      
4ae0: 2a 2a 20 66 61 69 6c 20 77 69 74 68 20 73 79 6e  ** fail with syn
4af0: 63 3d 6e 6f 72 6d 61 6c 20 6f 72 20 73 79 6e 63  c=normal or sync
4b00: 3d 66 75 6c 6c 2c 20 74 68 69 73 20 6d 61 79 20  =full, this may 
4b10: 69 6e 64 69 63 61 74 65 20 70 72 6f 62 6c 65 6d  indicate problem
4b20: 2e 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65  .  */.      asse
4b30: 72 74 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 50 61  rt( pgno<=p->nPa
4b40: 67 65 20 7c 7c 20 70 2d 3e 6e 53 79 6e 63 3e 30  ge || p->nSync>0
4b50: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
4b60: 28 20 70 67 6e 6f 3e 70 2d 3e 6e 50 61 67 65 20  ( pgno>p->nPage 
4b70: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
4b80: 54 65 73 74 28 70 2d 3e 70 57 72 69 74 61 62 6c  Test(p->pWritabl
4b90: 65 2c 20 70 67 6e 6f 29 20 29 3b 0a 20 20 20 20  e, pgno) );.    
4ba0: 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  }.  }..  rc = sq
4bb0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 2d 3e  lite3OsWrite(p->
4bc0: 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d  pReal, zBuf, iAm
4bd0: 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 69 66 28  t, iOfst);.  if(
4be0: 20 28 70 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   (p->flags&SQLIT
4bf0: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
4c00: 4e 41 4c 29 20 26 26 20 69 41 6d 74 3d 3d 31 32  NAL) && iAmt==12
4c10: 20 29 7b 0a 20 20 20 20 6a 74 5f 66 69 6c 65 20   ){.    jt_file 
4c20: 2a 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65 44  *pMain = locateD
4c30: 61 74 61 62 61 73 65 48 61 6e 64 6c 65 28 70 2d  atabaseHandle(p-
4c40: 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20  >zName, 0);.    
4c50: 69 6e 74 20 72 63 32 20 3d 20 72 65 61 64 4a 6f  int rc2 = readJo
4c60: 75 72 6e 61 6c 46 69 6c 65 28 70 2c 20 70 4d 61  urnalFile(p, pMa
4c70: 69 6e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  in);.    if( rc=
4c80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20  =SQLITE_OK ) rc 
4c90: 3d 20 72 63 32 3b 0a 20 20 7d 0a 20 20 72 65 74  = rc2;.  }.  ret
4ca0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4cb0: 20 54 72 75 6e 63 61 74 65 20 61 6e 20 6a 74 2d   Truncate an jt-
4cc0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
4cd0: 69 6e 74 20 6a 74 54 72 75 6e 63 61 74 65 28 73  int jtTruncate(s
4ce0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
4cf0: 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  le, sqlite_int64
4d00: 20 73 69 7a 65 29 7b 0a 20 20 6a 74 5f 66 69 6c   size){.  jt_fil
4d10: 65 20 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20  e *p = (jt_file 
4d20: 2a 29 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70  *)pFile;.  if( p
4d30: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  ->flags&SQLITE_O
4d40: 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
4d50: 20 26 26 20 73 69 7a 65 3d 3d 30 20 29 7b 0a 20   && size==0 ){. 
4d60: 20 20 20 2f 2a 20 54 72 75 6e 63 61 74 69 6e 67     /* Truncating
4d70: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
4d80: 20 54 68 69 73 20 69 73 20 74 68 65 20 65 6e 64   This is the end
4d90: 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   of a transactio
4da0: 6e 2e 20 2a 2f 0a 20 20 20 20 6a 74 5f 66 69 6c  n. */.    jt_fil
4db0: 65 20 2a 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74  e *pMain = locat
4dc0: 65 44 61 74 61 62 61 73 65 48 61 6e 64 6c 65 28  eDatabaseHandle(
4dd0: 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 20 20  p->zName, 0);.  
4de0: 20 20 63 6c 6f 73 65 54 72 61 6e 73 61 63 74 69    closeTransacti
4df0: 6f 6e 28 70 4d 61 69 6e 29 3b 0a 20 20 7d 0a 20  on(pMain);.  }. 
4e00: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 53 51   if( p->flags&SQ
4e10: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 44  LITE_OPEN_MAIN_D
4e20: 42 20 26 26 20 70 2d 3e 70 57 72 69 74 61 62 6c  B && p->pWritabl
4e30: 65 20 29 7b 0a 20 20 20 20 75 33 32 20 70 67 6e  e ){.    u32 pgn
4e40: 6f 3b 0a 20 20 20 20 75 33 32 20 6c 6f 63 6b 69  o;.    u32 locki
4e50: 6e 67 5f 70 61 67 65 20 3d 20 28 75 33 32 29 28  ng_page = (u32)(
4e60: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 2d 3e  PENDING_BYTE/p->
4e70: 6e 50 61 67 65 73 69 7a 65 2b 31 29 3b 0a 20 20  nPagesize+1);.  
4e80: 20 20 66 6f 72 28 70 67 6e 6f 3d 28 75 33 32 29    for(pgno=(u32)
4e90: 28 73 69 7a 65 2f 70 2d 3e 6e 50 61 67 65 73 69  (size/p->nPagesi
4ea0: 7a 65 2b 31 29 3b 20 70 67 6e 6f 3c 3d 70 2d 3e  ze+1); pgno<=p->
4eb0: 6e 50 61 67 65 3b 20 70 67 6e 6f 2b 2b 29 7b 0a  nPage; pgno++){.
4ec0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 67        assert( pg
4ed0: 6e 6f 3d 3d 6c 6f 63 6b 69 6e 67 5f 70 61 67 65  no==locking_page
4ee0: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
4ef0: 63 54 65 73 74 28 70 2d 3e 70 57 72 69 74 61 62  cTest(p->pWritab
4f00: 6c 65 2c 20 70 67 6e 6f 29 20 29 3b 0a 20 20 20  le, pgno) );.   
4f10: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4f20: 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74  sqlite3OsTruncat
4f30: 65 28 70 2d 3e 70 52 65 61 6c 2c 20 73 69 7a 65  e(p->pReal, size
4f40: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  );.}../*.** Sync
4f50: 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a   an jt-file..*/.
4f60: 73 74 61 74 69 63 20 69 6e 74 20 6a 74 53 79 6e  static int jtSyn
4f70: 63 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  c(sqlite3_file *
4f80: 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73  pFile, int flags
4f90: 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20  ){.  jt_file *p 
4fa0: 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69  = (jt_file *)pFi
4fb0: 6c 65 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c  le;..  if( p->fl
4fc0: 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
4fd0: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 7b 0a  MAIN_JOURNAL ){.
4fe0: 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
4ff0: 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 3b 20  jt_file *pMain; 
5000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5010: 20 20 2f 2a 20 54 68 65 20 61 73 73 6f 63 69 61    /* The associa
5020: 74 65 64 20 64 61 74 61 62 61 73 65 20 66 69 6c  ted database fil
5030: 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65  e */..    /* The
5040: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
5050: 20 62 65 69 6e 67 20 73 79 6e 63 65 64 2e 20 41   being synced. A
5060: 74 20 74 68 69 73 20 70 6f 69 6e 74 2c 20 77 65  t this point, we
5070: 20 69 6e 73 70 65 63 74 20 74 68 65 20 0a 20 20   inspect the .  
5080: 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66    ** contents of
5090: 20 74 68 65 20 66 69 6c 65 20 75 70 20 74 6f 20   the file up to 
50a0: 74 68 69 73 20 70 6f 69 6e 74 20 61 6e 64 20 73  this point and s
50b0: 65 74 20 65 61 63 68 20 62 69 74 20 69 6e 20 74  et each bit in t
50c0: 68 65 20 0a 20 20 20 20 2a 2a 20 6a 74 5f 66 69  he .    ** jt_fi
50d0: 6c 65 2e 70 57 72 69 74 61 62 6c 65 20 62 69 74  le.pWritable bit
50e0: 76 65 63 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  vec of the main 
50f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 73  database file as
5100: 73 6f 63 69 61 74 65 64 20 77 69 74 68 0a 20 20  sociated with.  
5110: 20 20 2a 2a 20 74 68 69 73 20 6a 6f 75 72 6e 61    ** this journa
5120: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  l file..    */. 
5130: 20 20 20 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74     pMain = locat
5140: 65 44 61 74 61 62 61 73 65 48 61 6e 64 6c 65 28  eDatabaseHandle(
5150: 70 2d 3e 7a 4e 61 6d 65 2c 20 30 29 3b 0a 0a 20  p->zName, 0);.. 
5160: 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 62 69     /* Set the bi
5170: 74 76 65 63 20 76 61 6c 75 65 73 20 2a 2f 0a 20  tvec values */. 
5180: 20 20 20 69 66 28 20 70 4d 61 69 6e 20 26 26 20     if( pMain && 
5190: 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65  pMain->pWritable
51a0: 20 29 7b 0a 20 20 20 20 20 20 70 4d 61 69 6e 2d   ){.      pMain-
51b0: 3e 6e 53 79 6e 63 2b 2b 3b 0a 20 20 20 20 20 20  >nSync++;.      
51c0: 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
51d0: 46 69 6c 65 28 70 2c 20 70 4d 61 69 6e 29 3b 0a  File(p, pMain);.
51e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
51f0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
5200: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
5210: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
5220: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5230: 33 4f 73 53 79 6e 63 28 70 2d 3e 70 52 65 61 6c  3OsSync(p->pReal
5240: 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a 2f 2a 0a  , flags);.}../*.
5250: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  ** Return the cu
5260: 72 72 65 6e 74 20 66 69 6c 65 2d 73 69 7a 65 20  rrent file-size 
5270: 6f 66 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a  of an jt-file..*
5280: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 46  /.static int jtF
5290: 69 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  ileSize(sqlite3_
52a0: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c  file *pFile, sql
52b0: 69 74 65 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65  ite_int64 *pSize
52c0: 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20  ){.  jt_file *p 
52d0: 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69  = (jt_file *)pFi
52e0: 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  le;.  return sql
52f0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
5300: 2d 3e 70 52 65 61 6c 2c 20 70 53 69 7a 65 29 3b  ->pReal, pSize);
5310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 6b 20 61  .}../*.** Lock a
5320: 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  n jt-file..*/.st
5330: 61 74 69 63 20 69 6e 74 20 6a 74 4c 6f 63 6b 28  atic int jtLock(
5340: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
5350: 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ile, int eLock){
5360: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6a 74 5f  .  int rc;.  jt_
5370: 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f 66 69  file *p = (jt_fi
5380: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 63  le *)pFile;.  rc
5390: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
53a0: 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f 63 6b  (p->pReal, eLock
53b0: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
53c0: 49 54 45 5f 4f 4b 20 26 26 20 65 4c 6f 63 6b 3e  ITE_OK && eLock>
53d0: 70 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20 20 20  p->eLock ){.    
53e0: 70 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b  p->eLock = eLock
53f0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5400: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f  c;.}../*.** Unlo
5410: 63 6b 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a  ck an jt-file..*
5420: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 55  /.static int jtU
5430: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
5440: 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65  le *pFile, int e
5450: 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Lock){.  int rc;
5460: 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20  .  jt_file *p = 
5470: 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  (jt_file *)pFile
5480: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
5490: 4f 73 55 6e 6c 6f 63 6b 28 70 2d 3e 70 52 65 61  OsUnlock(p->pRea
54a0: 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 69 66 28  l, eLock);.  if(
54b0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
54c0: 26 20 65 4c 6f 63 6b 3c 70 2d 3e 65 4c 6f 63 6b  & eLock<p->eLock
54d0: 20 29 7b 0a 20 20 20 20 70 2d 3e 65 4c 6f 63 6b   ){.    p->eLock
54e0: 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20   = eLock;.  }.  
54f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5500: 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 61 6e 6f  .** Check if ano
5510: 74 68 65 72 20 66 69 6c 65 2d 68 61 6e 64 6c 65  ther file-handle
5520: 20 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45   holds a RESERVE
5530: 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20 6a 74 2d  D lock on an jt-
5540: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
5550: 69 6e 74 20 6a 74 43 68 65 63 6b 52 65 73 65 72  int jtCheckReser
5560: 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  vedLock(sqlite3_
5570: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
5580: 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20 20 6a 74   *pResOut){.  jt
5590: 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f 66  _file *p = (jt_f
55a0: 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72  ile *)pFile;.  r
55b0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 43  eturn sqlite3OsC
55c0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
55d0: 28 70 2d 3e 70 52 65 61 6c 2c 20 70 52 65 73 4f  (p->pReal, pResO
55e0: 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  ut);.}../*.** Fi
55f0: 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le control metho
5600: 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d 20 6f 70  d. For custom op
5610: 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61 6e 20 6a  erations on an j
5620: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
5630: 63 20 69 6e 74 20 6a 74 46 69 6c 65 43 6f 6e 74  c int jtFileCont
5640: 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  rol(sqlite3_file
5650: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 6f 70 2c   *pFile, int op,
5660: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
5670: 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74  jt_file *p = (jt
5680: 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
5690: 20 72 65 74 75 72 6e 20 70 2d 3e 70 52 65 61 6c   return p->pReal
56a0: 2d 3e 70 4d 65 74 68 6f 64 73 2d 3e 78 46 69 6c  ->pMethods->xFil
56b0: 65 43 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61  eControl(p->pRea
56c0: 6c 2c 20 6f 70 2c 20 70 41 72 67 29 3b 0a 7d 0a  l, op, pArg);.}.
56d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
56e0: 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e  e sector-size in
56f0: 20 62 79 74 65 73 20 66 6f 72 20 61 6e 20 6a 74   bytes for an jt
5700: 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  -file..*/.static
5710: 20 69 6e 74 20 6a 74 53 65 63 74 6f 72 53 69 7a   int jtSectorSiz
5720: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
5730: 70 46 69 6c 65 29 7b 0a 20 20 6a 74 5f 66 69 6c  pFile){.  jt_fil
5740: 65 20 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20  e *p = (jt_file 
5750: 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  *)pFile;.  retur
5760: 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  n sqlite3OsSecto
5770: 72 53 69 7a 65 28 70 2d 3e 70 52 65 61 6c 29 3b  rSize(p->pReal);
5780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5790: 20 74 68 65 20 64 65 76 69 63 65 20 63 68 61 72   the device char
57a0: 61 63 74 65 72 69 73 74 69 63 20 66 6c 61 67 73  acteristic flags
57b0: 20 73 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e   supported by an
57c0: 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61   jt-file..*/.sta
57d0: 74 69 63 20 69 6e 74 20 6a 74 44 65 76 69 63 65  tic int jtDevice
57e0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
57f0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
5800: 69 6c 65 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20  ile){.  jt_file 
5810: 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29  *p = (jt_file *)
5820: 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
5830: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
5840: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
5850: 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  ->pReal);.}../*.
5860: 2a 2a 20 4f 70 65 6e 20 61 6e 20 6a 74 20 66 69  ** Open an jt fi
5870: 6c 65 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74  le handle..*/.st
5880: 61 74 69 63 20 69 6e 74 20 6a 74 4f 70 65 6e 28  atic int jtOpen(
5890: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
58a0: 70 56 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68  pVfs,.  const ch
58b0: 61 72 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c  ar *zName,.  sql
58c0: 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65  ite3_file *pFile
58d0: 2c 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20  ,.  int flags,. 
58e0: 20 69 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a   int *pOutFlags.
58f0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6a  ){.  int rc;.  j
5900: 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f  t_file *p = (jt_
5910: 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
5920: 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20  pFile->pMethods 
5930: 3d 20 30 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 20  = 0;.  p->pReal 
5940: 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
5950: 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 52  *)&p[1];.  p->pR
5960: 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20  eal->pMethods = 
5970: 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  0;.  rc = sqlite
5980: 33 4f 73 4f 70 65 6e 28 67 2e 70 56 66 73 2c 20  3OsOpen(g.pVfs, 
5990: 7a 4e 61 6d 65 2c 20 70 2d 3e 70 52 65 61 6c 2c  zName, p->pReal,
59a0: 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67   flags, pOutFlag
59b0: 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  s);.  assert( rc
59c0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70  ==SQLITE_OK || p
59d0: 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64  ->pReal->pMethod
59e0: 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 72 63  s==0 );.  if( rc
59f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5a00: 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f     pFile->pMetho
5a10: 64 73 20 3d 20 26 6a 74 5f 69 6f 5f 6d 65 74 68  ds = &jt_io_meth
5a20: 6f 64 73 3b 0a 20 20 20 20 70 2d 3e 65 4c 6f 63  ods;.    p->eLoc
5a30: 6b 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 7a 4e  k = 0;.    p->zN
5a40: 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20  ame = zName;.   
5a50: 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67   p->flags = flag
5a60: 73 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  s;.    p->pNext 
5a70: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 72 69  = 0;.    p->pWri
5a80: 74 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70  table = 0;.    p
5a90: 2d 3e 61 43 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  ->aCksum = 0;.  
5aa0: 20 20 65 6e 74 65 72 4a 74 4d 75 74 65 78 28 29    enterJtMutex()
5ab0: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20  ;.    if( zName 
5ac0: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78  ){.      p->pNex
5ad0: 74 20 3d 20 67 2e 70 4c 69 73 74 3b 0a 20 20 20  t = g.pList;.   
5ae0: 20 20 20 67 2e 70 4c 69 73 74 20 3d 20 70 3b 0a     g.pList = p;.
5af0: 20 20 20 20 7d 0a 20 20 20 20 6c 65 61 76 65 4a      }.    leaveJ
5b00: 74 4d 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20  tMutex();.  }.  
5b10: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5b20: 0a 2a 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66  .** Delete the f
5b30: 69 6c 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a  ile located at z
5b40: 50 61 74 68 2e 20 49 66 20 74 68 65 20 64 69 72  Path. If the dir
5b50: 53 79 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73  Sync argument is
5b60: 20 74 72 75 65 2c 0a 2a 2a 20 65 6e 73 75 72 65   true,.** ensure
5b70: 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
5b80: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 61   modifications a
5b90: 72 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  re synced to dis
5ba0: 6b 20 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75  k before.** retu
5bb0: 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
5bc0: 20 69 6e 74 20 6a 74 44 65 6c 65 74 65 28 73 71   int jtDelete(sq
5bd0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
5be0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
5bf0: 74 68 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29  th, int dirSync)
5c00: 7b 0a 20 20 69 6e 74 20 6e 50 61 74 68 20 3d 20  {.  int nPath = 
5c10: 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 50 61 74  (int)strlen(zPat
5c20: 68 29 3b 0a 20 20 69 66 28 20 6e 50 61 74 68 3e  h);.  if( nPath>
5c30: 38 20 26 26 20 30 3d 3d 73 74 72 63 6d 70 28 22  8 && 0==strcmp("
5c40: 2d 6a 6f 75 72 6e 61 6c 22 2c 20 26 7a 50 61 74  -journal", &zPat
5c50: 68 5b 6e 50 61 74 68 2d 38 5d 29 20 29 7b 0a 20  h[nPath-8]) ){. 
5c60: 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 61     /* Deleting a
5c70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
5c80: 68 65 20 65 6e 64 20 6f 66 20 61 20 74 72 61 6e  he end of a tran
5c90: 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  saction. */.    
5ca0: 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 20 3d  jt_file *pMain =
5cb0: 20 6c 6f 63 61 74 65 44 61 74 61 62 61 73 65 48   locateDatabaseH
5cc0: 61 6e 64 6c 65 28 7a 50 61 74 68 2c 20 30 29 3b  andle(zPath, 0);
5cd0: 0a 20 20 20 20 69 66 28 20 70 4d 61 69 6e 20 29  .    if( pMain )
5ce0: 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 54 72 61  {.      closeTra
5cf0: 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e 29 3b  nsaction(pMain);
5d00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
5d10: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 44 65  turn sqlite3OsDe
5d20: 6c 65 74 65 28 67 2e 70 56 66 73 2c 20 7a 50 61  lete(g.pVfs, zPa
5d30: 74 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a 7d 0a  th, dirSync);.}.
5d40: 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20  ./*.** Test for 
5d50: 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
5d60: 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20  ns. Return true 
5d70: 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64  if the requested
5d80: 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69   permission.** i
5d90: 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20  s available, or 
5da0: 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e  false otherwise.
5db0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
5dc0: 74 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74  tAccess(.  sqlit
5dd0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20  e3_vfs *pVfs, . 
5de0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
5df0: 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67 73  th, .  int flags
5e00: 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75  , .  int *pResOu
5e10: 74 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71  t.){.  return sq
5e20: 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 67 2e  lite3OsAccess(g.
5e30: 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 66 6c 61  pVfs, zPath, fla
5e40: 67 73 2c 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a  gs, pResOut);.}.
5e50: 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  ./*.** Populate 
5e60: 62 75 66 66 65 72 20 7a 4f 75 74 20 77 69 74 68  buffer zOut with
5e70: 20 74 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e 69   the full canoni
5e80: 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f 72  cal pathname cor
5e90: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f  responding.** to
5ea0: 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 69 6e   the pathname in
5eb0: 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20 69 73 20   zPath. zOut is 
5ec0: 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f  guaranteed to po
5ed0: 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a  int to a buffer.
5ee0: 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28  ** of at least (
5ef0: 4a 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b  JT_MAX_PATHNAME+
5f00: 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61  1) bytes..*/.sta
5f10: 74 69 63 20 69 6e 74 20 6a 74 46 75 6c 6c 50 61  tic int jtFullPa
5f20: 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  thname(.  sqlite
5f30: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20  3_vfs *pVfs, .  
5f40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
5f50: 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20  h, .  int nOut, 
5f60: 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b  .  char *zOut.){
5f70: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5f80: 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28  3OsFullPathname(
5f90: 67 2e 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 6e  g.pVfs, zPath, n
5fa0: 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f  Out, zOut);.}../
5fb0: 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 79  *.** Open the dy
5fc0: 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 6c 6f  namic library lo
5fd0: 63 61 74 65 64 20 61 74 20 7a 50 61 74 68 20 61  cated at zPath a
5fe0: 6e 64 20 72 65 74 75 72 6e 20 61 20 68 61 6e 64  nd return a hand
5ff0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
6000: 69 64 20 2a 6a 74 44 6c 4f 70 65 6e 28 73 71 6c  id *jtDlOpen(sql
6010: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
6020: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
6030: 68 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e 70  h){.  return g.p
6040: 56 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 67 2e 70  Vfs->xDlOpen(g.p
6050: 56 66 73 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a  Vfs, zPath);.}..
6060: 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74  /*.** Populate t
6070: 68 65 20 62 75 66 66 65 72 20 7a 45 72 72 4d 73  he buffer zErrMs
6080: 67 20 28 73 69 7a 65 20 6e 42 79 74 65 20 62 79  g (size nByte by
6090: 74 65 73 29 20 77 69 74 68 20 61 20 68 75 6d 61  tes) with a huma
60a0: 6e 20 72 65 61 64 61 62 6c 65 0a 2a 2a 20 75 74  n readable.** ut
60b0: 66 2d 38 20 73 74 72 69 6e 67 20 64 65 73 63 72  f-8 string descr
60c0: 69 62 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 72  ibing the most r
60d0: 65 63 65 6e 74 20 65 72 72 6f 72 20 65 6e 63 6f  ecent error enco
60e0: 75 6e 74 65 72 65 64 20 61 73 73 6f 63 69 61 74  untered associat
60f0: 65 64 20 0a 2a 2a 20 77 69 74 68 20 64 79 6e 61  ed .** with dyna
6100: 6d 69 63 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a  mic libraries..*
6110: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 74  /.static void jt
6120: 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f  DlError(sqlite3_
6130: 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
6140: 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72  Byte, char *zErr
6150: 4d 73 67 29 7b 0a 20 20 67 2e 70 56 66 73 2d 3e  Msg){.  g.pVfs->
6160: 78 44 6c 45 72 72 6f 72 28 67 2e 70 56 66 73 2c  xDlError(g.pVfs,
6170: 20 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73 67 29   nByte, zErrMsg)
6180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
6190: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
61a0: 68 65 20 73 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f  he symbol zSymbo
61b0: 6c 20 69 6e 20 74 68 65 20 64 79 6e 61 6d 69 63  l in the dynamic
61c0: 20 6c 69 62 72 61 72 79 20 70 48 61 6e 64 6c 65   library pHandle
61d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
61e0: 20 28 2a 6a 74 44 6c 53 79 6d 28 73 71 6c 69 74   (*jtDlSym(sqlit
61f0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f  e3_vfs *pVfs, vo
6200: 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61  id *p, const cha
6210: 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b  r *zSym))(void){
6220: 0a 20 20 72 65 74 75 72 6e 20 67 2e 70 56 66 73  .  return g.pVfs
6230: 2d 3e 78 44 6c 53 79 6d 28 67 2e 70 56 66 73 2c  ->xDlSym(g.pVfs,
6240: 20 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a   p, zSym);.}../*
6250: 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 79  .** Close the dy
6260: 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 68 61  namic library ha
6270: 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f  ndle pHandle..*/
6280: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 74 44  .static void jtD
6290: 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
62a0: 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a  fs *pVfs, void *
62b0: 70 48 61 6e 64 6c 65 29 7b 0a 20 20 67 2e 70 56  pHandle){.  g.pV
62c0: 66 73 2d 3e 78 44 6c 43 6c 6f 73 65 28 67 2e 70  fs->xDlClose(g.p
62d0: 56 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d  Vfs, pHandle);.}
62e0: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
62f0: 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e   the buffer poin
6300: 74 65 64 20 74 6f 20 62 79 20 7a 42 75 66 4f 75  ted to by zBufOu
6310: 74 20 77 69 74 68 20 6e 42 79 74 65 20 62 79 74  t with nByte byt
6320: 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d  es of .** random
6330: 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63   data..*/.static
6340: 20 69 6e 74 20 6a 74 52 61 6e 64 6f 6d 6e 65 73   int jtRandomnes
6350: 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  s(sqlite3_vfs *p
6360: 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20  Vfs, int nByte, 
6370: 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a  char *zBufOut){.
6380: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6390: 4f 73 52 61 6e 64 6f 6d 6e 65 73 73 28 67 2e 70  OsRandomness(g.p
63a0: 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66  Vfs, nByte, zBuf
63b0: 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Out);.}../*.** S
63c0: 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72 6f 20  leep for nMicro 
63d0: 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 52 65  microseconds. Re
63e0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
63f0: 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20  of microseconds 
6400: 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73 6c 65  .** actually sle
6410: 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pt..*/.static in
6420: 74 20 6a 74 53 6c 65 65 70 28 73 71 6c 69 74 65  t jtSleep(sqlite
6430: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74  3_vfs *pVfs, int
6440: 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 72 65 74 75   nMicro){.  retu
6450: 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65  rn sqlite3OsSlee
6460: 70 28 67 2e 70 56 66 73 2c 20 6e 4d 69 63 72 6f  p(g.pVfs, nMicro
6470: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
6480: 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  rn the current t
6490: 69 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20  ime as a Julian 
64a0: 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70  Day number in *p
64b0: 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74  TimeOut..*/.stat
64c0: 69 63 20 69 6e 74 20 6a 74 43 75 72 72 65 6e 74  ic int jtCurrent
64d0: 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  Time(sqlite3_vfs
64e0: 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a   *pVfs, double *
64f0: 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 72 65 74  pTimeOut){.  ret
6500: 75 72 6e 20 67 2e 70 56 66 73 2d 3e 78 43 75 72  urn g.pVfs->xCur
6510: 72 65 6e 74 54 69 6d 65 28 67 2e 70 56 66 73 2c  rentTime(g.pVfs,
6520: 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 2f 2a   pTimeOut);.}./*
6530: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
6540: 75 72 72 65 6e 74 20 74 69 6d 65 20 61 73 20 61  urrent time as a
6550: 20 4a 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62   Julian Day numb
6560: 65 72 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e  er in *pTimeOut.
6570: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
6580: 74 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  tCurrentTimeInt6
6590: 34 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  4(sqlite3_vfs *p
65a0: 56 66 73 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  Vfs, sqlite3_int
65b0: 36 34 20 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20  64 *pTimeOut){. 
65c0: 20 72 65 74 75 72 6e 20 67 2e 70 56 66 73 2d 3e   return g.pVfs->
65d0: 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
65e0: 34 28 67 2e 70 56 66 73 2c 20 70 54 69 6d 65 4f  4(g.pVfs, pTimeO
65f0: 75 74 29 3b 0a 7d 0a 0a 73 74 61 74 69 63 20 69  ut);.}..static i
6600: 6e 74 20 6a 74 47 65 74 4c 61 73 74 45 72 72 6f  nt jtGetLastErro
6610: 72 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70  r(sqlite3_vfs *p
6620: 56 66 73 2c 20 69 6e 74 20 6e 2c 20 63 68 61 72  Vfs, int n, char
6630: 20 2a 7a 29 7b 0a 20 20 72 65 74 75 72 6e 20 67   *z){.  return g
6640: 2e 70 56 66 73 2d 3e 78 47 65 74 4c 61 73 74 45  .pVfs->xGetLastE
6650: 72 72 6f 72 28 67 2e 70 56 66 73 2c 20 6e 2c 20  rror(g.pVfs, n, 
6660: 7a 29 3b 0a 7d 0a 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a  z);.}../********
6670: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6680: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6690: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
66b0: 2a 2a 0a 2a 2a 20 53 74 61 72 74 20 6f 66 20 70  **.** Start of p
66c0: 75 62 6c 69 63 20 41 50 49 2e 0a 2a 2f 0a 0a 2f  ublic API..*/../
66d0: 2a 0a 2a 2a 20 43 6f 6e 66 69 67 75 72 65 20 74  *.** Configure t
66e0: 68 65 20 6a 74 20 56 46 53 20 61 73 20 61 20 77  he jt VFS as a w
66f0: 72 61 70 70 65 72 20 61 72 6f 75 6e 64 20 74 68  rapper around th
6700: 65 20 56 46 53 20 6e 61 6d 65 64 20 62 79 20 70  e VFS named by p
6710: 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 7a 57 72  arameter .** zWr
6720: 61 70 2e 20 49 66 20 74 68 65 20 69 73 44 65 66  ap. If the isDef
6730: 61 75 6c 74 20 70 61 72 61 6d 65 74 65 72 20 69  ault parameter i
6740: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74 68 65  s true, then the
6750: 20 6a 74 20 56 46 53 20 69 73 20 69 6e 73 74 61   jt VFS is insta
6760: 6c 6c 65 64 0a 2a 2a 20 61 73 20 74 68 65 20 6e  lled.** as the n
6770: 65 77 20 64 65 66 61 75 6c 74 20 56 46 53 20 66  ew default VFS f
6780: 6f 72 20 53 51 4c 69 74 65 20 63 6f 6e 6e 65 63  or SQLite connec
6790: 74 69 6f 6e 73 2e 20 49 66 20 69 73 44 65 66 61  tions. If isDefa
67a0: 75 6c 74 20 69 73 20 6e 6f 74 0a 2a 2a 20 74 72  ult is not.** tr
67b0: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 74 20  ue, then the jt 
67c0: 56 46 53 20 69 73 20 69 6e 73 74 61 6c 6c 65 64  VFS is installed
67d0: 20 61 73 20 6e 6f 6e 2d 64 65 66 61 75 6c 74 2e   as non-default.
67e0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   In this case it
67f0: 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c 65  .** is available
6800: 20 76 69 61 20 69 74 73 20 6e 61 6d 65 2c 20 22   via its name, "
6810: 6a 74 22 2e 0a 2a 2f 0a 69 6e 74 20 6a 74 5f 72  jt"..*/.int jt_r
6820: 65 67 69 73 74 65 72 28 63 68 61 72 20 2a 7a 57  egister(char *zW
6830: 72 61 70 2c 20 69 6e 74 20 69 73 44 65 66 61 75  rap, int isDefau
6840: 6c 74 29 7b 0a 20 20 67 2e 70 56 66 73 20 3d 20  lt){.  g.pVfs = 
6850: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
6860: 28 7a 57 72 61 70 29 3b 0a 20 20 69 66 28 20 67  (zWrap);.  if( g
6870: 2e 70 56 66 73 3d 3d 30 20 29 7b 0a 20 20 20 20  .pVfs==0 ){.    
6880: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
6890: 52 4f 52 3b 0a 20 20 7d 0a 20 20 6a 74 5f 76 66  ROR;.  }.  jt_vf
68a0: 73 2e 73 7a 4f 73 46 69 6c 65 20 3d 20 73 69 7a  s.szOsFile = siz
68b0: 65 6f 66 28 6a 74 5f 66 69 6c 65 29 20 2b 20 67  eof(jt_file) + g
68c0: 2e 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 3b  .pVfs->szOsFile;
68d0: 0a 20 20 69 66 28 20 67 2e 70 56 66 73 2d 3e 69  .  if( g.pVfs->i
68e0: 56 65 72 73 69 6f 6e 3d 3d 31 20 29 7b 0a 20 20  Version==1 ){.  
68f0: 20 20 6a 74 5f 76 66 73 2e 69 56 65 72 73 69 6f    jt_vfs.iVersio
6900: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 20 69  n = 1;.  }else i
6910: 66 28 20 67 2e 70 56 66 73 2d 3e 78 43 75 72 72  f( g.pVfs->xCurr
6920: 65 6e 74 54 69 6d 65 49 6e 74 36 34 3d 3d 30 20  entTimeInt64==0 
6930: 29 7b 0a 20 20 20 20 6a 74 5f 76 66 73 2e 78 43  ){.    jt_vfs.xC
6940: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20  urrentTimeInt64 
6950: 3d 20 30 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  = 0;.  }.  sqlit
6960: 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28  e3_vfs_register(
6970: 26 6a 74 5f 76 66 73 2c 20 69 73 44 65 66 61 75  &jt_vfs, isDefau
6980: 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  lt);.  return SQ
6990: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
69a0: 2a 20 55 6e 69 6e 73 74 61 6c 6c 20 74 68 65 20  * Uninstall the 
69b0: 6a 74 20 56 46 53 2c 20 69 66 20 69 74 20 69 73  jt VFS, if it is
69c0: 20 69 6e 73 74 61 6c 6c 65 64 2e 0a 2a 2f 0a 76   installed..*/.v
69d0: 6f 69 64 20 6a 74 5f 75 6e 72 65 67 69 73 74 65  oid jt_unregiste
69e0: 72 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  r(void){.  sqlit
69f0: 65 33 5f 76 66 73 5f 75 6e 72 65 67 69 73 74 65  e3_vfs_unregiste
6a00: 72 28 26 6a 74 5f 76 66 73 29 3b 0a 7d 0a 0a 23  r(&jt_vfs);.}..#
6a10: 65 6e 64 69 66 0a                                endif.