/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 785edd54f963aefb3c1628124170a56697c68c70:


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: 2f 0a 23 69 66 20 53 51 4c 49 54 45 5f 54 45 53  /.#if SQLITE_TES
0280: 54 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  T          /* Th
0290: 69 73 20 66 69 6c 65 20 69 73 20 75 73 65 64 20  is file is used 
02a0: 66 6f 72 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79  for testing only
02b0: 20 2a 2f 0a 0a 23 69 6e 63 6c 75 64 65 20 22 73   */..#include "s
02c0: 71 6c 69 74 65 33 2e 68 22 0a 23 69 6e 63 6c 75  qlite3.h".#inclu
02d0: 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68 22  de "sqliteInt.h"
02e0: 0a 0a 2f 2a 0a 2a 2a 20 49 4e 54 45 52 46 41 43  ../*.** INTERFAC
02f0: 45 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70 75  E.**.**   The pu
0300: 62 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 74  blic interface t
0310: 6f 20 74 68 69 73 20 77 72 61 70 70 65 72 20 56  o this wrapper V
0320: 46 53 20 69 73 20 74 77 6f 20 66 75 6e 63 74 69  FS is two functi
0330: 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 6a  ons:.**.**     j
0340: 74 5f 72 65 67 69 73 74 65 72 28 29 0a 2a 2a 20  t_register().** 
0350: 20 20 20 20 6a 74 5f 75 6e 72 65 67 69 73 74 65      jt_unregiste
0360: 72 28 29 0a 2a 2a 0a 2a 2a 20 20 20 53 65 65 20  r().**.**   See 
0370: 68 65 61 64 65 72 20 63 6f 6d 6d 65 6e 74 73 20  header comments 
0380: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
0390: 74 68 6f 73 65 20 74 77 6f 20 66 75 6e 63 74 69  those two functi
03a0: 6f 6e 73 20 62 65 6c 6f 77 20 66 6f 72 20 0a 2a  ons below for .*
03b0: 2a 20 20 20 64 65 74 61 69 6c 73 2e 0a 2a 2a 0a  *   details..**.
03c0: 2a 2a 20 4c 49 4d 49 54 41 54 49 4f 4e 53 0a 2a  ** LIMITATIONS.*
03d0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 77 72 61 70  *.**   This wrap
03e0: 70 65 72 20 77 69 6c 6c 20 6e 6f 74 20 77 6f 72  per will not wor
03f0: 6b 20 69 66 20 22 50 52 41 47 4d 41 20 73 79 6e  k if "PRAGMA syn
0400: 63 68 72 6f 6e 6f 75 73 20 3d 20 6f 66 66 22 20  chronous = off" 
0410: 69 73 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  is used..**.** O
0420: 50 45 52 41 54 49 4f 4e 0a 2a 2a 0a 2a 2a 20 20  PERATION.**.**  
0430: 53 74 61 72 74 69 6e 67 20 61 20 54 72 61 6e 73  Starting a Trans
0440: 61 63 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  action:.**.**   
0450: 57 68 65 6e 20 61 20 77 72 69 74 65 2d 74 72 61  When a write-tra
0460: 6e 73 61 63 74 69 6f 6e 20 69 73 20 73 74 61 72  nsaction is star
0470: 74 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ted, the content
0480: 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  s of the databas
0490: 65 20 69 73 0a 2a 2a 20 20 20 69 6e 73 70 65 63  e is.**   inspec
04a0: 74 65 64 20 61 6e 64 20 74 68 65 20 66 6f 6c 6c  ted and the foll
04b0: 6f 77 69 6e 67 20 64 61 74 61 20 73 74 6f 72 65  owing data store
04c0: 64 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  d as part of the
04d0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a   database file .
04e0: 2a 2a 20 20 20 68 61 6e 64 6c 65 20 28 74 79 70  **   handle (typ
04f0: 65 20 73 74 72 75 63 74 20 6a 74 5f 66 69 6c 65  e struct jt_file
0500: 29 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61 29 20  ):.**.**     a) 
0510: 54 68 65 20 70 61 67 65 2d 73 69 7a 65 20 6f 66  The page-size of
0520: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
0530: 6c 65 2e 0a 2a 2a 20 20 20 20 20 62 29 20 54 68  le..**     b) Th
0540: 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
0550: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
0560: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0570: 0a 2a 2a 20 20 20 20 20 63 29 20 54 68 65 20 73  .**     c) The s
0580: 65 74 20 6f 66 20 70 61 67 65 20 6e 75 6d 62 65  et of page numbe
0590: 72 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  rs corresponding
05a0: 20 74 6f 20 66 72 65 65 2d 6c 69 73 74 20 6c 65   to free-list le
05b0: 61 66 20 70 61 67 65 73 2e 0a 2a 2a 20 20 20 20  af pages..**    
05c0: 20 64 29 20 41 20 63 68 65 63 6b 2d 73 75 6d 20   d) A check-sum 
05d0: 66 6f 72 20 65 76 65 72 79 20 70 61 67 65 20 69  for every page i
05e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
05f0: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  ile..**.**   The
0600: 20 73 74 61 72 74 20 6f 66 20 61 20 77 72 69 74   start of a writ
0610: 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e-transaction is
0620: 20 64 65 65 6d 65 64 20 74 6f 20 68 61 76 65 20   deemed to have 
0630: 6f 63 63 75 72 72 65 64 20 77 68 65 6e 20 61 20  occurred when a 
0640: 0a 2a 2a 20 20 20 32 38 2d 62 79 74 65 20 6a 6f  .**   28-byte jo
0650: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20  urnal header is 
0660: 77 72 69 74 74 65 6e 20 74 6f 20 62 79 74 65 20  written to byte 
0670: 6f 66 66 73 65 74 20 30 20 6f 66 20 74 68 65 20  offset 0 of the 
0680: 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 66 69  journal .**   fi
0690: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 53 79 6e 63 69  le..**.**  Synci
06a0: 6e 67 20 74 68 65 20 4a 6f 75 72 6e 61 6c 20 46  ng the Journal F
06b0: 69 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65  ile:.**.**   Whe
06c0: 6e 65 76 65 72 20 74 68 65 20 78 53 79 6e 63 20  never the xSync 
06d0: 6d 65 74 68 6f 64 20 69 73 20 69 6e 76 6f 6b 65  method is invoke
06e0: 64 20 74 6f 20 73 79 6e 63 20 61 20 6a 6f 75 72  d to sync a jour
06f0: 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 0a 2a 2a  nal-file, the.**
0700: 20 20 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74     contents of t
0710: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0720: 61 72 65 20 72 65 61 64 2e 20 46 6f 72 20 65 61  are read. For ea
0730: 63 68 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  ch page written 
0740: 74 6f 0a 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72  to.**   the jour
0750: 6e 61 6c 20 66 69 6c 65 2c 20 61 20 63 68 65 63  nal file, a chec
0760: 6b 2d 73 75 6d 20 69 73 20 63 61 6c 63 75 6c 61  k-sum is calcula
0770: 74 65 64 20 61 6e 64 20 63 6f 6d 70 61 72 65 64  ted and compared
0780: 20 74 6f 20 74 68 65 20 20 0a 2a 2a 20 20 20 63   to the  .**   c
0790: 68 65 63 6b 2d 73 75 6d 20 63 61 6c 63 75 6c 61  heck-sum calcula
07a0: 74 65 64 20 66 6f 72 20 74 68 65 20 63 6f 72 72  ted for the corr
07b0: 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61 62 61  esponding databa
07c0: 73 65 20 70 61 67 65 20 77 68 65 6e 20 74 68 65  se page when the
07d0: 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e  .**   write-tran
07e0: 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 69 74  saction was init
07f0: 69 61 6c 69 7a 65 64 2e 20 54 68 65 20 73 75 63  ialized. The suc
0800: 63 65 73 73 20 6f 66 20 74 68 65 20 63 6f 6d 70  cess of the comp
0810: 61 72 69 73 6f 6e 0a 2a 2a 20 20 20 69 73 20 61  arison.**   is a
0820: 73 73 65 72 74 28 29 65 64 2e 20 53 6f 20 69 66  ssert()ed. So if
0830: 20 53 51 4c 69 74 65 20 68 61 73 20 77 72 69 74   SQLite has writ
0840: 74 65 6e 20 73 6f 6d 65 74 68 69 6e 67 20 6f 74  ten something ot
0850: 68 65 72 20 74 68 61 6e 20 74 68 65 0a 2a 2a 20  her than the.** 
0860: 20 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65    original conte
0870: 6e 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  nt to the databa
0880: 73 65 20 66 69 6c 65 2c 20 61 6e 20 61 73 73 65  se file, an asse
0890: 72 74 28 29 20 77 69 6c 6c 20 66 61 69 6c 2e 0a  rt() will fail..
08a0: 2a 2a 0a 2a 2a 20 20 20 41 64 64 69 74 69 6f 6e  **.**   Addition
08b0: 61 6c 6c 79 2c 20 74 68 65 20 73 65 74 20 6f 66  ally, the set of
08c0: 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 66 6f   page numbers fo
08d0: 72 20 77 68 69 63 68 20 72 65 63 6f 72 64 73 20  r which records 
08e0: 65 78 69 73 74 20 69 6e 0a 2a 2a 20 20 20 74 68  exist in.**   th
08f0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
0900: 73 20 61 64 64 65 64 20 74 6f 20 28 75 6e 69 6f  s added to (unio
0910: 6e 65 64 20 77 69 74 68 29 20 74 68 65 20 73 65  ned with) the se
0920: 74 20 6f 66 20 70 61 67 65 20 6e 75 6d 62 65 72  t of page number
0930: 73 0a 2a 2a 20 20 20 63 6f 72 72 65 73 70 6f 6e  s.**   correspon
0940: 64 69 6e 67 20 74 6f 20 66 72 65 65 2d 6c 69 73  ding to free-lis
0950: 74 20 6c 65 61 66 20 70 61 67 65 73 20 63 6f 6c  t leaf pages col
0960: 6c 65 63 74 65 64 20 77 68 65 6e 20 74 68 65 20  lected when the 
0970: 0a 2a 2a 20 20 20 77 72 69 74 65 2d 74 72 61 6e  .**   write-tran
0980: 73 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 69 74  saction was init
0990: 69 61 6c 69 7a 65 64 2e 20 54 68 69 73 20 73 65  ialized. This se
09a0: 74 20 63 6f 6d 70 72 69 73 65 73 20 74 68 65 20  t comprises the 
09b0: 70 61 67 65 2d 6e 75 6d 62 65 72 73 20 0a 2a 2a  page-numbers .**
09c0: 20 20 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67     corresponding
09d0: 20 74 6f 20 74 68 6f 73 65 20 70 61 67 65 73 20   to those pages 
09e0: 74 68 61 74 20 53 51 4c 69 74 65 20 6d 61 79 20  that SQLite may 
09f0: 6e 6f 77 20 73 61 66 65 6c 79 20 6d 6f 64 69 66  now safely modif
0a00: 79 2e 0a 2a 2a 0a 2a 2a 20 20 57 72 69 74 69 6e  y..**.**  Writin
0a10: 67 20 74 6f 20 74 68 65 20 44 61 74 61 62 61 73  g to the Databas
0a20: 65 20 46 69 6c 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  e File:.**.**   
0a30: 57 68 65 6e 20 61 20 62 6c 6f 63 6b 20 6f 66 20  When a block of 
0a40: 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
0a50: 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 66 69  to a database fi
0a60: 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  le, the followin
0a70: 67 0a 2a 2a 20 20 20 69 6e 76 61 72 69 61 6e 74  g.**   invariant
0a80: 73 20 61 72 65 20 61 73 73 65 72 74 65 64 3a 0a  s are asserted:.
0a90: 2a 2a 0a 2a 2a 20 20 20 20 20 61 29 20 54 68 61  **.**     a) Tha
0aa0: 74 20 74 68 65 20 62 6c 6f 63 6b 20 6f 66 20 64  t the block of d
0ab0: 61 74 61 20 69 73 20 61 6e 20 61 6c 69 67 6e 65  ata is an aligne
0ac0: 64 20 62 6c 6f 63 6b 20 6f 66 20 70 61 67 65 2d  d block of page-
0ad0: 73 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a  size bytes..**.*
0ae0: 2a 20 20 20 20 20 62 29 20 54 68 61 74 20 69 66  *     b) That if
0af0: 20 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   the page being 
0b00: 77 72 69 74 74 65 6e 20 64 69 64 20 6e 6f 74 20  written did not 
0b10: 65 78 69 73 74 20 77 68 65 6e 20 74 68 65 20 0a  exist when the .
0b20: 2a 2a 20 20 20 20 20 20 20 20 74 72 61 6e 73 61  **        transa
0b30: 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
0b40: 64 20 28 69 2e 65 2e 20 74 68 65 20 64 61 74 61  d (i.e. the data
0b50: 62 61 73 65 20 66 69 6c 65 20 69 73 20 67 72 6f  base file is gro
0b60: 77 69 6e 67 29 2c 20 74 68 65 6e 0a 2a 2a 20 20  wing), then.**  
0b70: 20 20 20 20 20 20 74 68 65 20 6a 6f 75 72 6e 61        the journa
0b80: 6c 2d 66 69 6c 65 20 6d 75 73 74 20 68 61 76 65  l-file must have
0b90: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 61 74 20   been synced at 
0ba0: 6c 65 61 73 74 20 6f 6e 63 65 20 73 69 6e 63 65  least once since
0bb0: 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 73  .**        the s
0bc0: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
0bd0: 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20  saction..**.**  
0be0: 20 20 20 63 29 20 54 68 61 74 20 69 66 20 74 68     c) That if th
0bf0: 65 20 70 61 67 65 20 62 65 69 6e 67 20 77 72 69  e page being wri
0c00: 74 74 65 6e 20 64 69 64 20 65 78 69 73 74 20 77  tten did exist w
0c10: 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
0c20: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 77  ion .**        w
0c30: 61 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 6e  as started, then
0c40: 20 74 68 65 20 70 61 67 65 20 6d 75 73 74 20 68   the page must h
0c50: 61 76 65 20 65 69 74 68 65 72 20 62 65 65 6e 20  ave either been 
0c60: 61 20 66 72 65 65 2d 6c 69 73 74 0a 2a 2a 20 20  a free-list.**  
0c70: 20 20 20 20 20 20 6c 65 61 66 20 70 61 67 65 20        leaf page 
0c80: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
0c90: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
0ca0: 20 6f 72 20 65 6c 73 65 20 6d 75 73 74 20 68 61   or else must ha
0cb0: 76 65 0a 2a 2a 20 20 20 20 20 20 20 20 62 65 65  ve.**        bee
0cc0: 6e 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  n stored in the 
0cd0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 70 72 69  journal file pri
0ce0: 6f 72 20 74 6f 20 74 68 65 20 6d 6f 73 74 20 72  or to the most r
0cf0: 65 63 65 6e 74 20 73 79 6e 63 2e 0a 2a 2a 0a 2a  ecent sync..**.*
0d00: 2a 20 20 43 6c 6f 73 69 6e 67 20 61 20 54 72 61  *  Closing a Tra
0d10: 6e 73 61 63 74 69 6f 6e 3a 0a 2a 2a 0a 2a 2a 20  nsaction:.**.** 
0d20: 20 20 57 68 65 6e 20 61 20 74 72 61 6e 73 61 63    When a transac
0d30: 74 69 6f 6e 20 69 73 20 63 6c 6f 73 65 64 2c 20  tion is closed, 
0d40: 61 6c 6c 20 64 61 74 61 20 63 6f 6c 6c 65 63 74  all data collect
0d50: 65 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ed at the start 
0d60: 6f 66 0a 2a 2a 20 20 20 74 68 65 20 74 72 61 6e  of.**   the tran
0d70: 73 61 63 74 69 6f 6e 2c 20 6f 72 20 66 6f 6c 6c  saction, or foll
0d80: 6f 77 69 6e 67 20 61 6e 20 78 53 79 6e 63 20 6f  owing an xSync o
0d90: 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65  f a journal-file
0da0: 2c 20 69 73 20 0a 2a 2a 20 20 20 64 69 73 63 61  , is .**   disca
0db0: 72 64 65 64 2e 20 54 68 65 20 65 6e 64 20 6f 66  rded. The end of
0dc0: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
0dd0: 73 20 72 65 63 6f 67 6e 69 7a 65 64 20 77 68 65  s recognized whe
0de0: 6e 20 61 6e 79 20 6f 6e 65 20 0a 2a 2a 20 20 20  n any one .**   
0df0: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
0e00: 20 6f 63 63 75 72 3a 0a 2a 2a 0a 2a 2a 20 20 20   occur:.**.**   
0e10: 20 20 61 29 20 41 20 62 6c 6f 63 6b 20 6f 66 20    a) A block of 
0e20: 7a 65 72 6f 65 73 20 28 6f 72 20 61 6e 79 74 68  zeroes (or anyth
0e30: 69 6e 67 20 65 6c 73 65 20 74 68 61 74 20 69 73  ing else that is
0e40: 20 6e 6f 74 20 61 20 76 61 6c 69 64 20 0a 2a 2a   not a valid .**
0e50: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2d          journal-
0e60: 68 65 61 64 65 72 29 20 69 73 20 77 72 69 74 74  header) is writt
0e70: 65 6e 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  en to the start 
0e80: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
0e90: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62  ile..**.**     b
0ea0: 29 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ) A journal file
0eb0: 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
0ec0: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
0ed0: 69 7a 65 20 75 73 69 6e 67 20 78 54 72 75 6e 63  ize using xTrunc
0ee0: 61 74 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 63  ate..**.**     c
0ef0: 29 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  ) The journal fi
0f00: 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20 75 73  le is deleted us
0f10: 69 6e 67 20 78 44 65 6c 65 74 65 2e 0a 2a 2f 0a  ing xDelete..*/.
0f20: 0a 2f 2a 0a 2a 2a 20 4d 61 78 69 6d 75 6d 20 70  ./*.** Maximum p
0f30: 61 74 68 6e 61 6d 65 20 6c 65 6e 67 74 68 20 73  athname length s
0f40: 75 70 70 6f 72 74 65 64 20 62 79 20 74 68 65 20  upported by the 
0f50: 6a 74 20 62 61 63 6b 65 6e 64 2e 0a 2a 2f 0a 23  jt backend..*/.#
0f60: 64 65 66 69 6e 65 20 4a 54 5f 4d 41 58 5f 50 41  define JT_MAX_PA
0f70: 54 48 4e 41 4d 45 20 35 31 32 0a 0a 2f 2a 0a 2a  THNAME 512../*.*
0f80: 2a 20 4e 61 6d 65 20 75 73 65 64 20 74 6f 20 69  * Name used to i
0f90: 64 65 6e 74 69 66 79 20 74 68 69 73 20 56 46 53  dentify this VFS
0fa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 54 5f  ..*/.#define JT_
0fb0: 56 46 53 5f 4e 41 4d 45 20 22 6a 74 22 0a 0a 74  VFS_NAME "jt"..t
0fc0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 6a 74  ypedef struct jt
0fd0: 5f 66 69 6c 65 20 6a 74 5f 66 69 6c 65 3b 0a 73  _file jt_file;.s
0fe0: 74 72 75 63 74 20 6a 74 5f 66 69 6c 65 20 7b 0a  truct jt_file {.
0ff0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 62    sqlite3_file b
1000: 61 73 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ase;.  const cha
1010: 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20  r *zName;       
1020: 2f 2a 20 4e 61 6d 65 20 6f 66 20 6f 70 65 6e 20  /* Name of open 
1030: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c  file */.  int fl
1040: 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20 20  ags;            
1050: 20 20 20 2f 2a 20 46 6c 61 67 73 20 74 68 65 20     /* Flags the 
1060: 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20  file was opened 
1070: 77 69 74 68 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  with */..  /* Th
1080: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1090: 6f 6e 6c 79 20 75 73 65 64 20 62 79 20 64 61 74  only used by dat
10a0: 61 62 61 73 65 20 66 69 6c 65 20 66 69 6c 65 20  abase file file 
10b0: 68 61 6e 64 6c 65 73 20 2a 2f 0a 20 20 69 6e 74  handles */.  int
10c0: 20 65 4c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20   eLock;         
10d0: 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
10e0: 20 6c 6f 63 6b 20 68 65 6c 64 20 6f 6e 20 74 68   lock held on th
10f0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 33 32 20  e file */.  u32 
1100: 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20  nPage;          
1110: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
1120: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 77 68  file in pages wh
1130: 65 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  en transaction s
1140: 74 61 72 74 65 64 20 2a 2f 0a 20 20 75 33 32 20  tarted */.  u32 
1150: 6e 50 61 67 65 73 69 7a 65 3b 20 20 20 20 20 20  nPagesize;      
1160: 20 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a       /* Page siz
1170: 65 20 77 68 65 6e 20 74 72 61 6e 73 61 63 74 69  e when transacti
1180: 6f 6e 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20  on started */.  
1190: 42 69 74 76 65 63 20 2a 70 57 72 69 74 61 62 6c  Bitvec *pWritabl
11a0: 65 3b 20 20 20 20 20 20 20 2f 2a 20 42 69 74 76  e;       /* Bitv
11b0: 65 63 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  ec of pages that
11c0: 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
11d0: 74 6f 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  to the file */. 
11e0: 20 75 33 32 20 2a 61 43 6b 73 75 6d 3b 20 20 20   u32 *aCksum;   
11f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
1200: 63 6b 73 75 6d 20 66 6f 72 20 66 69 72 73 74 20  cksum for first 
1210: 6e 50 61 67 65 20 70 61 67 65 73 20 2a 2f 0a 20  nPage pages */. 
1220: 20 69 6e 74 20 6e 53 79 6e 63 3b 20 20 20 20 20   int nSync;     
1230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1240: 62 65 72 20 6f 66 20 74 69 6d 65 73 20 6a 6f 75  ber of times jou
1250: 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 62 65  rnal file has be
1260: 65 6e 20 73 79 6e 63 65 64 20 2a 2f 0a 0a 20 20  en synced */..  
1270: 2f 2a 20 4f 6e 6c 79 20 75 73 65 64 20 62 79 20  /* Only used by 
1280: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
1290: 64 6c 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  dles */.  sqlite
12a0: 33 5f 69 6e 74 36 34 20 69 4d 61 78 4f 66 66 3b  3_int64 iMaxOff;
12b0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6f 66     /* Maximum of
12c0: 66 73 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20  fset written to 
12d0: 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
12e0: 20 2a 2f 0a 0a 20 20 6a 74 5f 66 69 6c 65 20 2a   */..  jt_file *
12f0: 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20 20 20  pNext;          
1300: 2f 2a 20 41 6c 6c 20 66 69 6c 65 73 20 61 72 65  /* All files are
1310: 20 73 74 6f 72 65 64 20 69 6e 20 61 20 6c 69 6e   stored in a lin
1320: 6b 65 64 20 6c 69 73 74 20 2a 2f 0a 20 20 73 71  ked list */.  sq
1330: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 52 65 61  lite3_file *pRea
1340: 6c 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 66 69  l;     /* The fi
1350: 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68  le handle for th
1360: 65 20 75 6e 64 65 72 6c 79 69 6e 67 20 76 66 73  e underlying vfs
1370: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65   */.};../*.** Me
1380: 74 68 6f 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  thod declaration
1390: 73 20 66 6f 72 20 6a 74 5f 66 69 6c 65 2e 0a 2a  s for jt_file..*
13a0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 43  /.static int jtC
13b0: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  lose(sqlite3_fil
13c0: 65 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  e*);.static int 
13d0: 6a 74 52 65 61 64 28 73 71 6c 69 74 65 33 5f 66  jtRead(sqlite3_f
13e0: 69 6c 65 2a 2c 20 76 6f 69 64 2a 2c 20 69 6e 74  ile*, void*, int
13f0: 20 69 41 6d 74 2c 20 73 71 6c 69 74 65 33 5f 69   iAmt, sqlite3_i
1400: 6e 74 36 34 20 69 4f 66 73 74 29 3b 0a 73 74 61  nt64 iOfst);.sta
1410: 74 69 63 20 69 6e 74 20 6a 74 57 72 69 74 65 28  tic int jtWrite(
1420: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 63 6f  sqlite3_file*,co
1430: 6e 73 74 20 76 6f 69 64 2a 2c 69 6e 74 20 69 41  nst void*,int iA
1440: 6d 74 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  mt, sqlite3_int6
1450: 34 20 69 4f 66 73 74 29 3b 0a 73 74 61 74 69 63  4 iOfst);.static
1460: 20 69 6e 74 20 6a 74 54 72 75 6e 63 61 74 65 28   int jtTruncate(
1470: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73  sqlite3_file*, s
1480: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 69 7a  qlite3_int64 siz
1490: 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  e);.static int j
14a0: 74 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69  tSync(sqlite3_fi
14b0: 6c 65 2a 2c 20 69 6e 74 20 66 6c 61 67 73 29 3b  le*, int flags);
14c0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 46 69  .static int jtFi
14d0: 6c 65 53 69 7a 65 28 73 71 6c 69 74 65 33 5f 66  leSize(sqlite3_f
14e0: 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ile*, sqlite3_in
14f0: 74 36 34 20 2a 70 53 69 7a 65 29 3b 0a 73 74 61  t64 *pSize);.sta
1500: 74 69 63 20 69 6e 74 20 6a 74 4c 6f 63 6b 28 73  tic int jtLock(s
1510: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1520: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  t);.static int j
1530: 74 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f  tUnlock(sqlite3_
1540: 66 69 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61  file*, int);.sta
1550: 74 69 63 20 69 6e 74 20 6a 74 43 68 65 63 6b 52  tic int jtCheckR
1560: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
1570: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2a  te3_file*, int *
1580: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74  );.static int jt
1590: 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71 6c 69  FileControl(sqli
15a0: 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 6f  te3_file*, int o
15b0: 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 3b 0a  p, void *pArg);.
15c0: 73 74 61 74 69 63 20 69 6e 74 20 6a 74 53 65 63  static int jtSec
15d0: 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33 5f  torSize(sqlite3_
15e0: 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20 69  file*);.static i
15f0: 6e 74 20 6a 74 44 65 76 69 63 65 43 68 61 72 61  nt jtDeviceChara
1600: 63 74 65 72 69 73 74 69 63 73 28 73 71 6c 69 74  cteristics(sqlit
1610: 65 33 5f 66 69 6c 65 2a 29 3b 0a 0a 2f 2a 0a 2a  e3_file*);../*.*
1620: 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72 61  * Method declara
1630: 74 69 6f 6e 73 20 66 6f 72 20 6a 74 5f 76 66 73  tions for jt_vfs
1640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1650: 6a 74 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76  jtOpen(sqlite3_v
1660: 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  fs*, const char 
1670: 2a 2c 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  *, sqlite3_file*
1680: 2c 20 69 6e 74 20 2c 20 69 6e 74 20 2a 29 3b 0a  , int , int *);.
1690: 73 74 61 74 69 63 20 69 6e 74 20 6a 74 44 65 6c  static int jtDel
16a0: 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73 2a  ete(sqlite3_vfs*
16b0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
16c0: 61 6d 65 2c 20 69 6e 74 20 73 79 6e 63 44 69 72  ame, int syncDir
16d0: 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74  );.static int jt
16e0: 41 63 63 65 73 73 28 73 71 6c 69 74 65 33 5f 76  Access(sqlite3_v
16f0: 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  fs*, const char 
1700: 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 66 6c 61 67  *zName, int flag
1710: 73 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74 69  s, int *);.stati
1720: 63 20 69 6e 74 20 6a 74 46 75 6c 6c 50 61 74 68  c int jtFullPath
1730: 6e 61 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73  name(sqlite3_vfs
1740: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  *, const char *z
1750: 4e 61 6d 65 2c 20 69 6e 74 2c 20 63 68 61 72 20  Name, int, char 
1760: 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69 63 20 76  *zOut);.static v
1770: 6f 69 64 20 2a 6a 74 44 6c 4f 70 65 6e 28 73 71  oid *jtDlOpen(sq
1780: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73  lite3_vfs*, cons
1790: 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d  t char *zFilenam
17a0: 65 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20  e);.static void 
17b0: 6a 74 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65  jtDlError(sqlite
17c0: 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6e 42 79 74  3_vfs*, int nByt
17d0: 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  e, char *zErrMsg
17e0: 29 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 28  );.static void (
17f0: 2a 6a 74 44 6c 53 79 6d 28 73 71 6c 69 74 65 33  *jtDlSym(sqlite3
1800: 5f 76 66 73 2a 2c 76 6f 69 64 2a 2c 20 63 6f 6e  _vfs*,void*, con
1810: 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 62 6f 6c  st char *zSymbol
1820: 29 29 28 76 6f 69 64 29 3b 0a 73 74 61 74 69 63  ))(void);.static
1830: 20 76 6f 69 64 20 6a 74 44 6c 43 6c 6f 73 65 28   void jtDlClose(
1840: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 76 6f  sqlite3_vfs*, vo
1850: 69 64 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  id*);.static int
1860: 20 6a 74 52 61 6e 64 6f 6d 6e 65 73 73 28 73 71   jtRandomness(sq
1870: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20  lite3_vfs*, int 
1880: 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 4f 75  nByte, char *zOu
1890: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  t);.static int j
18a0: 74 53 6c 65 65 70 28 73 71 6c 69 74 65 33 5f 76  tSleep(sqlite3_v
18b0: 66 73 2a 2c 20 69 6e 74 20 6d 69 63 72 6f 73 65  fs*, int microse
18c0: 63 6f 6e 64 73 29 3b 0a 73 74 61 74 69 63 20 69  conds);.static i
18d0: 6e 74 20 6a 74 43 75 72 72 65 6e 74 54 69 6d 65  nt jtCurrentTime
18e0: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 64  (sqlite3_vfs*, d
18f0: 6f 75 62 6c 65 2a 29 3b 0a 73 74 61 74 69 63 20  ouble*);.static 
1900: 69 6e 74 20 6a 74 43 75 72 72 65 6e 74 54 69 6d  int jtCurrentTim
1910: 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f 76  eInt64(sqlite3_v
1920: 66 73 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74  fs*, sqlite3_int
1930: 36 34 2a 29 3b 0a 0a 73 74 61 74 69 63 20 73 71  64*);..static sq
1940: 6c 69 74 65 33 5f 76 66 73 20 6a 74 5f 76 66 73  lite3_vfs jt_vfs
1950: 20 3d 20 7b 0a 20 20 32 2c 20 20 20 20 20 20 20   = {.  2,       
1960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1970: 20 20 20 20 20 20 2f 2a 20 69 56 65 72 73 69 6f        /* iVersio
1980: 6e 20 2a 2f 0a 20 20 73 69 7a 65 6f 66 28 6a 74  n */.  sizeof(jt
1990: 5f 66 69 6c 65 29 2c 20 20 20 20 20 20 20 20 20  _file),         
19a0: 20 20 20 20 20 20 2f 2a 20 73 7a 4f 73 46 69 6c        /* szOsFil
19b0: 65 20 2a 2f 0a 20 20 4a 54 5f 4d 41 58 5f 50 41  e */.  JT_MAX_PA
19c0: 54 48 4e 41 4d 45 2c 20 20 20 20 20 20 20 20 20  THNAME,         
19d0: 20 20 20 20 20 20 2f 2a 20 6d 78 50 61 74 68 6e        /* mxPathn
19e0: 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20 20 20  ame */.  0,     
19f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a00: 20 20 20 20 20 20 20 20 2f 2a 20 70 4e 65 78 74          /* pNext
1a10: 20 2a 2f 0a 20 20 4a 54 5f 56 46 53 5f 4e 41 4d   */.  JT_VFS_NAM
1a20: 45 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  E,              
1a30: 20 20 20 20 20 2f 2a 20 7a 4e 61 6d 65 20 2a 2f       /* zName */
1a40: 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20 20 20  .  0,           
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 2f 2a 20 70 41 70 70 44 61 74 61 20 2a 2f    /* pAppData */
1a70: 0a 20 20 6a 74 4f 70 65 6e 2c 20 20 20 20 20 20  .  jtOpen,      
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 20 20 2f 2a 20 78 4f 70 65 6e 20 2a 2f 0a 20 20    /* xOpen */.  
1aa0: 6a 74 44 65 6c 65 74 65 2c 20 20 20 20 20 20 20  jtDelete,       
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1ac0: 2a 20 78 44 65 6c 65 74 65 20 2a 2f 0a 20 20 6a  * xDelete */.  j
1ad0: 74 41 63 63 65 73 73 2c 20 20 20 20 20 20 20 20  tAccess,        
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1af0: 20 78 41 63 63 65 73 73 20 2a 2f 0a 20 20 6a 74   xAccess */.  jt
1b00: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 20 20  FullPathname,   
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1b20: 78 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 2a 2f  xFullPathname */
1b30: 0a 20 20 6a 74 44 6c 4f 70 65 6e 2c 20 20 20 20  .  jtDlOpen,    
1b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b50: 20 20 2f 2a 20 78 44 6c 4f 70 65 6e 20 2a 2f 0a    /* xDlOpen */.
1b60: 20 20 6a 74 44 6c 45 72 72 6f 72 2c 20 20 20 20    jtDlError,    
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b80: 20 2f 2a 20 78 44 6c 45 72 72 6f 72 20 2a 2f 0a   /* xDlError */.
1b90: 20 20 6a 74 44 6c 53 79 6d 2c 20 20 20 20 20 20    jtDlSym,      
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 2f 2a 20 78 44 6c 53 79 6d 20 2a 2f 0a 20 20   /* xDlSym */.  
1bc0: 6a 74 44 6c 43 6c 6f 73 65 2c 20 20 20 20 20 20  jtDlClose,      
1bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1be0: 2a 20 78 44 6c 43 6c 6f 73 65 20 2a 2f 0a 20 20  * xDlClose */.  
1bf0: 6a 74 52 61 6e 64 6f 6d 6e 65 73 73 2c 20 20 20  jtRandomness,   
1c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1c10: 2a 20 78 52 61 6e 64 6f 6d 6e 65 73 73 20 2a 2f  * xRandomness */
1c20: 0a 20 20 6a 74 53 6c 65 65 70 2c 20 20 20 20 20  .  jtSleep,     
1c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c40: 20 20 2f 2a 20 78 53 6c 65 65 70 20 2a 2f 0a 20    /* xSleep */. 
1c50: 20 6a 74 43 75 72 72 65 6e 74 54 69 6d 65 2c 20   jtCurrentTime, 
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 2f 2a 20 78 43 75 72 72 65 6e 74 54 69 6d 65 20  /* xCurrentTime 
1c80: 2a 2f 0a 20 20 30 2c 20 20 20 20 20 20 20 20 20  */.  0,         
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca0: 20 20 20 20 2f 2a 20 78 47 65 74 4c 61 73 74 45      /* xGetLastE
1cb0: 72 72 6f 72 20 2a 2f 0a 20 20 6a 74 43 75 72 72  rror */.  jtCurr
1cc0: 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 20 20 20  entTimeInt64    
1cd0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72           /* xCur
1ce0: 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 20 2a 2f  rentTimeInt64 */
1cf0: 0a 7d 3b 0a 0a 73 74 61 74 69 63 20 73 71 6c 69  .};..static sqli
1d00: 74 65 33 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 6a  te3_io_methods j
1d10: 74 5f 69 6f 5f 6d 65 74 68 6f 64 73 20 3d 20 7b  t_io_methods = {
1d20: 0a 20 20 31 2c 20 20 20 20 20 20 20 20 20 20 20  .  1,           
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 20 20 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f    /* iVersion */
1d50: 0a 20 20 6a 74 43 6c 6f 73 65 2c 20 20 20 20 20  .  jtClose,     
1d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d70: 20 20 2f 2a 20 78 43 6c 6f 73 65 20 2a 2f 0a 20    /* xClose */. 
1d80: 20 6a 74 52 65 61 64 2c 20 20 20 20 20 20 20 20   jtRead,        
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da0: 2f 2a 20 78 52 65 61 64 20 2a 2f 0a 20 20 6a 74  /* xRead */.  jt
1db0: 57 72 69 74 65 2c 20 20 20 20 20 20 20 20 20 20  Write,          
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1dd0: 78 57 72 69 74 65 20 2a 2f 0a 20 20 6a 74 54 72  xWrite */.  jtTr
1de0: 75 6e 63 61 74 65 2c 20 20 20 20 20 20 20 20 20  uncate,         
1df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 54             /* xT
1e00: 72 75 6e 63 61 74 65 20 2a 2f 0a 20 20 6a 74 53  runcate */.  jtS
1e10: 79 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  ync,            
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1e30: 53 79 6e 63 20 2a 2f 0a 20 20 6a 74 46 69 6c 65  Sync */.  jtFile
1e40: 53 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20  Size,           
1e50: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69 6c           /* xFil
1e60: 65 53 69 7a 65 20 2a 2f 0a 20 20 6a 74 4c 6f 63  eSize */.  jtLoc
1e70: 6b 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  k,              
1e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4c 6f            /* xLo
1e90: 63 6b 20 2a 2f 0a 20 20 6a 74 55 6e 6c 6f 63 6b  ck */.  jtUnlock
1ea0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1eb0: 20 20 20 20 20 20 20 2f 2a 20 78 55 6e 6c 6f 63         /* xUnloc
1ec0: 6b 20 2a 2f 0a 20 20 6a 74 43 68 65 63 6b 52 65  k */.  jtCheckRe
1ed0: 73 65 72 76 65 64 4c 6f 63 6b 2c 20 20 20 20 20  servedLock,     
1ee0: 20 20 20 20 20 20 2f 2a 20 78 43 68 65 63 6b 52        /* xCheckR
1ef0: 65 73 65 72 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20  eservedLock */. 
1f00: 20 6a 74 46 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20   jtFileControl, 
1f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f20: 2f 2a 20 78 46 69 6c 65 43 6f 6e 74 72 6f 6c 20  /* xFileControl 
1f30: 2a 2f 0a 20 20 6a 74 53 65 63 74 6f 72 53 69 7a  */.  jtSectorSiz
1f40: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1f50: 20 20 20 20 2f 2a 20 78 53 65 63 74 6f 72 53 69      /* xSectorSi
1f60: 7a 65 20 2a 2f 0a 20 20 6a 74 44 65 76 69 63 65  ze */.  jtDevice
1f70: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 20  Characteristics 
1f80: 20 20 20 20 20 20 20 2f 2a 20 78 44 65 76 69 63         /* xDevic
1f90: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
1fa0: 20 2a 2f 0a 7d 3b 0a 0a 73 74 72 75 63 74 20 4a   */.};..struct J
1fb0: 74 47 6c 6f 62 61 6c 20 7b 0a 20 20 73 71 6c 69  tGlobal {.  sqli
1fc0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
1fd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
1fe0: 72 65 6e 74 20 56 46 53 20 2a 2f 0a 20 20 6a 74  rent VFS */.  jt
1ff0: 5f 66 69 6c 65 20 2a 70 4c 69 73 74 3b 20 20 20  _file *pList;   
2000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2010: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6f 70 65 6e  List of all open
2020: 20 66 69 6c 65 73 20 2a 2f 0a 7d 3b 0a 73 74 61   files */.};.sta
2030: 74 69 63 20 73 74 72 75 63 74 20 4a 74 47 6c 6f  tic struct JtGlo
2040: 62 61 6c 20 67 20 3d 20 7b 30 2c 20 30 7d 3b 0a  bal g = {0, 0};.
2050: 0a 2f 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 73  ./*.** Functions
2060: 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e 64 20 72   to obtain and r
2070: 65 6c 69 6e 71 75 69 73 68 20 61 20 6d 75 74 65  elinquish a mute
2080: 78 20 74 6f 20 70 72 6f 74 65 63 74 20 67 2e 70  x to protect g.p
2090: 4c 69 73 74 2e 20 54 68 65 0a 2a 2a 20 53 54 41  List. The.** STA
20a0: 54 49 43 5f 50 52 4e 47 20 6d 75 74 65 78 20 69  TIC_PRNG mutex i
20b0: 73 20 72 65 75 73 65 64 2c 20 70 75 72 65 6c 79  s reused, purely
20c0: 20 66 6f 72 20 74 68 65 20 73 61 6b 65 20 6f 66   for the sake of
20d0: 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2e 0a 2a 2f   convenience..*/
20e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e 74  .static void ent
20f0: 65 72 4a 74 4d 75 74 65 78 28 76 6f 69 64 29 7b  erJtMutex(void){
2100: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
2110: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d  _enter(sqlite3_m
2120: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
2130: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 50  E_MUTEX_STATIC_P
2140: 52 4e 47 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  RNG));.}.static 
2150: 76 6f 69 64 20 6c 65 61 76 65 4a 74 4d 75 74 65  void leaveJtMute
2160: 78 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  x(void){.  sqlit
2170: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
2180: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
2190: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
21a0: 53 54 41 54 49 43 5f 50 52 4e 47 29 29 3b 0a 7d  STATIC_PRNG));.}
21b0: 0a 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ..extern int sql
21c0: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
21d0: 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
21e0: 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
21f0: 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 76  or_hit;.static v
2200: 6f 69 64 20 73 74 6f 70 5f 69 6f 65 72 72 5f 73  oid stop_ioerr_s
2210: 69 6d 75 6c 61 74 69 6f 6e 28 69 6e 74 20 2a 70  imulation(int *p
2220: 69 53 61 76 65 2c 20 69 6e 74 20 2a 70 69 53 61  iSave, int *piSa
2230: 76 65 32 29 7b 0a 20 20 2a 70 69 53 61 76 65 20  ve2){.  *piSave 
2240: 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  = sqlite3_io_err
2250: 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 2a 70  or_pending;.  *p
2260: 69 53 61 76 65 32 20 3d 20 73 71 6c 69 74 65 33  iSave2 = sqlite3
2270: 5f 69 6f 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 20  _io_error_hit;. 
2280: 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
2290: 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
22a0: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
22b0: 6f 72 5f 68 69 74 20 3d 20 30 3b 0a 7d 0a 73 74  or_hit = 0;.}.st
22c0: 61 74 69 63 20 76 6f 69 64 20 73 74 61 72 74 5f  atic void start_
22d0: 69 6f 65 72 72 5f 73 69 6d 75 6c 61 74 69 6f 6e  ioerr_simulation
22e0: 28 69 6e 74 20 69 53 61 76 65 2c 20 69 6e 74 20  (int iSave, int 
22f0: 69 53 61 76 65 32 29 7b 0a 20 20 73 71 6c 69 74  iSave2){.  sqlit
2300: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
2310: 69 6e 67 20 3d 20 69 53 61 76 65 3b 0a 20 20 73  ing = iSave;.  s
2320: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
2330: 68 69 74 20 3d 20 69 53 61 76 65 32 3b 0a 7d 0a  hit = iSave2;.}.
2340: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 74 5f 66 69  ./*.** The jt_fi
2350: 6c 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  le pointed to by
2360: 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61   the argument ma
2370: 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20  y or may not be 
2380: 61 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 2a 2a  a file-handle.**
2390: 20 6f 70 65 6e 20 6f 6e 20 61 20 6d 61 69 6e 20   open on a main 
23a0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
23b0: 66 20 69 74 20 69 73 2c 20 61 6e 64 20 61 20 74  f it is, and a t
23c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 75  ransaction is cu
23d0: 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 70 65 6e 65  rrently.** opene
23e0: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2c 20 74  d on the file, t
23f0: 68 65 6e 20 64 69 73 63 61 72 64 20 61 6c 6c 20  hen discard all 
2400: 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6c 61  transaction rela
2410: 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61  ted data..*/.sta
2420: 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 54 72  tic void closeTr
2430: 61 6e 73 61 63 74 69 6f 6e 28 6a 74 5f 66 69 6c  ansaction(jt_fil
2440: 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
2450: 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 2d  BitvecDestroy(p-
2460: 3e 70 57 72 69 74 61 62 6c 65 29 3b 0a 20 20 73  >pWritable);.  s
2470: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
2480: 43 6b 73 75 6d 29 3b 0a 20 20 70 2d 3e 70 57 72  Cksum);.  p->pWr
2490: 69 74 61 62 6c 65 20 3d 20 30 3b 0a 20 20 70 2d  itable = 0;.  p-
24a0: 3e 61 43 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 70  >aCksum = 0;.  p
24b0: 2d 3e 6e 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a  ->nSync = 0;.}..
24c0: 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6a  /*.** Close an j
24d0: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
24e0: 63 20 69 6e 74 20 6a 74 43 6c 6f 73 65 28 73 71  c int jtClose(sq
24f0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
2500: 65 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 2a  e){.  jt_file **
2510: 70 70 3b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70  pp;.  jt_file *p
2520: 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46   = (jt_file *)pF
2530: 69 6c 65 3b 0a 0a 20 20 63 6c 6f 73 65 54 72 61  ile;..  closeTra
2540: 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20 65  nsaction(p);.  e
2550: 6e 74 65 72 4a 74 4d 75 74 65 78 28 29 3b 0a 20  nterJtMutex();. 
2560: 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 20 29 7b   if( p->zName ){
2570: 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 67 2e 70  .    for(pp=&g.p
2580: 4c 69 73 74 3b 20 2a 70 70 21 3d 70 3b 20 70 70  List; *pp!=p; pp
2590: 3d 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29 3b  =&(*pp)->pNext);
25a0: 0a 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70 4e  .    *pp = p->pN
25b0: 65 78 74 3b 0a 20 20 7d 0a 20 20 6c 65 61 76 65  ext;.  }.  leave
25c0: 4a 74 4d 75 74 65 78 28 29 3b 0a 20 20 72 65 74  JtMutex();.  ret
25d0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  urn sqlite3OsClo
25e0: 73 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d 0a  se(p->pReal);.}.
25f0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74 61  ./*.** Read data
2600: 20 66 72 6f 6d 20 61 6e 20 6a 74 2d 66 69 6c 65   from an jt-file
2610: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2620: 6a 74 52 65 61 64 28 0a 20 20 73 71 6c 69 74 65  jtRead(.  sqlite
2630: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 0a  3_file *pFile, .
2640: 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20    void *zBuf, . 
2650: 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71   int iAmt, .  sq
2660: 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74  lite_int64 iOfst
2670: 0a 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70  .){.  jt_file *p
2680: 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46   = (jt_file *)pF
2690: 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ile;.  return sq
26a0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 2d 3e 70  lite3OsRead(p->p
26b0: 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d 74  Real, zBuf, iAmt
26c0: 2c 20 69 4f 66 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a  , iOfst);.}../*.
26d0: 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4a 6f  ** Parameter zJo
26e0: 75 72 6e 61 6c 20 69 73 20 74 68 65 20 6e 61 6d  urnal is the nam
26f0: 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  e of a journal f
2700: 69 6c 65 20 74 68 61 74 20 69 73 20 63 75 72 72  ile that is curr
2710: 65 6e 74 6c 79 20 0a 2a 2a 20 6f 70 65 6e 2e 20  ently .** open. 
2720: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6c 6f  This function lo
2730: 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72 6e  cates and return
2740: 73 20 74 68 65 20 68 61 6e 64 6c 65 20 6f 70 65  s the handle ope
2750: 6e 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63 6f  ned on the.** co
2760: 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74 61  rresponding data
2770: 62 61 73 65 20 66 69 6c 65 20 62 79 20 74 68 65  base file by the
2780: 20 70 61 67 65 72 20 74 68 61 74 20 63 75 72 72   pager that curr
2790: 65 6e 74 6c 79 20 68 61 73 20 74 68 65 0a 2a 2a  ently has the.**
27a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
27b0: 65 6e 65 64 2e 20 54 68 69 73 20 66 69 6c 65 2d  ened. This file-
27c0: 68 61 6e 64 6c 65 20 69 73 20 69 64 65 6e 74 69  handle is identi
27d0: 66 69 65 64 20 62 79 20 74 68 65 20 0a 2a 2a 20  fied by the .** 
27e0: 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65 72  following proper
27f0: 74 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29  ties:.**.**   a)
2800: 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49   SQLITE_OPEN_MAI
2810: 4e 5f 44 42 20 77 61 73 20 73 70 65 63 69 66 69  N_DB was specifi
2820: 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65  ed when the file
2830: 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a 0a   was opened..**.
2840: 2a 2a 20 20 20 62 29 20 54 68 65 20 66 69 6c 65  **   b) The file
2850: 2d 6e 61 6d 65 20 73 70 65 63 69 66 69 65 64 20  -name specified 
2860: 77 68 65 6e 20 74 68 65 20 66 69 6c 65 20 77 61  when the file wa
2870: 73 20 6f 70 65 6e 65 64 20 6d 61 74 63 68 65 73  s opened matches
2880: 0a 2a 2a 20 20 20 20 20 20 61 6c 6c 20 62 75 74  .**      all but
2890: 20 74 68 65 20 66 69 6e 61 6c 20 38 20 63 68 61   the final 8 cha
28a0: 72 61 63 74 65 72 73 20 6f 66 20 74 68 65 20 6a  racters of the j
28b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
28c0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 63 29 20 54 68 65  ..**.**   c) The
28d0: 72 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  re is currently 
28e0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
28f0: 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 2f  on the file..**/
2900: 0a 73 74 61 74 69 63 20 6a 74 5f 66 69 6c 65 20  .static jt_file 
2910: 2a 6c 6f 63 61 74 65 44 61 74 61 62 61 73 65 48  *locateDatabaseH
2920: 61 6e 64 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  andle(const char
2930: 20 2a 7a 4a 6f 75 72 6e 61 6c 29 7b 0a 20 20 6a   *zJournal){.  j
2940: 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 20 3d 20  t_file *pMain = 
2950: 30 3b 0a 20 20 65 6e 74 65 72 4a 74 4d 75 74 65  0;.  enterJtMute
2960: 78 28 29 3b 0a 20 20 66 6f 72 28 70 4d 61 69 6e  x();.  for(pMain
2970: 3d 67 2e 70 4c 69 73 74 3b 20 70 4d 61 69 6e 3b  =g.pList; pMain;
2980: 20 70 4d 61 69 6e 3d 70 4d 61 69 6e 2d 3e 70 4e   pMain=pMain->pN
2990: 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e 4e  ext){.    int nN
29a0: 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4a 6f  ame = strlen(zJo
29b0: 75 72 6e 61 6c 29 20 2d 20 73 74 72 6c 65 6e 28  urnal) - strlen(
29c0: 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20 20  "-journal");.   
29d0: 20 69 66 28 20 28 70 4d 61 69 6e 2d 3e 66 6c 61   if( (pMain->fla
29e0: 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  gs&SQLITE_OPEN_M
29f0: 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 26 26 20  AIN_DB).     && 
2a00: 28 73 74 72 6c 65 6e 28 70 4d 61 69 6e 2d 3e 7a  (strlen(pMain->z
2a10: 4e 61 6d 65 29 3d 3d 6e 4e 61 6d 65 29 0a 20 20  Name)==nName).  
2a20: 20 20 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70 28     && 0==memcmp(
2a30: 70 4d 61 69 6e 2d 3e 7a 4e 61 6d 65 2c 20 7a 4a  pMain->zName, zJ
2a40: 6f 75 72 6e 61 6c 2c 20 6e 4e 61 6d 65 29 0a 20  ournal, nName). 
2a50: 20 20 20 20 26 26 20 28 70 4d 61 69 6e 2d 3e 65      && (pMain->e
2a60: 4c 6f 63 6b 3e 3d 53 51 4c 49 54 45 5f 4c 4f 43  Lock>=SQLITE_LOC
2a70: 4b 5f 52 45 53 45 52 56 45 44 29 0a 20 20 20 20  K_RESERVED).    
2a80: 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  ){.      break;.
2a90: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 61 76      }.  }.  leav
2aa0: 65 4a 74 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  eJtMutex();.  re
2ab0: 74 75 72 6e 20 70 4d 61 69 6e 3b 0a 7d 0a 0a 2f  turn pMain;.}../
2ac0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a  *.** Parameter z
2ad0: 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75 66   points to a buf
2ae0: 66 65 72 20 6f 66 20 34 20 62 79 74 65 73 20 69  fer of 4 bytes i
2af0: 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69 6e  n size containin
2b00: 67 20 61 20 0a 2a 2a 20 75 6e 73 69 67 6e 65 64  g a .** unsigned
2b10: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
2b20: 73 74 6f 72 65 64 20 69 6e 20 62 69 67 2d 65 6e  stored in big-en
2b30: 64 69 61 6e 20 66 6f 72 6d 61 74 2e 20 44 65 63  dian format. Dec
2b40: 6f 64 65 20 74 68 65 20 0a 2a 2a 20 69 6e 74 65  ode the .** inte
2b50: 67 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20 69  ger and return i
2b60: 74 73 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  ts value..*/.sta
2b70: 74 69 63 20 75 33 32 20 64 65 63 6f 64 65 55 69  tic u32 decodeUi
2b80: 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73 69 67  nt32(const unsig
2b90: 6e 65 64 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20  ned char *z){.  
2ba0: 72 65 74 75 72 6e 20 28 7a 5b 30 5d 3c 3c 32 34  return (z[0]<<24
2bb0: 29 20 2b 20 28 7a 5b 31 5d 3c 3c 31 36 29 20 2b  ) + (z[1]<<16) +
2bc0: 20 28 7a 5b 32 5d 3c 3c 38 29 20 2b 20 7a 5b 33   (z[2]<<8) + z[3
2bd0: 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 63  ];.}../*.** Calc
2be0: 75 6c 61 74 65 20 61 20 63 68 65 63 6b 73 75 6d  ulate a checksum
2bf0: 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65 72   from the buffer
2c00: 20 6f 66 20 6c 65 6e 67 74 68 20 6e 20 62 79 74   of length n byt
2c10: 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 0a 2a 2a  es pointed to.**
2c20: 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 7a 2e   by parameter z.
2c30: 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 67  .*/.static u32 g
2c40: 65 6e 43 6b 73 75 6d 28 63 6f 6e 73 74 20 75 6e  enCksum(const un
2c50: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c 20  signed char *z, 
2c60: 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  int n){.  int i;
2c70: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30  .  u32 cksum = 0
2c80: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
2c90: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
2ca0: 6d 20 3d 20 63 6b 73 75 6d 20 2b 20 7a 5b 69 5d  m = cksum + z[i]
2cb0: 20 2b 20 28 63 6b 73 75 6d 3c 3c 33 29 3b 0a 20   + (cksum<<3);. 
2cc0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
2cd0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  m;.}../*.** The 
2ce0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c 20  first argument, 
2cf0: 7a 42 75 66 2c 20 70 6f 69 6e 74 73 20 74 6f 20  zBuf, points to 
2d00: 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
2d10: 69 6e 67 20 61 20 32 38 20 62 79 74 65 0a 2a 2a  ing a 28 byte.**
2d20: 20 73 65 72 69 61 6c 69 7a 65 64 20 6a 6f 75 72   serialized jour
2d30: 6e 61 6c 20 68 65 61 64 65 72 2e 20 54 68 69 73  nal header. This
2d40: 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72 69   function deseri
2d50: 61 6c 69 7a 65 73 20 66 6f 75 72 20 6f 66 20 74  alizes four of t
2d60: 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 66 69  he.** integer fi
2d70: 65 6c 64 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  elds contained i
2d80: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
2d90: 61 64 65 72 20 61 6e 64 20 77 72 69 74 65 73 20  ader and writes 
2da0: 74 68 65 69 72 0a 2a 2a 20 76 61 6c 75 65 73 20  their.** values 
2db0: 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 76 61  to the output va
2dc0: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53  riables..**.** S
2dd0: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
2de0: 72 6e 65 64 20 69 66 20 74 68 65 20 6a 6f 75 72  rned if the jour
2df0: 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 73 75  nal-header is su
2e00: 63 63 65 73 73 66 75 6c 6c 79 20 0a 2a 2a 20 64  ccessfully .** d
2e10: 65 63 6f 64 65 64 2e 20 4f 74 68 65 72 77 69 73  ecoded. Otherwis
2e20: 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e  e, SQLITE_ERROR.
2e30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
2e40: 65 63 6f 64 65 4a 6f 75 72 6e 61 6c 48 64 72 28  ecodeJournalHdr(
2e50: 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  .  const unsigne
2e60: 64 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 20 20  d char *zBuf,   
2e70: 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 3a 20        /* Input: 
2e80: 32 38 20 62 79 74 65 20 6a 6f 75 72 6e 61 6c 20  28 byte journal 
2e90: 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  header */.  u32 
2ea0: 2a 70 6e 52 65 63 2c 20 20 20 20 20 20 20 20 20  *pnRec,         
2eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ec0: 2a 20 4f 75 74 3a 20 4e 75 6d 62 65 72 20 6f 66  * Out: Number of
2ed0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 72 65 63 6f   journalled reco
2ee0: 72 64 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70 6e  rds */.  u32 *pn
2ef0: 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20 20  Page,           
2f00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
2f10: 75 74 3a 20 4f 72 69 67 69 6e 61 6c 20 64 61 74  ut: Original dat
2f20: 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
2f30: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 53 65 63   */.  u32 *pnSec
2f40: 74 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  tor,            
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 3a           /* Out:
2f60: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 69 6e 20   Sector size in 
2f70: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a  bytes */.  u32 *
2f80: 70 6e 50 61 67 65 73 69 7a 65 20 20 20 20 20 20  pnPagesize      
2f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fa0: 20 4f 75 74 3a 20 50 61 67 65 20 73 69 7a 65 20   Out: Page size 
2fb0: 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a 20  in bytes */.){. 
2fc0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
2fd0: 4d 61 67 69 63 5b 5d 20 3d 20 7b 20 30 78 64 39  Magic[] = { 0xd9
2fe0: 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30 78  , 0xd5, 0x05, 0x
2ff0: 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c 20  f9, 0x20, 0xa1, 
3000: 30 78 36 33 2c 20 30 78 64 37 20 7d 3b 0a 20 20  0x63, 0xd7 };.  
3010: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
3020: 63 2c 20 7a 42 75 66 2c 20 38 29 20 29 20 72 65  c, zBuf, 8) ) re
3030: 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
3040: 52 3b 0a 20 20 69 66 28 20 70 6e 52 65 63 20 29  R;.  if( pnRec )
3050: 20 2a 70 6e 52 65 63 20 3d 20 64 65 63 6f 64 65   *pnRec = decode
3060: 55 69 6e 74 33 32 28 26 7a 42 75 66 5b 38 5d 29  Uint32(&zBuf[8])
3070: 3b 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29  ;.  if( pnPage )
3080: 20 2a 70 6e 50 61 67 65 20 3d 20 64 65 63 6f 64   *pnPage = decod
3090: 65 55 69 6e 74 33 32 28 26 7a 42 75 66 5b 31 36  eUint32(&zBuf[16
30a0: 5d 29 3b 0a 20 20 69 66 28 20 70 6e 53 65 63 74  ]);.  if( pnSect
30b0: 6f 72 20 29 20 2a 70 6e 53 65 63 74 6f 72 20 3d  or ) *pnSector =
30c0: 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28 26 7a   decodeUint32(&z
30d0: 42 75 66 5b 32 30 5d 29 3b 0a 20 20 69 66 28 20  Buf[20]);.  if( 
30e0: 70 6e 50 61 67 65 73 69 7a 65 20 29 20 2a 70 6e  pnPagesize ) *pn
30f0: 50 61 67 65 73 69 7a 65 20 3d 20 64 65 63 6f 64  Pagesize = decod
3100: 65 55 69 6e 74 33 32 28 26 7a 42 75 66 5b 32 34  eUint32(&zBuf[24
3110: 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ]);.  return SQL
3120: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
3130: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
3140: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 20  s called when a 
3150: 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  new transaction 
3160: 69 73 20 6f 70 65 6e 65 64 2c 20 6a 75 73 74 20  is opened, just 
3170: 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 66 69 72  after.** the fir
3180: 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65  st journal-heade
3190: 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  r is written to 
31a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
31b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
31c0: 6f 70 65 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  openTransaction(
31d0: 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 2c 20  jt_file *pMain, 
31e0: 6a 74 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61  jt_file *pJourna
31f0: 6c 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  l){.  unsigned c
3200: 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 73 71  har *aData;.  sq
3210: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 20 3d 20  lite3_file *p = 
3220: 70 4d 61 69 6e 2d 3e 70 52 65 61 6c 3b 0a 20 20  pMain->pReal;.  
3230: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
3240: 4f 4b 3b 0a 0a 20 20 63 6c 6f 73 65 54 72 61 6e  OK;..  closeTran
3250: 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e 29 3b 0a  saction(pMain);.
3260: 20 20 61 44 61 74 61 20 3d 20 73 71 6c 69 74 65    aData = sqlite
3270: 33 5f 6d 61 6c 6c 6f 63 28 70 4d 61 69 6e 2d 3e  3_malloc(pMain->
3280: 6e 50 61 67 65 73 69 7a 65 29 3b 0a 20 20 70 4d  nPagesize);.  pM
3290: 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65 20 3d  ain->pWritable =
32a0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
32b0: 65 61 74 65 28 70 4d 61 69 6e 2d 3e 6e 50 61 67  eate(pMain->nPag
32c0: 65 29 3b 0a 20 20 70 4d 61 69 6e 2d 3e 61 43 6b  e);.  pMain->aCk
32d0: 73 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  sum = sqlite3_ma
32e0: 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 75 33 32 29  lloc(sizeof(u32)
32f0: 20 2a 20 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65   * (pMain->nPage
3300: 20 2b 20 31 29 29 3b 0a 20 20 70 4a 6f 75 72 6e   + 1));.  pJourn
3310: 61 6c 2d 3e 69 4d 61 78 4f 66 66 20 3d 20 30 3b  al->iMaxOff = 0;
3320: 0a 0a 20 20 69 66 28 20 21 70 4d 61 69 6e 2d 3e  ..  if( !pMain->
3330: 70 57 72 69 74 61 62 6c 65 20 7c 7c 20 21 70 4d  pWritable || !pM
3340: 61 69 6e 2d 3e 61 43 6b 73 75 6d 20 7c 7c 20 21  ain->aCksum || !
3350: 61 44 61 74 61 20 29 7b 0a 20 20 20 20 72 63 20  aData ){.    rc 
3360: 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e  = SQLITE_IOERR_N
3370: 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73 65 20 69 66  OMEM;.  }else if
3380: 28 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 3e 30  ( pMain->nPage>0
3390: 20 29 7b 0a 20 20 20 20 75 33 32 20 69 54 72 75   ){.    u32 iTru
33a0: 6e 6b 3b 0a 20 20 20 20 69 6e 74 20 69 53 61 76  nk;.    int iSav
33b0: 65 3b 0a 20 20 20 20 69 6e 74 20 69 53 61 76 65  e;.    int iSave
33c0: 32 3b 0a 0a 20 20 20 20 73 74 6f 70 5f 69 6f 65  2;..    stop_ioe
33d0: 72 72 5f 73 69 6d 75 6c 61 74 69 6f 6e 28 26 69  rr_simulation(&i
33e0: 53 61 76 65 2c 20 26 69 53 61 76 65 32 29 3b 0a  Save, &iSave2);.
33f0: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
3400: 20 64 61 74 61 62 61 73 65 20 66 72 65 65 2d 6c   database free-l
3410: 69 73 74 2e 20 41 64 64 20 74 68 65 20 70 61 67  ist. Add the pag
3420: 65 2d 6e 75 6d 62 65 72 20 66 6f 72 20 65 61 63  e-number for eac
3430: 68 20 66 72 65 65 2d 6c 69 73 74 0a 20 20 20 20  h free-list.    
3440: 2a 2a 20 6c 65 61 66 20 74 6f 20 74 68 65 20 6a  ** leaf to the j
3450: 74 5f 66 69 6c 65 2e 70 57 72 69 74 61 62 6c 65  t_file.pWritable
3460: 20 62 69 74 76 65 63 2e 0a 20 20 20 20 2a 2f 0a   bitvec..    */.
3470: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3480: 4f 73 52 65 61 64 28 70 2c 20 61 44 61 74 61 2c  OsRead(p, aData,
3490: 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a   pMain->nPagesiz
34a0: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  e, 0);.    if( r
34b0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
34c0: 20 20 20 20 20 20 75 33 32 20 6e 44 62 73 69 7a        u32 nDbsiz
34d0: 65 20 3d 20 64 65 63 6f 64 65 55 69 6e 74 33 32  e = decodeUint32
34e0: 28 26 61 44 61 74 61 5b 32 38 5d 29 3b 0a 20 20  (&aData[28]);.  
34f0: 20 20 20 20 69 66 28 20 6e 44 62 73 69 7a 65 3e      if( nDbsize>
3500: 30 20 26 26 20 6d 65 6d 63 6d 70 28 26 61 44 61  0 && memcmp(&aDa
3510: 74 61 5b 32 34 5d 2c 20 26 61 44 61 74 61 5b 39  ta[24], &aData[9
3520: 32 5d 2c 20 34 29 3d 3d 30 20 29 7b 0a 20 20 20  2], 4)==0 ){.   
3530: 20 20 20 20 20 75 33 32 20 69 50 67 3b 0a 20 20       u32 iPg;.  
3540: 20 20 20 20 20 20 66 6f 72 28 69 50 67 3d 6e 44        for(iPg=nD
3550: 62 73 69 7a 65 2b 31 3b 20 69 50 67 3c 3d 70 4d  bsize+1; iPg<=pM
3560: 61 69 6e 2d 3e 6e 50 61 67 65 3b 20 69 50 67 2b  ain->nPage; iPg+
3570: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
3580: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
3590: 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65 2c  Main->pWritable,
35a0: 20 69 50 67 29 3b 0a 20 20 20 20 20 20 20 20 7d   iPg);.        }
35b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35c0: 20 20 20 69 54 72 75 6e 6b 20 3d 20 64 65 63 6f     iTrunk = deco
35d0: 64 65 55 69 6e 74 33 32 28 26 61 44 61 74 61 5b  deUint32(&aData[
35e0: 33 32 5d 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  32]);.    while(
35f0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
3600: 26 20 69 54 72 75 6e 6b 3e 30 20 29 7b 0a 20 20  & iTrunk>0 ){.  
3610: 20 20 20 20 75 33 32 20 6e 4c 65 61 66 3b 0a 20      u32 nLeaf;. 
3620: 20 20 20 20 20 75 33 32 20 69 4c 65 61 66 3b 0a       u32 iLeaf;.
3630: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e        sqlite3_in
3640: 74 36 34 20 69 4f 66 66 20 3d 20 28 69 54 72 75  t64 iOff = (iTru
3650: 6e 6b 2d 31 29 2a 70 4d 61 69 6e 2d 3e 6e 50 61  nk-1)*pMain->nPa
3660: 67 65 73 69 7a 65 3b 0a 20 20 20 20 20 20 72 63  gesize;.      rc
3670: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
3680: 28 70 2c 20 61 44 61 74 61 2c 20 70 4d 61 69 6e  (p, aData, pMain
3690: 2d 3e 6e 50 61 67 65 73 69 7a 65 2c 20 69 4f 66  ->nPagesize, iOf
36a0: 66 29 3b 0a 20 20 20 20 20 20 6e 4c 65 61 66 20  f);.      nLeaf 
36b0: 3d 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28 26  = decodeUint32(&
36c0: 61 44 61 74 61 5b 34 5d 29 3b 0a 20 20 20 20 20  aData[4]);.     
36d0: 20 66 6f 72 28 69 4c 65 61 66 3d 30 3b 20 72 63   for(iLeaf=0; rc
36e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
36f0: 4c 65 61 66 3c 6e 4c 65 61 66 3b 20 69 4c 65 61  Leaf<nLeaf; iLea
3700: 66 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 33  f++){.        u3
3710: 32 20 70 67 6e 6f 20 3d 20 64 65 63 6f 64 65 55  2 pgno = decodeU
3720: 69 6e 74 33 32 28 26 61 44 61 74 61 5b 38 2b 34  int32(&aData[8+4
3730: 2a 69 4c 65 61 66 5d 29 3b 0a 20 20 20 20 20 20  *iLeaf]);.      
3740: 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53    sqlite3BitvecS
3750: 65 74 28 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61  et(pMain->pWrita
3760: 62 6c 65 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20  ble, pgno);.    
3770: 20 20 7d 0a 20 20 20 20 20 20 69 54 72 75 6e 6b    }.      iTrunk
3780: 20 3d 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28   = decodeUint32(
3790: 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 0a 20  aData);.    }.. 
37a0: 20 20 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20     /* Calculate 
37b0: 61 6e 64 20 73 74 6f 72 65 20 61 20 63 68 65 63  and store a chec
37c0: 6b 73 75 6d 20 66 6f 72 20 65 61 63 68 20 70 61  ksum for each pa
37d0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
37e0: 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
37f0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
3800: 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  K ){.      int i
3810: 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  i;.      for(ii=
3820: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
3830: 20 26 26 20 69 69 3c 70 4d 61 69 6e 2d 3e 6e 50   && ii<pMain->nP
3840: 61 67 65 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  age; ii++){.    
3850: 20 20 20 20 69 36 34 20 69 4f 66 66 20 3d 20 28      i64 iOff = (
3860: 69 36 34 29 28 70 4d 61 69 6e 2d 3e 6e 50 61 67  i64)(pMain->nPag
3870: 65 73 69 7a 65 29 20 2a 20 28 69 36 34 29 69 69  esize) * (i64)ii
3880: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 4f  ;.        if( iO
3890: 66 66 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45  ff==PENDING_BYTE
38a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
38b0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
38c0: 33 4f 73 52 65 61 64 28 70 4d 61 69 6e 2d 3e 70  3OsRead(pMain->p
38d0: 52 65 61 6c 2c 20 61 44 61 74 61 2c 20 70 4d 61  Real, aData, pMa
38e0: 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 2c 20 69  in->nPagesize, i
38f0: 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 70 4d  Off);.        pM
3900: 61 69 6e 2d 3e 61 43 6b 73 75 6d 5b 69 69 5d 20  ain->aCksum[ii] 
3910: 3d 20 67 65 6e 43 6b 73 75 6d 28 61 44 61 74 61  = genCksum(aData
3920: 2c 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69  , pMain->nPagesi
3930: 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ze);.      }.   
3940: 20 7d 0a 0a 20 20 20 20 73 74 61 72 74 5f 69 6f   }..    start_io
3950: 65 72 72 5f 73 69 6d 75 6c 61 74 69 6f 6e 28 69  err_simulation(i
3960: 53 61 76 65 2c 20 69 53 61 76 65 32 29 3b 0a 20  Save, iSave2);. 
3970: 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   }..  sqlite3_fr
3980: 65 65 28 61 44 61 74 61 29 3b 0a 20 20 72 65 74  ee(aData);.  ret
3990: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
39a0: 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d   The first argum
39b0: 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63  ent to this func
39c0: 74 69 6f 6e 20 69 73 20 61 20 68 61 6e 64 6c 65  tion is a handle
39d0: 20 6f 70 65 6e 20 6f 6e 20 61 20 6a 6f 75 72 6e   open on a journ
39e0: 61 6c 20 66 69 6c 65 2e 0a 2a 2a 20 54 68 69 73  al file..** This
39f0: 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
3a00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3a10: 20 61 6e 64 20 61 64 64 73 20 74 68 65 20 70 61   and adds the pa
3a20: 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 65 61  ge number for ea
3a30: 63 68 0a 2a 2a 20 70 61 67 65 20 69 6e 20 74 68  ch.** page in th
3a40: 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 74 68 65  e journal to the
3a50: 20 42 69 74 76 65 63 20 6f 62 6a 65 63 74 20 70   Bitvec object p
3a60: 61 73 73 65 64 20 61 73 20 74 68 65 20 73 65 63  assed as the sec
3a70: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ond argument..*/
3a80: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
3a90: 4a 6f 75 72 6e 61 6c 46 69 6c 65 28 6a 74 5f 66  JournalFile(jt_f
3aa0: 69 6c 65 20 2a 70 2c 20 6a 74 5f 66 69 6c 65 20  ile *p, jt_file 
3ab0: 2a 70 4d 61 69 6e 29 7b 0a 20 20 69 6e 74 20 72  *pMain){.  int r
3ac0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
3ad0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 7a   unsigned char z
3ae0: 42 75 66 5b 32 38 5d 3b 0a 20 20 73 71 6c 69 74  Buf[28];.  sqlit
3af0: 65 33 5f 66 69 6c 65 20 2a 70 52 65 61 6c 20 3d  e3_file *pReal =
3b00: 20 70 2d 3e 70 52 65 61 6c 3b 0a 20 20 73 71 6c   p->pReal;.  sql
3b10: 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 20  ite3_int64 iOff 
3b20: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
3b30: 6e 74 36 34 20 69 53 69 7a 65 20 3d 20 70 2d 3e  nt64 iSize = p->
3b40: 69 4d 61 78 4f 66 66 3b 0a 20 20 75 6e 73 69 67  iMaxOff;.  unsig
3b50: 6e 65 64 20 63 68 61 72 20 2a 61 50 61 67 65 3b  ned char *aPage;
3b60: 0a 20 20 69 6e 74 20 69 53 61 76 65 3b 0a 20 20  .  int iSave;.  
3b70: 69 6e 74 20 69 53 61 76 65 32 3b 0a 0a 20 20 61  int iSave2;..  a
3b80: 50 61 67 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Page = sqlite3_m
3b90: 61 6c 6c 6f 63 28 70 4d 61 69 6e 2d 3e 6e 50 61  alloc(pMain->nPa
3ba0: 67 65 73 69 7a 65 29 3b 0a 20 20 69 66 28 20 21  gesize);.  if( !
3bb0: 61 50 61 67 65 20 29 7b 0a 20 20 20 20 72 65 74  aPage ){.    ret
3bc0: 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
3bd0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73  _NOMEM;.  }..  s
3be0: 74 6f 70 5f 69 6f 65 72 72 5f 73 69 6d 75 6c 61  top_ioerr_simula
3bf0: 74 69 6f 6e 28 26 69 53 61 76 65 2c 20 26 69 53  tion(&iSave, &iS
3c00: 61 76 65 32 29 3b 0a 0a 20 20 77 68 69 6c 65 28  ave2);..  while(
3c10: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
3c20: 26 20 69 4f 66 66 3c 69 53 69 7a 65 20 29 7b 0a  & iOff<iSize ){.
3c30: 20 20 20 20 75 33 32 20 6e 52 65 63 2c 20 6e 50      u32 nRec, nP
3c40: 61 67 65 2c 20 6e 53 65 63 74 6f 72 2c 20 6e 50  age, nSector, nP
3c50: 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 75 33 32  agesize;.    u32
3c60: 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61   ii;..    /* Rea
3c70: 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74 68 65  d and decode the
3c80: 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 2d 68 65   next journal-he
3c90: 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ader from the jo
3ca0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
3cb0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
3cc0: 73 52 65 61 64 28 70 52 65 61 6c 2c 20 7a 42 75  sRead(pReal, zBu
3cd0: 66 2c 20 32 38 2c 20 69 4f 66 66 29 3b 0a 20 20  f, 28, iOff);.  
3ce0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
3cf0: 5f 4f 4b 20 0a 20 20 20 20 20 7c 7c 20 64 65 63  _OK .     || dec
3d00: 6f 64 65 4a 6f 75 72 6e 61 6c 48 64 72 28 7a 42  odeJournalHdr(zB
3d10: 75 66 2c 20 26 6e 52 65 63 2c 20 26 6e 50 61 67  uf, &nRec, &nPag
3d20: 65 2c 20 26 6e 53 65 63 74 6f 72 2c 20 26 6e 50  e, &nSector, &nP
3d30: 61 67 65 73 69 7a 65 29 20 0a 20 20 20 20 29 7b  agesize) .    ){
3d40: 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69  .      goto fini
3d50: 73 68 5f 72 6a 66 3b 0a 20 20 20 20 7d 0a 20 20  sh_rjf;.    }.  
3d60: 20 20 69 4f 66 66 20 2b 3d 20 6e 53 65 63 74 6f    iOff += nSecto
3d70: 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e 52 65 63  r;..    if( nRec
3d80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
3d90: 41 20 74 72 69 63 6b 2e 20 54 68 65 72 65 20 6d  A trick. There m
3da0: 69 67 68 74 20 62 65 20 61 6e 6f 74 68 65 72 20  ight be another 
3db0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
3dc0: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 20 20 20 20  mmediately .    
3dd0: 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
3de0: 68 69 73 20 6f 6e 65 2e 20 49 6e 20 74 68 69 73  his one. In this
3df0: 20 63 61 73 65 2c 20 30 20 72 65 63 6f 72 64 73   case, 0 records
3e00: 20 6d 65 61 6e 73 20 30 20 72 65 63 6f 72 64 73   means 0 records
3e10: 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20  , .      ** not 
3e20: 22 72 65 61 64 20 75 6e 74 69 6c 20 74 68 65 20  "read until the 
3e30: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 22  end of the file"
3e40: 2e 20 53 65 65 20 61 6c 73 6f 20 74 69 63 6b 65  . See also ticke
3e50: 74 20 23 32 35 36 35 2e 0a 20 20 20 20 20 20 2a  t #2565..      *
3e60: 2f 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 7a  /.      if( iSiz
3e70: 65 3e 3d 28 69 4f 66 66 2b 6e 53 65 63 74 6f 72  e>=(iOff+nSector
3e80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
3e90: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
3ea0: 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 32 38 2c  pReal, zBuf, 28,
3eb0: 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20   iOff);.        
3ec0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
3ed0: 4b 20 7c 7c 20 30 3d 3d 64 65 63 6f 64 65 4a 6f  K || 0==decodeJo
3ee0: 75 72 6e 61 6c 48 64 72 28 7a 42 75 66 2c 20 30  urnalHdr(zBuf, 0
3ef0: 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  , 0, 0, 0) ){.  
3f00: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
3f10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3f20: 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 63 20 3d    }.      nRec =
3f30: 20 28 69 53 69 7a 65 2d 69 4f 66 66 29 20 2f 20   (iSize-iOff) / 
3f40: 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a  (pMain->nPagesiz
3f50: 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  e+8);.    }..   
3f60: 20 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65   /* Read all the
3f70: 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f   records that fo
3f80: 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72 6e 61 6c  llow the journal
3f90: 2d 68 65 61 64 65 72 20 6a 75 73 74 20 72 65 61  -header just rea
3fa0: 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69  d. */.    for(ii
3fb0: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
3fc0: 4b 20 26 26 20 69 69 3c 6e 52 65 63 20 26 26 20  K && ii<nRec && 
3fd0: 69 4f 66 66 3c 69 53 69 7a 65 3b 20 69 69 2b 2b  iOff<iSize; ii++
3fe0: 29 7b 0a 20 20 20 20 20 20 75 33 32 20 70 67 6e  ){.      u32 pgn
3ff0: 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  o;.      rc = sq
4000: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 52 65 61  lite3OsRead(pRea
4010: 6c 2c 20 7a 42 75 66 2c 20 34 2c 20 69 4f 66 66  l, zBuf, 4, iOff
4020: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
4030: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4040: 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 64 65 63        pgno = dec
4050: 6f 64 65 55 69 6e 74 33 32 28 7a 42 75 66 29 3b  odeUint32(zBuf);
4060: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
4070: 6f 3e 30 20 26 26 20 70 67 6e 6f 3c 3d 70 4d 61  o>0 && pgno<=pMa
4080: 69 6e 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20  in->nPage ){.   
4090: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71         if( 0==sq
40a0: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
40b0: 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65  pMain->pWritable
40c0: 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20  , pgno) ){.     
40d0: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
40e0: 74 65 33 4f 73 52 65 61 64 28 70 52 65 61 6c 2c  te3OsRead(pReal,
40f0: 20 61 50 61 67 65 2c 20 70 4d 61 69 6e 2d 3e 6e   aPage, pMain->n
4100: 50 61 67 65 73 69 7a 65 2c 20 69 4f 66 66 2b 34  Pagesize, iOff+4
4110: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
4120: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
4130: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4140: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 67 65    u32 cksum = ge
4150: 6e 43 6b 73 75 6d 28 61 50 61 67 65 2c 20 70 4d  nCksum(aPage, pM
4160: 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 29 3b  ain->nPagesize);
4170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
4180: 73 73 65 72 74 28 20 63 6b 73 75 6d 3d 3d 70 4d  ssert( cksum==pM
4190: 61 69 6e 2d 3e 61 43 6b 73 75 6d 5b 70 67 6e 6f  ain->aCksum[pgno
41a0: 2d 31 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20  -1] );.         
41b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
41c0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
41d0: 65 33 42 69 74 76 65 63 53 65 74 28 70 4d 61 69  e3BitvecSet(pMai
41e0: 6e 2d 3e 70 57 72 69 74 61 62 6c 65 2c 20 70 67  n->pWritable, pg
41f0: 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  no);.        }. 
4200: 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 28         iOff += (
4210: 38 20 2b 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65  8 + pMain->nPage
4220: 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  size);.      }. 
4230: 20 20 20 7d 0a 0a 20 20 20 20 69 4f 66 66 20 3d     }..    iOff =
4240: 20 28 28 69 4f 66 66 20 2b 20 28 6e 53 65 63 74   ((iOff + (nSect
4250: 6f 72 2d 31 29 29 20 2f 20 6e 53 65 63 74 6f 72  or-1)) / nSector
4260: 29 20 2a 20 6e 53 65 63 74 6f 72 3b 0a 20 20 7d  ) * nSector;.  }
4270: 0a 0a 66 69 6e 69 73 68 5f 72 6a 66 3a 0a 20 20  ..finish_rjf:.  
4280: 73 74 61 72 74 5f 69 6f 65 72 72 5f 73 69 6d 75  start_ioerr_simu
4290: 6c 61 74 69 6f 6e 28 69 53 61 76 65 2c 20 69 53  lation(iSave, iS
42a0: 61 76 65 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  ave2);.  sqlite3
42b0: 5f 66 72 65 65 28 61 50 61 67 65 29 3b 0a 20 20  _free(aPage);.  
42c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
42d0: 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
42e0: 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
42f0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
4300: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4310: 20 57 72 69 74 65 20 64 61 74 61 20 74 6f 20 61   Write data to a
4320: 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  n jt-file..*/.st
4330: 61 74 69 63 20 69 6e 74 20 6a 74 57 72 69 74 65  atic int jtWrite
4340: 28 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  (.  sqlite3_file
4350: 20 2a 70 46 69 6c 65 2c 20 0a 20 20 63 6f 6e 73   *pFile, .  cons
4360: 74 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20  t void *zBuf, . 
4370: 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71   int iAmt, .  sq
4380: 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74  lite_int64 iOfst
4390: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
43a0: 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74  jt_file *p = (jt
43b0: 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
43c0: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 53 51   if( p->flags&SQ
43d0: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
43e0: 4f 55 52 4e 41 4c 20 29 7b 0a 20 20 20 20 69 66  OURNAL ){.    if
43f0: 28 20 69 4f 66 73 74 3d 3d 30 20 29 7b 0a 20 20  ( iOfst==0 ){.  
4400: 20 20 20 20 6a 74 5f 66 69 6c 65 20 2a 70 4d 61      jt_file *pMa
4410: 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61 74 61 62  in = locateDatab
4420: 61 73 65 48 61 6e 64 6c 65 28 70 2d 3e 7a 4e 61  aseHandle(p->zNa
4430: 6d 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  me);.      asser
4440: 74 28 20 70 4d 61 69 6e 20 29 3b 0a 20 20 0a 20  t( pMain );.  . 
4450: 20 20 20 20 20 69 66 28 20 69 41 6d 74 3d 3d 32       if( iAmt==2
4460: 38 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  8 ){.        /* 
4470: 5a 65 72 6f 69 6e 67 20 74 68 65 20 66 69 72 73  Zeroing the firs
4480: 74 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 68  t journal-file h
4490: 65 61 64 65 72 2e 20 54 68 69 73 20 69 73 20 74  eader. This is t
44a0: 68 65 20 65 6e 64 20 6f 66 20 61 0a 20 20 20 20  he end of a.    
44b0: 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
44c0: 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  on. */.        c
44d0: 6c 6f 73 65 54 72 61 6e 73 61 63 74 69 6f 6e 28  loseTransaction(
44e0: 70 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20 7d 65  pMain);.      }e
44f0: 6c 73 65 20 69 66 28 20 69 41 6d 74 21 3d 31 32  lse if( iAmt!=12
4500: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
4510: 72 69 74 69 6e 67 20 74 68 65 20 66 69 72 73 74  riting the first
4520: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
4530: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
4540: 65 2e 20 54 68 69 73 20 68 61 70 70 65 6e 73 0a  e. This happens.
4550: 20 20 20 20 20 20 20 20 2a 2a 20 77 68 65 6e 20          ** when 
4560: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
4570: 20 66 69 72 73 74 20 73 74 61 72 74 65 64 2e 20   first started. 
4580: 20 2a 2f 0a 20 20 20 20 20 20 20 20 75 38 20 2a   */.        u8 *
4590: 7a 20 3d 20 28 75 38 20 2a 29 7a 42 75 66 3b 0a  z = (u8 *)zBuf;.
45a0: 20 20 20 20 20 20 20 20 70 4d 61 69 6e 2d 3e 6e          pMain->n
45b0: 50 61 67 65 20 3d 20 64 65 63 6f 64 65 55 69 6e  Page = decodeUin
45c0: 74 33 32 28 26 7a 5b 31 36 5d 29 3b 0a 20 20 20  t32(&z[16]);.   
45d0: 20 20 20 20 20 70 4d 61 69 6e 2d 3e 6e 50 61 67       pMain->nPag
45e0: 65 73 69 7a 65 20 3d 20 64 65 63 6f 64 65 55 69  esize = decodeUi
45f0: 6e 74 33 32 28 26 7a 5b 32 34 5d 29 3b 0a 20 20  nt32(&z[24]);.  
4600: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
4610: 5f 4f 4b 21 3d 28 72 63 3d 6f 70 65 6e 54 72 61  _OK!=(rc=openTra
4620: 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e 2c 20  nsaction(pMain, 
4630: 70 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p)) ){.         
4640: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
4650: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
4660: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69    }.    if( p->i
4670: 4d 61 78 4f 66 66 3c 28 69 4f 66 73 74 20 2b 20  MaxOff<(iOfst + 
4680: 69 41 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 70  iAmt) ){.      p
4690: 2d 3e 69 4d 61 78 4f 66 66 20 3d 20 69 4f 66 73  ->iMaxOff = iOfs
46a0: 74 20 2b 20 69 41 6d 74 3b 0a 20 20 20 20 7d 0a  t + iAmt;.    }.
46b0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c    }..  if( p->fl
46c0: 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
46d0: 4d 41 49 4e 5f 44 42 20 26 26 20 70 2d 3e 70 57  MAIN_DB && p->pW
46e0: 72 69 74 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  ritable ){.    i
46f0: 66 28 20 69 41 6d 74 3c 70 2d 3e 6e 50 61 67 65  f( iAmt<p->nPage
4700: 73 69 7a 65 20 0a 20 20 20 20 20 26 26 20 70 2d  size .     && p-
4710: 3e 6e 50 61 67 65 73 69 7a 65 25 69 41 6d 74 3d  >nPagesize%iAmt=
4720: 3d 30 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73  =0 .     && iOfs
4730: 74 3e 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  t>=(PENDING_BYTE
4740: 2b 35 31 32 29 20 0a 20 20 20 20 20 26 26 20 69  +512) .     && i
4750: 4f 66 73 74 2b 69 41 6d 74 3c 3d 50 45 4e 44 49  Ofst+iAmt<=PENDI
4760: 4e 47 5f 42 59 54 45 2b 70 2d 3e 6e 50 61 67 65  NG_BYTE+p->nPage
4770: 73 69 7a 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  size.    ){.    
4780: 20 20 2f 2a 20 4e 6f 2d 6f 70 2e 20 54 68 69 73    /* No-op. This
4790: 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 73   special case is
47a0: 20 68 69 74 20 77 68 65 6e 20 74 68 65 20 62 61   hit when the ba
47b0: 63 6b 75 70 20 63 6f 64 65 20 69 73 20 63 6f 70  ckup code is cop
47c0: 79 69 6e 67 20 61 0a 20 20 20 20 20 20 2a 2a 20  ying a.      ** 
47d0: 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 77 69  to a database wi
47e0: 74 68 20 61 20 6c 61 72 67 65 72 20 70 61 67 65  th a larger page
47f0: 2d 73 69 7a 65 20 74 68 61 6e 20 74 68 65 20 73  -size than the s
4800: 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 61  ource database a
4810: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6e  nd.      ** it n
4820: 65 65 64 73 20 74 6f 20 66 69 6c 6c 20 69 6e 20  eeds to fill in 
4830: 74 68 65 20 6e 6f 6e 2d 6c 6f 63 6b 69 6e 67 2d  the non-locking-
4840: 72 65 67 69 6f 6e 20 70 61 72 74 20 6f 66 20 74  region part of t
4850: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 20 20  he original.    
4860: 20 20 2a 2a 20 70 65 6e 64 69 6e 67 2d 62 79 74    ** pending-byt
4870: 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f  e page..      */
4880: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
4890: 20 20 75 33 32 20 70 67 6e 6f 20 3d 20 69 4f 66    u32 pgno = iOf
48a0: 73 74 2f 70 2d 3e 6e 50 61 67 65 73 69 7a 65 20  st/p->nPagesize 
48b0: 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  + 1;.      asser
48c0: 74 28 20 28 69 41 6d 74 3d 3d 31 7c 7c 69 41 6d  t( (iAmt==1||iAm
48d0: 74 3d 3d 70 2d 3e 6e 50 61 67 65 73 69 7a 65 29  t==p->nPagesize)
48e0: 20 26 26 20 28 28 69 4f 66 73 74 2b 69 41 6d 74   && ((iOfst+iAmt
48f0: 29 25 70 2d 3e 6e 50 61 67 65 73 69 7a 65 29 3d  )%p->nPagesize)=
4900: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
4910: 72 74 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 50 61  rt( pgno<=p->nPa
4920: 67 65 20 7c 7c 20 70 2d 3e 6e 53 79 6e 63 3e 30  ge || p->nSync>0
4930: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
4940: 28 20 70 67 6e 6f 3e 70 2d 3e 6e 50 61 67 65 20  ( pgno>p->nPage 
4950: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
4960: 54 65 73 74 28 70 2d 3e 70 57 72 69 74 61 62 6c  Test(p->pWritabl
4970: 65 2c 20 70 67 6e 6f 29 20 29 3b 0a 20 20 20 20  e, pgno) );.    
4980: 7d 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71  }.  }..  rc = sq
4990: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 2d 3e  lite3OsWrite(p->
49a0: 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d  pReal, zBuf, iAm
49b0: 74 2c 20 69 4f 66 73 74 29 3b 0a 20 20 69 66 28  t, iOfst);.  if(
49c0: 20 28 70 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54   (p->flags&SQLIT
49d0: 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
49e0: 4e 41 4c 29 20 26 26 20 69 41 6d 74 3d 3d 31 32  NAL) && iAmt==12
49f0: 20 29 7b 0a 20 20 20 20 6a 74 5f 66 69 6c 65 20   ){.    jt_file 
4a00: 2a 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65 44  *pMain = locateD
4a10: 61 74 61 62 61 73 65 48 61 6e 64 6c 65 28 70 2d  atabaseHandle(p-
4a20: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 69 6e 74  >zName);.    int
4a30: 20 72 63 32 20 3d 20 72 65 61 64 4a 6f 75 72 6e   rc2 = readJourn
4a40: 61 6c 46 69 6c 65 28 70 2c 20 70 4d 61 69 6e 29  alFile(p, pMain)
4a50: 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
4a60: 4c 49 54 45 5f 4f 4b 20 29 20 72 63 20 3d 20 72  LITE_OK ) rc = r
4a70: 63 32 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c2;.  }.  return
4a80: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
4a90: 75 6e 63 61 74 65 20 61 6e 20 6a 74 2d 66 69 6c  uncate an jt-fil
4aa0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4ab0: 20 6a 74 54 72 75 6e 63 61 74 65 28 73 71 6c 69   jtTruncate(sqli
4ac0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
4ad0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 73 69   sqlite_int64 si
4ae0: 7a 65 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a  ze){.  jt_file *
4af0: 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70  p = (jt_file *)p
4b00: 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 2d 3e 66  File;.  if( p->f
4b10: 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
4b20: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20 26 26  _MAIN_JOURNAL &&
4b30: 20 73 69 7a 65 3d 3d 30 20 29 7b 0a 20 20 20 20   size==0 ){.    
4b40: 2f 2a 20 54 72 75 6e 63 61 74 69 6e 67 20 61 20  /* Truncating a 
4b50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
4b60: 69 73 20 69 73 20 74 68 65 20 65 6e 64 20 6f 66  is is the end of
4b70: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20   a transaction. 
4b80: 2a 2f 0a 20 20 20 20 6a 74 5f 66 69 6c 65 20 2a  */.    jt_file *
4b90: 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61  pMain = locateDa
4ba0: 74 61 62 61 73 65 48 61 6e 64 6c 65 28 70 2d 3e  tabaseHandle(p->
4bb0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 63 6c 6f 73  zName);.    clos
4bc0: 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 4d 61  eTransaction(pMa
4bd0: 69 6e 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  in);.  }.  if( p
4be0: 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f  ->flags&SQLITE_O
4bf0: 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 26 26 20 70  PEN_MAIN_DB && p
4c00: 2d 3e 70 57 72 69 74 61 62 6c 65 20 29 7b 0a 20  ->pWritable ){. 
4c10: 20 20 20 75 33 32 20 70 67 6e 6f 3b 0a 20 20 20     u32 pgno;.   
4c20: 20 75 33 32 20 6c 6f 63 6b 69 6e 67 5f 70 61 67   u32 locking_pag
4c30: 65 20 3d 20 28 75 33 32 29 28 50 45 4e 44 49 4e  e = (u32)(PENDIN
4c40: 47 5f 42 59 54 45 2f 70 2d 3e 6e 50 61 67 65 73  G_BYTE/p->nPages
4c50: 69 7a 65 2b 31 29 3b 0a 20 20 20 20 66 6f 72 28  ize+1);.    for(
4c60: 70 67 6e 6f 3d 73 69 7a 65 2f 70 2d 3e 6e 50 61  pgno=size/p->nPa
4c70: 67 65 73 69 7a 65 2b 31 3b 20 70 67 6e 6f 3c 3d  gesize+1; pgno<=
4c80: 70 2d 3e 6e 50 61 67 65 3b 20 70 67 6e 6f 2b 2b  p->nPage; pgno++
4c90: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
4ca0: 20 70 67 6e 6f 3d 3d 6c 6f 63 6b 69 6e 67 5f 70   pgno==locking_p
4cb0: 61 67 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69  age || sqlite3Bi
4cc0: 74 76 65 63 54 65 73 74 28 70 2d 3e 70 57 72 69  tvecTest(p->pWri
4cd0: 74 61 62 6c 65 2c 20 70 67 6e 6f 29 20 29 3b 0a  table, pgno) );.
4ce0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4cf0: 72 6e 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  rn sqlite3OsTrun
4d00: 63 61 74 65 28 70 2d 3e 70 52 65 61 6c 2c 20 73  cate(p->pReal, s
4d10: 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  ize);.}../*.** S
4d20: 79 6e 63 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a  ync an jt-file..
4d30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74  */.static int jt
4d40: 53 79 6e 63 28 73 71 6c 69 74 65 33 5f 66 69 6c  Sync(sqlite3_fil
4d50: 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 66 6c  e *pFile, int fl
4d60: 61 67 73 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20  ags){.  jt_file 
4d70: 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29  *p = (jt_file *)
4d80: 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 70 2d  pFile;..  if( p-
4d90: 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50  >flags&SQLITE_OP
4da0: 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 20  EN_MAIN_JOURNAL 
4db0: 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
4dc0: 20 20 20 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69     jt_file *pMai
4dd0: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
4de0: 20 20 20 20 20 2f 2a 20 54 68 65 20 61 73 73 6f       /* The asso
4df0: 63 69 61 74 65 64 20 64 61 74 61 62 61 73 65 20  ciated database 
4e00: 66 69 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  file */..    /* 
4e10: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
4e20: 20 69 73 20 62 65 69 6e 67 20 73 79 6e 63 65 64   is being synced
4e30: 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 2c  . At this point,
4e40: 20 77 65 20 69 6e 73 70 65 63 74 20 74 68 65 20   we inspect the 
4e50: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 65 6e 74 73  .    ** contents
4e60: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 75 70 20   of the file up 
4e70: 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 61 6e  to this point an
4e80: 64 20 73 65 74 20 65 61 63 68 20 62 69 74 20 69  d set each bit i
4e90: 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 6a 74  n the .    ** jt
4ea0: 5f 66 69 6c 65 2e 70 57 72 69 74 61 62 6c 65 20  _file.pWritable 
4eb0: 62 69 74 76 65 63 20 6f 66 20 74 68 65 20 6d 61  bitvec of the ma
4ec0: 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
4ed0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
4ee0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 6a 6f 75  .    ** this jou
4ef0: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 2a  rnal file..    *
4f00: 2f 0a 20 20 20 20 70 4d 61 69 6e 20 3d 20 6c 6f  /.    pMain = lo
4f10: 63 61 74 65 44 61 74 61 62 61 73 65 48 61 6e 64  cateDatabaseHand
4f20: 6c 65 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  le(p->zName);.  
4f30: 20 20 61 73 73 65 72 74 28 70 4d 61 69 6e 29 3b    assert(pMain);
4f40: 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
4f50: 20 62 69 74 76 65 63 20 76 61 6c 75 65 73 20 2a   bitvec values *
4f60: 2f 0a 20 20 20 20 69 66 28 20 70 4d 61 69 6e 2d  /.    if( pMain-
4f70: 3e 70 57 72 69 74 61 62 6c 65 20 29 7b 0a 20 20  >pWritable ){.  
4f80: 20 20 20 20 70 4d 61 69 6e 2d 3e 6e 53 79 6e 63      pMain->nSync
4f90: 2b 2b 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 72  ++;.      rc = r
4fa0: 65 61 64 4a 6f 75 72 6e 61 6c 46 69 6c 65 28 70  eadJournalFile(p
4fb0: 2c 20 70 4d 61 69 6e 29 3b 0a 20 20 20 20 20 20  , pMain);.      
4fc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4fd0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  K ){.        ret
4fe0: 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
4ff0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
5000: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  urn sqlite3OsSyn
5010: 63 28 70 2d 3e 70 52 65 61 6c 2c 20 66 6c 61 67  c(p->pReal, flag
5020: 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  s);.}../*.** Ret
5030: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
5040: 66 69 6c 65 2d 73 69 7a 65 20 6f 66 20 61 6e 20  file-size of an 
5050: 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  jt-file..*/.stat
5060: 69 63 20 69 6e 74 20 6a 74 46 69 6c 65 53 69 7a  ic int jtFileSiz
5070: 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  e(sqlite3_file *
5080: 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f 69 6e  pFile, sqlite_in
5090: 74 36 34 20 2a 70 53 69 7a 65 29 7b 0a 20 20 6a  t64 *pSize){.  j
50a0: 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f  t_file *p = (jt_
50b0: 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
50c0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
50d0: 46 69 6c 65 53 69 7a 65 28 70 2d 3e 70 52 65 61  FileSize(p->pRea
50e0: 6c 2c 20 70 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a  l, pSize);.}../*
50f0: 0a 2a 2a 20 4c 6f 63 6b 20 61 6e 20 6a 74 2d 66  .** Lock an jt-f
5100: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
5110: 6e 74 20 6a 74 4c 6f 63 6b 28 73 71 6c 69 74 65  nt jtLock(sqlite
5120: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
5130: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
5140: 20 72 63 3b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a   rc;.  jt_file *
5150: 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70  p = (jt_file *)p
5160: 46 69 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  File;.  rc = sql
5170: 69 74 65 33 4f 73 4c 6f 63 6b 28 70 2d 3e 70 52  ite3OsLock(p->pR
5180: 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20 69  eal, eLock);.  i
5190: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
51a0: 20 26 26 20 65 4c 6f 63 6b 3e 70 2d 3e 65 4c 6f   && eLock>p->eLo
51b0: 63 6b 20 29 7b 0a 20 20 20 20 70 2d 3e 65 4c 6f  ck ){.    p->eLo
51c0: 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d 0a  ck = eLock;.  }.
51d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
51e0: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 61 6e 20  /*.** Unlock an 
51f0: 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  jt-file..*/.stat
5200: 69 63 20 69 6e 74 20 6a 74 55 6e 6c 6f 63 6b 28  ic int jtUnlock(
5210: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
5220: 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  ile, int eLock){
5230: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6a 74 5f  .  int rc;.  jt_
5240: 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f 66 69  file *p = (jt_fi
5250: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 63  le *)pFile;.  rc
5260: 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f   = sqlite3OsUnlo
5270: 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c 6f  ck(p->pReal, eLo
5280: 63 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ck);.  if( rc==S
5290: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 4c 6f 63  QLITE_OK && eLoc
52a0: 6b 3c 70 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20 20  k<p->eLock ){.  
52b0: 20 20 70 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c 6f    p->eLock = eLo
52c0: 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ck;.  }.  return
52d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
52e0: 65 63 6b 20 69 66 20 61 6e 6f 74 68 65 72 20 66  eck if another f
52f0: 69 6c 65 2d 68 61 6e 64 6c 65 20 68 6f 6c 64 73  ile-handle holds
5300: 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
5310: 20 6f 6e 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a   on an jt-file..
5320: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74  */.static int jt
5330: 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
5340: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
5350: 70 46 69 6c 65 2c 20 69 6e 74 20 2a 70 52 65 73  pFile, int *pRes
5360: 4f 75 74 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20  Out){.  jt_file 
5370: 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29  *p = (jt_file *)
5380: 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
5390: 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65  sqlite3OsCheckRe
53a0: 73 65 72 76 65 64 4c 6f 63 6b 28 70 2d 3e 70 52  servedLock(p->pR
53b0: 65 61 6c 2c 20 70 52 65 73 4f 75 74 29 3b 0a 7d  eal, pResOut);.}
53c0: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6c 65 20 63 6f 6e  ../*.** File con
53d0: 74 72 6f 6c 20 6d 65 74 68 6f 64 2e 20 46 6f 72  trol method. For
53e0: 20 63 75 73 74 6f 6d 20 6f 70 65 72 61 74 69 6f   custom operatio
53f0: 6e 73 20 6f 6e 20 61 6e 20 6a 74 2d 66 69 6c 65  ns on an jt-file
5400: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5410: 6a 74 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 73 71  jtFileControl(sq
5420: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
5430: 65 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20  e, int op, void 
5440: 2a 70 41 72 67 29 7b 0a 20 20 6a 74 5f 66 69 6c  *pArg){.  jt_fil
5450: 65 20 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20  e *p = (jt_file 
5460: 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72  *)pFile;.  retur
5470: 6e 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 43  n sqlite3OsFileC
5480: 6f 6e 74 72 6f 6c 28 70 2d 3e 70 52 65 61 6c 2c  ontrol(p->pReal,
5490: 20 6f 70 2c 20 70 41 72 67 29 3b 0a 7d 0a 0a 2f   op, pArg);.}../
54a0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
54b0: 73 65 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 62  sector-size in b
54c0: 79 74 65 73 20 66 6f 72 20 61 6e 20 6a 74 2d 66  ytes for an jt-f
54d0: 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
54e0: 6e 74 20 6a 74 53 65 63 74 6f 72 53 69 7a 65 28  nt jtSectorSize(
54f0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
5500: 69 6c 65 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20  ile){.  jt_file 
5510: 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29  *p = (jt_file *)
5520: 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
5530: 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
5540: 69 7a 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d  ize(p->pReal);.}
5550: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
5560: 68 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63  he device charac
5570: 74 65 72 69 73 74 69 63 20 66 6c 61 67 73 20 73  teristic flags s
5580: 75 70 70 6f 72 74 65 64 20 62 79 20 61 6e 20 6a  upported by an j
5590: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
55a0: 63 20 69 6e 74 20 6a 74 44 65 76 69 63 65 43 68  c int jtDeviceCh
55b0: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 73 71  aracteristics(sq
55c0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
55d0: 65 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70  e){.  jt_file *p
55e0: 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46   = (jt_file *)pF
55f0: 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ile;.  return sq
5600: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
5610: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 2d 3e  racteristics(p->
5620: 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pReal);.}../*.**
5630: 20 4f 70 65 6e 20 61 6e 20 6a 74 20 66 69 6c 65   Open an jt file
5640: 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74   handle..*/.stat
5650: 69 63 20 69 6e 74 20 6a 74 4f 70 65 6e 28 0a 20  ic int jtOpen(. 
5660: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
5670: 66 73 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  fs,.  const char
5680: 20 2a 7a 4e 61 6d 65 2c 0a 20 20 73 71 6c 69 74   *zName,.  sqlit
5690: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 0a  e3_file *pFile,.
56a0: 20 20 69 6e 74 20 66 6c 61 67 73 2c 0a 20 20 69    int flags,.  i
56b0: 6e 74 20 2a 70 4f 75 74 46 6c 61 67 73 0a 29 7b  nt *pOutFlags.){
56c0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 6a 74 5f  .  int rc;.  jt_
56d0: 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f 66 69  file *p = (jt_fi
56e0: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 70 46  le *)pFile;.  pF
56f0: 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20  ile->pMethods = 
5700: 30 3b 0a 20 20 70 2d 3e 70 52 65 61 6c 20 3d 20  0;.  p->pReal = 
5710: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29  (sqlite3_file *)
5720: 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70 52 65 61  &p[1];.  p->pRea
5730: 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 3d 20 30 3b  l->pMethods = 0;
5740: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
5750: 73 4f 70 65 6e 28 67 2e 70 56 66 73 2c 20 7a 4e  sOpen(g.pVfs, zN
5760: 61 6d 65 2c 20 70 2d 3e 70 52 65 61 6c 2c 20 66  ame, p->pReal, f
5770: 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61 67 73 29  lags, pOutFlags)
5780: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  ;.  assert( rc==
5790: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 2d 3e  SQLITE_OK || p->
57a0: 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 3d  pReal->pMethods=
57b0: 3d 30 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  =0 );.  if( rc==
57c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
57d0: 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64 73   pFile->pMethods
57e0: 20 3d 20 26 6a 74 5f 69 6f 5f 6d 65 74 68 6f 64   = &jt_io_method
57f0: 73 3b 0a 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 20  s;.    p->eLock 
5800: 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 7a 4e 61 6d  = 0;.    p->zNam
5810: 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20 20 20 70  e = zName;.    p
5820: 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61 67 73 3b  ->flags = flags;
5830: 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d 20  .    p->pNext = 
5840: 30 3b 0a 20 20 20 20 70 2d 3e 70 57 72 69 74 61  0;.    p->pWrita
5850: 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  ble = 0;.    p->
5860: 61 43 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 20 20  aCksum = 0;.    
5870: 65 6e 74 65 72 4a 74 4d 75 74 65 78 28 29 3b 0a  enterJtMutex();.
5880: 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b      if( zName ){
5890: 0a 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20  .      p->pNext 
58a0: 3d 20 67 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20  = g.pList;.     
58b0: 20 67 2e 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20   g.pList = p;.  
58c0: 20 20 7d 0a 20 20 20 20 6c 65 61 76 65 4a 74 4d    }.    leaveJtM
58d0: 75 74 65 78 28 29 3b 0a 20 20 7d 0a 20 20 72 65  utex();.  }.  re
58e0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
58f0: 2a 20 44 65 6c 65 74 65 20 74 68 65 20 66 69 6c  * Delete the fil
5900: 65 20 6c 6f 63 61 74 65 64 20 61 74 20 7a 50 61  e located at zPa
5910: 74 68 2e 20 49 66 20 74 68 65 20 64 69 72 53 79  th. If the dirSy
5920: 6e 63 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  nc argument is t
5930: 72 75 65 2c 0a 2a 2a 20 65 6e 73 75 72 65 20 74  rue,.** ensure t
5940: 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 6d  he file-system m
5950: 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 61 72 65  odifications are
5960: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20   synced to disk 
5970: 62 65 66 6f 72 65 0a 2a 2a 20 72 65 74 75 72 6e  before.** return
5980: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ing..*/.static i
5990: 6e 74 20 6a 74 44 65 6c 65 74 65 28 73 71 6c 69  nt jtDelete(sqli
59a0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
59b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
59c0: 2c 20 69 6e 74 20 64 69 72 53 79 6e 63 29 7b 0a  , int dirSync){.
59d0: 20 20 69 6e 74 20 6e 50 61 74 68 20 3d 20 73 74    int nPath = st
59e0: 72 6c 65 6e 28 7a 50 61 74 68 29 3b 0a 20 20 69  rlen(zPath);.  i
59f0: 66 28 20 6e 50 61 74 68 3e 38 20 26 26 20 30 3d  f( nPath>8 && 0=
5a00: 3d 73 74 72 63 6d 70 28 22 2d 6a 6f 75 72 6e 61  =strcmp("-journa
5a10: 6c 22 2c 20 26 7a 50 61 74 68 5b 6e 50 61 74 68  l", &zPath[nPath
5a20: 2d 38 5d 29 20 29 7b 0a 20 20 20 20 2f 2a 20 44  -8]) ){.    /* D
5a30: 65 6c 65 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61  eleting a journa
5a40: 6c 20 66 69 6c 65 2e 20 54 68 65 20 65 6e 64 20  l file. The end 
5a50: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
5a60: 2e 20 2a 2f 0a 20 20 20 20 6a 74 5f 66 69 6c 65  . */.    jt_file
5a70: 20 2a 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65   *pMain = locate
5a80: 44 61 74 61 62 61 73 65 48 61 6e 64 6c 65 28 7a  DatabaseHandle(z
5a90: 50 61 74 68 29 3b 0a 20 20 20 20 69 66 28 20 70  Path);.    if( p
5aa0: 4d 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 63 6c  Main ){.      cl
5ab0: 6f 73 65 54 72 61 6e 73 61 63 74 69 6f 6e 28 70  oseTransaction(p
5ac0: 4d 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Main);.    }.  }
5ad0: 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
5ae0: 65 33 4f 73 44 65 6c 65 74 65 28 67 2e 70 56 66  e3OsDelete(g.pVf
5af0: 73 2c 20 7a 50 61 74 68 2c 20 64 69 72 53 79 6e  s, zPath, dirSyn
5b00: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 73  c);.}../*.** Tes
5b10: 74 20 66 6f 72 20 61 63 63 65 73 73 20 70 65 72  t for access per
5b20: 6d 69 73 73 69 6f 6e 73 2e 20 52 65 74 75 72 6e  missions. Return
5b30: 20 74 72 75 65 20 69 66 20 74 68 65 20 72 65 71   true if the req
5b40: 75 65 73 74 65 64 20 70 65 72 6d 69 73 73 69 6f  uested permissio
5b50: 6e 0a 2a 2a 20 69 73 20 61 76 61 69 6c 61 62 6c  n.** is availabl
5b60: 65 2c 20 6f 72 20 66 61 6c 73 65 20 6f 74 68 65  e, or false othe
5b70: 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
5b80: 20 69 6e 74 20 6a 74 41 63 63 65 73 73 28 0a 20   int jtAccess(. 
5b90: 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
5ba0: 66 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  fs, .  const cha
5bb0: 72 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74  r *zPath, .  int
5bc0: 20 66 6c 61 67 73 2c 20 0a 20 20 69 6e 74 20 2a   flags, .  int *
5bd0: 70 52 65 73 4f 75 74 0a 29 7b 0a 20 20 72 65 74  pResOut.){.  ret
5be0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 41 63 63  urn sqlite3OsAcc
5bf0: 65 73 73 28 67 2e 70 56 66 73 2c 20 7a 50 61 74  ess(g.pVfs, zPat
5c00: 68 2c 20 66 6c 61 67 73 2c 20 70 52 65 73 4f 75  h, flags, pResOu
5c10: 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70  t);.}../*.** Pop
5c20: 75 6c 61 74 65 20 62 75 66 66 65 72 20 7a 4f 75  ulate buffer zOu
5c30: 74 20 77 69 74 68 20 74 68 65 20 66 75 6c 6c 20  t with the full 
5c40: 63 61 6e 6f 6e 69 63 61 6c 20 70 61 74 68 6e 61  canonical pathna
5c50: 6d 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  me corresponding
5c60: 0a 2a 2a 20 74 6f 20 74 68 65 20 70 61 74 68 6e  .** to the pathn
5c70: 61 6d 65 20 69 6e 20 7a 50 61 74 68 2e 20 7a 4f  ame in zPath. zO
5c80: 75 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  ut is guaranteed
5c90: 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20 62   to point to a b
5ca0: 75 66 66 65 72 0a 2a 2a 20 6f 66 20 61 74 20 6c  uffer.** of at l
5cb0: 65 61 73 74 20 28 4a 54 5f 4d 41 58 5f 50 41 54  east (JT_MAX_PAT
5cc0: 48 4e 41 4d 45 2b 31 29 20 62 79 74 65 73 2e 0a  HNAME+1) bytes..
5cd0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74  */.static int jt
5ce0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 0a 20 20  FullPathname(.  
5cf0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
5d00: 73 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  s, .  const char
5d10: 20 2a 7a 50 61 74 68 2c 20 0a 20 20 69 6e 74 20   *zPath, .  int 
5d20: 6e 4f 75 74 2c 20 0a 20 20 63 68 61 72 20 2a 7a  nOut, .  char *z
5d30: 4f 75 74 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20  Out.){.  return 
5d40: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
5d50: 68 6e 61 6d 65 28 67 2e 70 56 66 73 2c 20 7a 50  hname(g.pVfs, zP
5d60: 61 74 68 2c 20 6e 4f 75 74 2c 20 7a 4f 75 74 29  ath, nOut, zOut)
5d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
5d80: 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
5d90: 61 72 79 20 6c 6f 63 61 74 65 64 20 61 74 20 7a  ary located at z
5da0: 50 61 74 68 20 61 6e 64 20 72 65 74 75 72 6e 20  Path and return 
5db0: 61 20 68 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61  a handle..*/.sta
5dc0: 74 69 63 20 76 6f 69 64 20 2a 6a 74 44 6c 4f 70  tic void *jtDlOp
5dd0: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  en(sqlite3_vfs *
5de0: 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68 61 72  pVfs, const char
5df0: 20 2a 7a 50 61 74 68 29 7b 0a 20 20 72 65 74 75   *zPath){.  retu
5e00: 72 6e 20 67 2e 70 56 66 73 2d 3e 78 44 6c 4f 70  rn g.pVfs->xDlOp
5e10: 65 6e 28 67 2e 70 56 66 73 2c 20 7a 50 61 74 68  en(g.pVfs, zPath
5e20: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75  );.}../*.** Popu
5e30: 6c 61 74 65 20 74 68 65 20 62 75 66 66 65 72 20  late the buffer 
5e40: 7a 45 72 72 4d 73 67 20 28 73 69 7a 65 20 6e 42  zErrMsg (size nB
5e50: 79 74 65 20 62 79 74 65 73 29 20 77 69 74 68 20  yte bytes) with 
5e60: 61 20 68 75 6d 61 6e 20 72 65 61 64 61 62 6c 65  a human readable
5e70: 0a 2a 2a 20 75 74 66 2d 38 20 73 74 72 69 6e 67  .** utf-8 string
5e80: 20 64 65 73 63 72 69 62 69 6e 67 20 74 68 65 20   describing the 
5e90: 6d 6f 73 74 20 72 65 63 65 6e 74 20 65 72 72 6f  most recent erro
5ea0: 72 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 61 73  r encountered as
5eb0: 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69 74  sociated .** wit
5ec0: 68 20 64 79 6e 61 6d 69 63 20 6c 69 62 72 61 72  h dynamic librar
5ed0: 69 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ies..*/.static v
5ee0: 6f 69 64 20 6a 74 44 6c 45 72 72 6f 72 28 73 71  oid jtDlError(sq
5ef0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
5f00: 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
5f10: 20 2a 7a 45 72 72 4d 73 67 29 7b 0a 20 20 67 2e   *zErrMsg){.  g.
5f20: 70 56 66 73 2d 3e 78 44 6c 45 72 72 6f 72 28 67  pVfs->xDlError(g
5f30: 2e 70 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 45  .pVfs, nByte, zE
5f40: 72 72 4d 73 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rrMsg);.}../*.**
5f50: 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
5f60: 72 20 74 6f 20 74 68 65 20 73 79 6d 62 6f 6c 20  r to the symbol 
5f70: 7a 53 79 6d 62 6f 6c 20 69 6e 20 74 68 65 20 64  zSymbol in the d
5f80: 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 70  ynamic library p
5f90: 48 61 6e 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  Handle..*/.stati
5fa0: 63 20 76 6f 69 64 20 28 2a 6a 74 44 6c 53 79 6d  c void (*jtDlSym
5fb0: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
5fc0: 66 73 2c 20 76 6f 69 64 20 2a 70 2c 20 63 6f 6e  fs, void *p, con
5fd0: 73 74 20 63 68 61 72 20 2a 7a 53 79 6d 29 29 28  st char *zSym))(
5fe0: 76 6f 69 64 29 7b 0a 20 20 72 65 74 75 72 6e 20  void){.  return 
5ff0: 67 2e 70 56 66 73 2d 3e 78 44 6c 53 79 6d 28 67  g.pVfs->xDlSym(g
6000: 2e 70 56 66 73 2c 20 70 2c 20 7a 53 79 6d 29 3b  .pVfs, p, zSym);
6010: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  .}../*.** Close 
6020: 74 68 65 20 64 79 6e 61 6d 69 63 20 6c 69 62 72  the dynamic libr
6030: 61 72 79 20 68 61 6e 64 6c 65 20 70 48 61 6e 64  ary handle pHand
6040: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  le..*/.static vo
6050: 69 64 20 6a 74 44 6c 43 6c 6f 73 65 28 73 71 6c  id jtDlClose(sql
6060: 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
6070: 76 6f 69 64 20 2a 70 48 61 6e 64 6c 65 29 7b 0a  void *pHandle){.
6080: 20 20 67 2e 70 56 66 73 2d 3e 78 44 6c 43 6c 6f    g.pVfs->xDlClo
6090: 73 65 28 67 2e 70 56 66 73 2c 20 70 48 61 6e 64  se(g.pVfs, pHand
60a0: 6c 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f  le);.}../*.** Po
60b0: 70 75 6c 61 74 65 20 74 68 65 20 62 75 66 66 65  pulate the buffe
60c0: 72 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  r pointed to by 
60d0: 7a 42 75 66 4f 75 74 20 77 69 74 68 20 6e 42 79  zBufOut with nBy
60e0: 74 65 20 62 79 74 65 73 20 6f 66 20 0a 2a 2a 20  te bytes of .** 
60f0: 72 61 6e 64 6f 6d 20 64 61 74 61 2e 0a 2a 2f 0a  random data..*/.
6100: 73 74 61 74 69 63 20 69 6e 74 20 6a 74 52 61 6e  static int jtRan
6110: 64 6f 6d 6e 65 73 73 28 73 71 6c 69 74 65 33 5f  domness(sqlite3_
6120: 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e  vfs *pVfs, int n
6130: 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 42 75 66  Byte, char *zBuf
6140: 4f 75 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  Out){.  return s
6150: 71 6c 69 74 65 33 4f 73 52 61 6e 64 6f 6d 6e 65  qlite3OsRandomne
6160: 73 73 28 67 2e 70 56 66 73 2c 20 6e 42 79 74 65  ss(g.pVfs, nByte
6170: 2c 20 7a 42 75 66 4f 75 74 29 3b 0a 7d 0a 0a 2f  , zBufOut);.}../
6180: 2a 0a 2a 2a 20 53 6c 65 65 70 20 66 6f 72 20 6e  *.** Sleep for n
6190: 4d 69 63 72 6f 20 6d 69 63 72 6f 73 65 63 6f 6e  Micro microsecon
61a0: 64 73 2e 20 52 65 74 75 72 6e 20 74 68 65 20 6e  ds. Return the n
61b0: 75 6d 62 65 72 20 6f 66 20 6d 69 63 72 6f 73 65  umber of microse
61c0: 63 6f 6e 64 73 20 0a 2a 2a 20 61 63 74 75 61 6c  conds .** actual
61d0: 6c 79 20 73 6c 65 70 74 2e 0a 2a 2f 0a 73 74 61  ly slept..*/.sta
61e0: 74 69 63 20 69 6e 74 20 6a 74 53 6c 65 65 70 28  tic int jtSleep(
61f0: 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
6200: 73 2c 20 69 6e 74 20 6e 4d 69 63 72 6f 29 7b 0a  s, int nMicro){.
6210: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
6220: 4f 73 53 6c 65 65 70 28 67 2e 70 56 66 73 2c 20  OsSleep(g.pVfs, 
6230: 6e 4d 69 63 72 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  nMicro);.}../*.*
6240: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72  * Return the cur
6250: 72 65 6e 74 20 74 69 6d 65 20 61 73 20 61 20 4a  rent time as a J
6260: 75 6c 69 61 6e 20 44 61 79 20 6e 75 6d 62 65 72  ulian Day number
6270: 20 69 6e 20 2a 70 54 69 6d 65 4f 75 74 2e 0a 2a   in *pTimeOut..*
6280: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 43  /.static int jtC
6290: 75 72 72 65 6e 74 54 69 6d 65 28 73 71 6c 69 74  urrentTime(sqlit
62a0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 64 6f  e3_vfs *pVfs, do
62b0: 75 62 6c 65 20 2a 70 54 69 6d 65 4f 75 74 29 7b  uble *pTimeOut){
62c0: 0a 20 20 72 65 74 75 72 6e 20 67 2e 70 56 66 73  .  return g.pVfs
62d0: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28 67  ->xCurrentTime(g
62e0: 2e 70 56 66 73 2c 20 70 54 69 6d 65 4f 75 74 29  .pVfs, pTimeOut)
62f0: 3b 0a 7d 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  ;.}./*.** Return
6300: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69 6d   the current tim
6310: 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44 61  e as a Julian Da
6320: 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54 69  y number in *pTi
6330: 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  meOut..*/.static
6340: 20 69 6e 74 20 6a 74 43 75 72 72 65 6e 74 54 69   int jtCurrentTi
6350: 6d 65 49 6e 74 36 34 28 73 71 6c 69 74 65 33 5f  meInt64(sqlite3_
6360: 76 66 73 20 2a 70 56 66 73 2c 20 73 71 6c 69 74  vfs *pVfs, sqlit
6370: 65 33 5f 69 6e 74 36 34 20 2a 70 54 69 6d 65 4f  e3_int64 *pTimeO
6380: 75 74 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e  ut){.  return g.
6390: 70 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69  pVfs->xCurrentTi
63a0: 6d 65 49 6e 74 36 34 28 67 2e 70 56 66 73 2c 20  meInt64(g.pVfs, 
63b0: 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a  pTimeOut);.}../*
63c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63d0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63e0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
63f0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
6400: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 74 61  *********.** Sta
6410: 72 74 20 6f 66 20 70 75 62 6c 69 63 20 41 50 49  rt of public API
6420: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  ..*/../*.** Conf
6430: 69 67 75 72 65 20 74 68 65 20 6a 74 20 56 46 53  igure the jt VFS
6440: 20 61 73 20 61 20 77 72 61 70 70 65 72 20 61 72   as a wrapper ar
6450: 6f 75 6e 64 20 74 68 65 20 56 46 53 20 6e 61 6d  ound the VFS nam
6460: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
6470: 0a 2a 2a 20 7a 57 72 61 70 2e 20 49 66 20 74 68  .** zWrap. If th
6480: 65 20 69 73 44 65 66 61 75 6c 74 20 70 61 72 61  e isDefault para
6490: 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 74  meter is true, t
64a0: 68 65 6e 20 74 68 65 20 6a 74 20 56 46 53 20 69  hen the jt VFS i
64b0: 73 20 69 6e 73 74 61 6c 6c 65 64 0a 2a 2a 20 61  s installed.** a
64c0: 73 20 74 68 65 20 6e 65 77 20 64 65 66 61 75 6c  s the new defaul
64d0: 74 20 56 46 53 20 66 6f 72 20 53 51 4c 69 74 65  t VFS for SQLite
64e0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 49 66   connections. If
64f0: 20 69 73 44 65 66 61 75 6c 74 20 69 73 20 6e 6f   isDefault is no
6500: 74 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20  t.** true, then 
6510: 74 68 65 20 6a 74 20 56 46 53 20 69 73 20 69 6e  the jt VFS is in
6520: 73 74 61 6c 6c 65 64 20 61 73 20 6e 6f 6e 2d 64  stalled as non-d
6530: 65 66 61 75 6c 74 2e 20 49 6e 20 74 68 69 73 20  efault. In this 
6540: 63 61 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 76  case it.** is av
6550: 61 69 6c 61 62 6c 65 20 76 69 61 20 69 74 73 20  ailable via its 
6560: 6e 61 6d 65 2c 20 22 6a 74 22 2e 0a 2a 2f 0a 69  name, "jt"..*/.i
6570: 6e 74 20 6a 74 5f 72 65 67 69 73 74 65 72 28 63  nt jt_register(c
6580: 68 61 72 20 2a 7a 57 72 61 70 2c 20 69 6e 74 20  har *zWrap, int 
6590: 69 73 44 65 66 61 75 6c 74 29 7b 0a 20 20 67 2e  isDefault){.  g.
65a0: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
65b0: 66 73 5f 66 69 6e 64 28 7a 57 72 61 70 29 3b 0a  fs_find(zWrap);.
65c0: 20 20 69 66 28 20 67 2e 70 56 66 73 3d 3d 30 20    if( g.pVfs==0 
65d0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
65e0: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
65f0: 20 20 6a 74 5f 76 66 73 2e 73 7a 4f 73 46 69 6c    jt_vfs.szOsFil
6600: 65 20 3d 20 73 69 7a 65 6f 66 28 6a 74 5f 66 69  e = sizeof(jt_fi
6610: 6c 65 29 20 2b 20 67 2e 70 56 66 73 2d 3e 73 7a  le) + g.pVfs->sz
6620: 4f 73 46 69 6c 65 3b 0a 20 20 69 66 28 20 67 2e  OsFile;.  if( g.
6630: 70 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 3d 3d  pVfs->iVersion==
6640: 31 20 29 7b 0a 20 20 20 20 6a 74 5f 76 66 73 2e  1 ){.    jt_vfs.
6650: 69 56 65 72 73 69 6f 6e 20 3d 20 31 3b 0a 20 20  iVersion = 1;.  
6660: 7d 65 6c 73 65 20 69 66 28 20 67 2e 70 56 66 73  }else if( g.pVfs
6670: 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e  ->xCurrentTimeIn
6680: 74 36 34 3d 3d 30 20 29 7b 0a 20 20 20 20 6a 74  t64==0 ){.    jt
6690: 5f 76 66 73 2e 78 43 75 72 72 65 6e 74 54 69 6d  _vfs.xCurrentTim
66a0: 65 49 6e 74 36 34 20 3d 20 30 3b 0a 20 20 7d 0a  eInt64 = 0;.  }.
66b0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 72 65    sqlite3_vfs_re
66c0: 67 69 73 74 65 72 28 26 6a 74 5f 76 66 73 2c 20  gister(&jt_vfs, 
66d0: 69 73 44 65 66 61 75 6c 74 29 3b 0a 20 20 72 65  isDefault);.  re
66e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
66f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 69 6e 73 74 61  }../*.** Uninsta
6700: 6c 6c 20 74 68 65 20 6a 74 20 56 46 53 2c 20 69  ll the jt VFS, i
6710: 66 20 69 74 20 69 73 20 69 6e 73 74 61 6c 6c 65  f it is installe
6720: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 6a 74 5f 75 6e  d..*/.void jt_un
6730: 72 65 67 69 73 74 65 72 28 76 6f 69 64 29 7b 0a  register(void){.
6740: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 75 6e    sqlite3_vfs_un
6750: 72 65 67 69 73 74 65 72 28 26 6a 74 5f 76 66 73  register(&jt_vfs
6760: 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66 0a           );.}..#endif.