/ Hex Artifact Content
Login

Artifact f234c7351bb4dd4098a280f8cc3da98123038de4:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 4a 61 6e 20 32  /*.** 2008 Jan 2
0010: 32 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 75 74 68  2.**.** The auth
0020: 6f 72 20 64 69 73 63 6c 61 69 6d 73 20 63 6f 70  or disclaims cop
0030: 79 72 69 67 68 74 20 74 6f 20 74 68 69 73 20 73  yright to this s
0040: 6f 75 72 63 65 20 63 6f 64 65 2e 20 20 49 6e 20  ource code.  In 
0050: 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61 20 6c 65  place of.** a le
0060: 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68 65 72 65  gal notice, here
0070: 20 69 73 20 61 20 62 6c 65 73 73 69 6e 67 3a 0a   is a blessing:.
0080: 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20 79 6f 75  **.**    May you
0090: 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20 6e 6f 74   do good and not
00a0: 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20 4d 61 79   evil..**    May
00b0: 20 79 6f 75 20 66 69 6e 64 20 66 6f 72 67 69 76   you find forgiv
00c0: 65 6e 65 73 73 20 66 6f 72 20 79 6f 75 72 73 65  eness for yourse
00d0: 6c 66 20 61 6e 64 20 66 6f 72 67 69 76 65 20 6f  lf and forgive o
00e0: 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20 4d 61 79  thers..**    May
00f0: 20 79 6f 75 20 73 68 61 72 65 20 66 72 65 65 6c   you share freel
0100: 79 2c 20 6e 65 76 65 72 20 74 61 6b 69 6e 67 20  y, never taking 
0110: 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75 20 67 69  more than you gi
0120: 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ve..**.*********
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73  *****.**.** This
0180: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 63   file contains c
0190: 6f 64 65 20 66 6f 72 20 61 20 56 46 53 20 6c 61  ode for a VFS la
01a0: 79 65 72 20 74 68 61 74 20 61 63 74 73 20 61 73  yer that acts as
01b0: 20 61 20 77 72 61 70 70 65 72 20 61 72 6f 75 6e   a wrapper aroun
01c0: 64 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67  d.** an existing
01d0: 20 56 46 53 2e 20 54 68 65 20 63 6f 64 65 20 69   VFS. The code i
01e0: 6e 20 74 68 69 73 20 66 69 6c 65 20 61 74 74 65  n this file atte
01f0: 6d 70 74 73 20 74 6f 20 76 65 72 69 66 79 20 74  mpts to verify t
0200: 68 61 74 20 53 51 4c 69 74 65 0a 2a 2a 20 63 6f  hat SQLite.** co
0210: 72 72 65 63 74 6c 79 20 70 6f 70 75 6c 61 74 65  rrectly populate
0220: 73 20 61 6e 64 20 73 79 6e 63 73 20 61 20 6a 6f  s and syncs a jo
0230: 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
0240: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 61 0a 2a  e writing to a.*
0250: 2a 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  * corresponding 
0260: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
0270: 2a 0a 2a 2a 20 24 49 64 3a 20 74 65 73 74 5f 6a  *.** $Id: test_j
0280: 6f 75 72 6e 61 6c 2e 63 2c 76 20 31 2e 38 20 32  ournal.c,v 1.8 2
0290: 30 30 39 2f 30 31 2f 30 38 20 31 32 3a 30 35 3a  009/01/08 12:05:
02a0: 35 36 20 64 61 6e 69 65 6c 6b 31 39 37 37 20 45  56 danielk1977 E
02b0: 78 70 20 24 0a 2a 2f 0a 23 69 66 20 53 51 4c 49  xp $.*/.#if SQLI
02c0: 54 45 5f 54 45 53 54 20 20 20 20 20 20 20 20 20  TE_TEST         
02d0: 20 2f 2a 20 54 68 69 73 20 66 69 6c 65 20 69 73   /* This file is
02e0: 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
02f0: 67 20 6f 6e 6c 79 20 2a 2f 0a 0a 23 69 6e 63 6c  g only */..#incl
0300: 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22 0a  ude "sqlite3.h".
0310: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0320: 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49 4e  Int.h"../*.** IN
0330: 54 45 52 46 41 43 45 0a 2a 2a 0a 2a 2a 20 20 20  TERFACE.**.**   
0340: 54 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65 72  The public inter
0350: 66 61 63 65 20 74 6f 20 74 68 69 73 20 77 72 61  face to this wra
0360: 70 70 65 72 20 56 46 53 20 69 73 20 74 77 6f 20  pper VFS is two 
0370: 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
0380: 20 20 20 20 20 6a 74 5f 72 65 67 69 73 74 65 72       jt_register
0390: 28 29 0a 2a 2a 20 20 20 20 20 6a 74 5f 75 6e 72  ().**     jt_unr
03a0: 65 67 69 73 74 65 72 28 29 0a 2a 2a 0a 2a 2a 20  egister().**.** 
03b0: 20 20 53 65 65 20 68 65 61 64 65 72 20 63 6f 6d    See header com
03c0: 6d 65 6e 74 73 20 61 73 73 6f 63 69 61 74 65 64  ments associated
03d0: 20 77 69 74 68 20 74 68 6f 73 65 20 74 77 6f 20   with those two 
03e0: 66 75 6e 63 74 69 6f 6e 73 20 62 65 6c 6f 77 20  functions below 
03f0: 66 6f 72 20 0a 2a 2a 20 20 20 64 65 74 61 69 6c  for .**   detail
0400: 73 2e 0a 2a 2a 0a 2a 2a 20 4c 49 4d 49 54 41 54  s..**.** LIMITAT
0410: 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  IONS.**.**   Thi
0420: 73 20 77 72 61 70 70 65 72 20 77 69 6c 6c 20 6e  s wrapper will n
0430: 6f 74 20 77 6f 72 6b 20 69 66 20 22 50 52 41 47  ot work if "PRAG
0440: 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 3d  MA synchronous =
0450: 20 6f 66 66 22 20 69 73 20 75 73 65 64 2e 0a 2a   off" is used..*
0460: 2a 0a 2a 2a 20 4f 50 45 52 41 54 49 4f 4e 0a 2a  *.** OPERATION.*
0470: 2a 0a 2a 2a 20 20 53 74 61 72 74 69 6e 67 20 61  *.**  Starting a
0480: 20 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 2a 2a   Transaction:.**
0490: 0a 2a 2a 20 20 20 57 68 65 6e 20 61 20 77 72 69  .**   When a wri
04a0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  te-transaction i
04b0: 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 20 63  s started, the c
04c0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
04d0: 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 20 20  atabase is.**   
04e0: 69 6e 73 70 65 63 74 65 64 20 61 6e 64 20 74 68  inspected and th
04f0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74 61  e following data
0500: 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74 20   stored as part 
0510: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
0520: 66 69 6c 65 20 0a 2a 2a 20 20 20 68 61 6e 64 6c  file .**   handl
0530: 65 20 28 74 79 70 65 20 73 74 72 75 63 74 20 6a  e (type struct j
0540: 74 5f 66 69 6c 65 29 3a 0a 2a 2a 0a 2a 2a 20 20  t_file):.**.**  
0550: 20 20 20 61 29 20 54 68 65 20 70 61 67 65 2d 73     a) The page-s
0560: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
0570: 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20  ase file..**    
0580: 20 62 29 20 54 68 65 20 6e 75 6d 62 65 72 20 6f   b) The number o
0590: 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  f pages that are
05a0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
05b0: 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 63 29   file..**     c)
05c0: 20 54 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   The set of page
05d0: 20 6e 75 6d 62 65 72 73 20 63 6f 72 72 65 73 70   numbers corresp
05e0: 6f 6e 64 69 6e 67 20 74 6f 20 66 72 65 65 2d 6c  onding to free-l
05f0: 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 2e 0a  ist leaf pages..
0600: 2a 2a 20 20 20 20 20 64 29 20 41 20 63 68 65 63  **     d) A chec
0610: 6b 2d 73 75 6d 20 66 6f 72 20 65 76 65 72 79 20  k-sum for every 
0620: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
0630: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  base file..**.**
0640: 20 20 20 54 68 65 20 73 74 61 72 74 20 6f 66 20     The start of 
0650: 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74  a write-transact
0660: 69 6f 6e 20 69 73 20 64 65 65 6d 65 64 20 74 6f  ion is deemed to
0670: 20 68 61 76 65 20 6f 63 63 75 72 65 64 20 77 68   have occured wh
0680: 65 6e 20 61 20 0a 2a 2a 20 20 20 32 38 2d 62 79  en a .**   28-by
0690: 74 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  te journal heade
06a0: 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  r is written to 
06b0: 62 79 74 65 20 6f 66 66 73 65 74 20 30 20 6f 66  byte offset 0 of
06c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
06d0: 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20     file..**.**  
06e0: 53 79 6e 63 69 6e 67 20 74 68 65 20 4a 6f 75 72  Syncing the Jour
06f0: 6e 61 6c 20 46 69 6c 65 3a 0a 2a 2a 0a 2a 2a 20  nal File:.**.** 
0700: 20 20 57 68 65 6e 65 76 65 72 20 74 68 65 20 78    Whenever the x
0710: 53 79 6e 63 20 6d 65 74 68 6f 64 20 69 73 20 69  Sync method is i
0720: 6e 76 6f 6b 65 64 20 74 6f 20 73 79 6e 63 20 61  nvoked to sync a
0730: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74   journal-file, t
0740: 68 65 0a 2a 2a 20 20 20 63 6f 6e 74 65 6e 74 73  he.**   contents
0750: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
0760: 66 69 6c 65 20 61 72 65 20 72 65 61 64 2e 20 46  file are read. F
0770: 6f 72 20 65 61 63 68 20 70 61 67 65 20 77 72 69  or each page wri
0780: 74 74 65 6e 20 74 6f 0a 2a 2a 20 20 20 74 68 65  tten to.**   the
0790: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61   journal file, a
07a0: 20 63 68 65 63 6b 2d 73 75 6d 20 69 73 20 63 61   check-sum is ca
07b0: 6c 63 75 6c 61 74 65 64 20 61 6e 64 20 63 6f 6d  lculated and com
07c0: 70 61 72 65 64 20 74 6f 20 74 68 65 20 20 0a 2a  pared to the  .*
07d0: 2a 20 20 20 63 68 65 63 6b 2d 73 75 6d 20 63 61  *   check-sum ca
07e0: 6c 63 75 6c 61 74 65 64 20 66 6f 72 20 74 68 65  lculated for the
07f0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64   corresponding d
0800: 61 74 61 62 61 73 65 20 70 61 67 65 20 77 68 65  atabase page whe
0810: 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69 74 65  n the.**   write
0820: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73  -transaction was
0830: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 54 68   initialized. Th
0840: 65 20 73 75 63 63 65 73 73 20 6f 66 20 74 68 65  e success of the
0850: 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 20   comparison.**  
0860: 20 69 73 20 61 73 73 65 72 74 28 29 65 64 2e 20   is assert()ed. 
0870: 53 6f 20 69 66 20 53 51 4c 69 74 65 20 68 61 73  So if SQLite has
0880: 20 77 72 69 74 74 65 6e 20 73 6f 6d 65 74 68 69   written somethi
0890: 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  ng other than th
08a0: 65 0a 2a 2a 20 20 20 6f 72 69 67 69 6e 61 6c 20  e.**   original 
08b0: 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64  content to the d
08c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e  atabase file, an
08d0: 20 61 73 73 65 72 74 28 29 20 77 69 6c 6c 20 66   assert() will f
08e0: 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 41 64 64  ail..**.**   Add
08f0: 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 73  itionally, the s
0900: 65 74 20 6f 66 20 70 61 67 65 20 6e 75 6d 62 65  et of page numbe
0910: 72 73 20 66 6f 72 20 77 68 69 63 68 20 72 65 63  rs for which rec
0920: 6f 72 64 73 20 65 78 69 73 74 20 69 6e 0a 2a 2a  ords exist in.**
0930: 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66     the journal f
0940: 69 6c 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  ile is added to 
0950: 28 75 6e 69 6f 6e 65 64 20 77 69 74 68 29 20 74  (unioned with) t
0960: 68 65 20 73 65 74 20 6f 66 20 70 61 67 65 20 6e  he set of page n
0970: 75 6d 62 65 72 73 0a 2a 2a 20 20 20 63 6f 72 72  umbers.**   corr
0980: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 66 72 65  esponding to fre
0990: 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
09a0: 73 20 63 6f 6c 6c 65 63 74 65 64 20 77 68 65 6e  s collected when
09b0: 20 74 68 65 20 0a 2a 2a 20 20 20 77 72 69 74 65   the .**   write
09c0: 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73  -transaction was
09d0: 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20 54 68   initialized. Th
09e0: 69 73 20 73 65 74 20 63 6f 6d 70 72 69 73 65 73  is set comprises
09f0: 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72   the page-number
0a00: 73 20 0a 2a 2a 20 20 20 63 6f 72 72 65 73 70 6f  s .**   correspo
0a10: 6e 64 69 6e 67 20 74 6f 20 74 68 6f 73 65 20 70  nding to those p
0a20: 61 67 65 73 20 74 68 61 74 20 53 51 4c 69 74 65  ages that SQLite
0a30: 20 6d 61 79 20 6e 6f 77 20 73 61 66 65 6c 79 20   may now safely 
0a40: 6d 6f 64 69 66 79 2e 0a 2a 2a 0a 2a 2a 20 20 57  modify..**.**  W
0a50: 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 44 61  riting to the Da
0a60: 74 61 62 61 73 65 20 46 69 6c 65 3a 0a 2a 2a 0a  tabase File:.**.
0a70: 2a 2a 20 20 20 57 68 65 6e 20 61 20 62 6c 6f 63  **   When a bloc
0a80: 6b 20 6f 66 20 64 61 74 61 20 69 73 20 77 72 69  k of data is wri
0a90: 74 74 65 6e 20 74 6f 20 61 20 64 61 74 61 62 61  tten to a databa
0aa0: 73 65 20 66 69 6c 65 2c 20 74 68 65 20 66 6f 6c  se file, the fol
0ab0: 6c 6f 77 69 6e 67 0a 2a 2a 20 20 20 69 6e 76 61  lowing.**   inva
0ac0: 72 69 61 6e 74 73 20 61 72 65 20 61 73 73 65 72  riants are asser
0ad0: 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 61  ted:.**.**     a
0ae0: 29 20 54 68 61 74 20 74 68 65 20 62 6c 6f 63 6b  ) That the block
0af0: 20 6f 66 20 64 61 74 61 20 69 73 20 61 6e 20 61   of data is an a
0b00: 6c 69 67 6e 65 64 20 62 6c 6f 63 6b 20 6f 66 20  ligned block of 
0b10: 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65 73 2e  page-size bytes.
0b20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20 54 68  .**.**     b) Th
0b30: 61 74 20 69 66 20 74 68 65 20 70 61 67 65 20 62  at if the page b
0b40: 65 69 6e 67 20 77 72 69 74 74 65 6e 20 64 69 64  eing written did
0b50: 20 6e 6f 74 20 65 78 69 73 74 20 77 68 65 6e 20   not exist when 
0b60: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 20 74  the .**        t
0b70: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
0b80: 74 61 72 74 65 64 20 28 69 2e 65 2e 20 74 68 65  tarted (i.e. the
0b90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
0ba0: 73 20 67 72 6f 77 69 6e 67 29 2c 20 74 68 65 6e  s growing), then
0bb0: 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65 20 6a  .**        the j
0bc0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 75 73 74  ournal-file must
0bd0: 20 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65   have been synce
0be0: 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20  d at least once 
0bf0: 73 69 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20  since.**        
0c00: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
0c10: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
0c20: 0a 2a 2a 20 20 20 20 20 63 29 20 54 68 61 74 20  .**     c) That 
0c30: 69 66 20 74 68 65 20 70 61 67 65 20 62 65 69 6e  if the page bein
0c40: 67 20 77 72 69 74 74 65 6e 20 64 69 64 20 65 78  g written did ex
0c50: 69 73 74 20 77 68 65 6e 20 74 68 65 20 74 72 61  ist when the tra
0c60: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0c70: 20 20 20 20 77 61 73 20 73 74 61 72 74 65 64 2c      was started,
0c80: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
0c90: 75 73 74 20 68 61 76 65 20 65 69 74 68 65 72 20  ust have either 
0ca0: 62 65 65 6e 20 61 20 66 72 65 65 2d 6c 69 73 74  been a free-list
0cb0: 0a 2a 2a 20 20 20 20 20 20 20 20 6c 65 61 66 20  .**        leaf 
0cc0: 70 61 67 65 20 61 74 20 74 68 65 20 73 74 61 72  page at the star
0cd0: 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  t of the transac
0ce0: 74 69 6f 6e 2c 20 6f 72 20 65 6c 73 65 20 6d 75  tion, or else mu
0cf0: 73 74 20 68 61 76 65 0a 2a 2a 20 20 20 20 20 20  st have.**      
0d00: 20 20 62 65 65 6e 20 73 74 6f 72 65 64 20 69 6e    been stored in
0d10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
0d20: 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 6d  e prior to the m
0d30: 6f 73 74 20 72 65 63 65 6e 74 20 73 79 6e 63 2e  ost recent sync.
0d40: 0a 2a 2a 0a 2a 2a 20 20 43 6c 6f 73 69 6e 67 20  .**.**  Closing 
0d50: 61 20 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 2a  a Transaction:.*
0d60: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 61 20 74 72  *.**   When a tr
0d70: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6c 6f  ansaction is clo
0d80: 73 65 64 2c 20 61 6c 6c 20 64 61 74 61 20 63 6f  sed, all data co
0d90: 6c 6c 65 63 74 65 64 20 61 74 20 74 68 65 20 73  llected at the s
0da0: 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 74 68 65  tart of.**   the
0db0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72   transaction, or
0dc0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20 78 53   following an xS
0dd0: 79 6e 63 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c  ync of a journal
0de0: 2d 66 69 6c 65 2c 20 69 73 20 0a 2a 2a 20 20 20  -file, is .**   
0df0: 64 69 73 63 61 72 64 65 64 2e 20 54 68 65 20 65  discarded. The e
0e00: 6e 64 20 6f 66 20 61 20 74 72 61 6e 73 61 63 74  nd of a transact
0e10: 69 6f 6e 20 69 73 20 72 65 63 6f 67 6e 69 7a 65  ion is recognize
0e20: 64 20 77 68 65 6e 20 61 6e 79 20 6f 6e 65 20 0a  d when any one .
0e30: 2a 2a 20 20 20 6f 66 20 74 68 65 20 66 6f 6c 6c  **   of the foll
0e40: 6f 77 69 6e 67 20 6f 63 63 75 72 3a 0a 2a 2a 0a  owing occur:.**.
0e50: 2a 2a 20 20 20 20 20 61 29 20 41 20 62 6c 6f 63  **     a) A bloc
0e60: 6b 20 6f 66 20 7a 65 72 6f 65 73 20 28 6f 72 20  k of zeroes (or 
0e70: 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20 74 68  anything else th
0e80: 61 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69  at is not a vali
0e90: 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 6a 6f 75  d .**        jou
0ea0: 72 6e 61 6c 2d 68 65 61 64 65 72 29 20 69 73 20  rnal-header) is 
0eb0: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73  written to the s
0ec0: 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
0ed0: 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
0ee0: 20 20 20 20 62 29 20 41 20 6a 6f 75 72 6e 61 6c      b) A journal
0ef0: 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
0f00: 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
0f10: 20 69 6e 20 73 69 7a 65 20 75 73 69 6e 67 20 78   in size using x
0f20: 54 72 75 6e 63 61 74 65 2e 0a 2a 2a 0a 2a 2a 20  Truncate..**.** 
0f30: 20 20 20 20 63 29 20 54 68 65 20 6a 6f 75 72 6e      c) The journ
0f40: 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c 65 74  al file is delet
0f50: 65 64 20 75 73 69 6e 67 20 78 44 65 6c 65 74 65  ed using xDelete
0f60: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 78 69  ..*/../*.** Maxi
0f70: 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c 65 6e  mum pathname len
0f80: 67 74 68 20 73 75 70 70 6f 72 74 65 64 20 62 79  gth supported by
0f90: 20 74 68 65 20 6a 74 20 62 61 63 6b 65 6e 64 2e   the jt backend.
0fa0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 54 5f 4d  .*/.#define JT_M
0fb0: 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31 32 0a  AX_PATHNAME 512.
0fc0: 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 75 73 65 64  ./*.** Name used
0fd0: 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74 68 69   to identify thi
0fe0: 73 20 56 46 53 2e 0a 2a 2f 0a 23 64 65 66 69 6e  s VFS..*/.#defin
0ff0: 65 20 4a 54 5f 56 46 53 5f 4e 41 4d 45 20 22 6a  e JT_VFS_NAME "j
1000: 74 22 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  t"..typedef stru
1010: 63 74 20 6a 74 5f 66 69 6c 65 20 6a 74 5f 66 69  ct jt_file jt_fi
1020: 6c 65 3b 0a 73 74 72 75 63 74 20 6a 74 5f 66 69  le;.struct jt_fi
1030: 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66  le {.  sqlite3_f
1040: 69 6c 65 20 62 61 73 65 3b 0a 20 20 63 6f 6e 73  ile base;.  cons
1050: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20  t char *zName;  
1060: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
1070: 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20 20 69  open file */.  i
1080: 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nt flags;       
1090: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
10a0: 20 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70   the file was op
10b0: 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 0a 20 20  ened with */..  
10c0: 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  /* The following
10d0: 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 62   are only used b
10e0: 79 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  y database file 
10f0: 66 69 6c 65 20 68 61 6e 64 6c 65 73 20 2a 2f 0a  file handles */.
1100: 20 20 69 6e 74 20 65 4c 6f 63 6b 3b 20 20 20 20    int eLock;    
1110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
1120: 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c 64 20  rrent lock held 
1130: 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20  on the file */. 
1140: 20 75 33 32 20 6e 50 61 67 65 3b 20 20 20 20 20   u32 nPage;     
1150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
1160: 65 20 6f 66 20 66 69 6c 65 20 69 6e 20 70 61 67  e of file in pag
1170: 65 73 20 77 68 65 6e 20 74 72 61 6e 73 61 63 74  es when transact
1180: 69 6f 6e 20 73 74 61 72 74 65 64 20 2a 2f 0a 20  ion started */. 
1190: 20 75 33 32 20 6e 50 61 67 65 73 69 7a 65 3b 20   u32 nPagesize; 
11a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
11b0: 65 20 73 69 7a 65 20 77 68 65 6e 20 74 72 61 6e  e size when tran
11c0: 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65 64 20  saction started 
11d0: 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 57 72  */.  Bitvec *pWr
11e0: 69 74 61 62 6c 65 3b 20 20 20 20 20 20 20 2f 2a  itable;       /*
11f0: 20 42 69 74 76 65 63 20 6f 66 20 70 61 67 65 73   Bitvec of pages
1200: 20 74 68 61 74 20 6d 61 79 20 62 65 20 77 72 69   that may be wri
1210: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
1220: 20 2a 2f 0a 20 20 75 33 32 20 2a 61 43 6b 73 75   */.  u32 *aCksu
1230: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;             /
1240: 2a 20 43 68 65 63 6b 73 75 6d 20 66 6f 72 20 66  * Checksum for f
1250: 69 72 73 74 20 6e 50 61 67 65 20 70 61 67 65 73  irst nPage pages
1260: 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 79 6e 63 3b   */.  int nSync;
1270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1280: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69 6d 65  * Number of time
1290: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  s journal file h
12a0: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 2a  as been synced *
12b0: 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 75 73 65  /..  /* Only use
12c0: 64 20 62 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d by journal fil
12d0: 65 2d 68 61 6e 64 6c 65 73 20 2a 2f 0a 20 20 73  e-handles */.  s
12e0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4d 61  qlite3_int64 iMa
12f0: 78 4f 66 66 3b 20 20 20 2f 2a 20 4d 61 78 69 6d  xOff;   /* Maxim
1300: 75 6d 20 6f 66 66 73 65 74 20 77 72 69 74 74 65  um offset writte
1310: 6e 20 74 6f 20 74 68 69 73 20 74 72 61 6e 73 61  n to this transa
1320: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 6a 74 5f 66  ction */..  jt_f
1330: 69 6c 65 20 2a 70 4e 65 78 74 3b 20 20 20 20 20  ile *pNext;     
1340: 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69 6c 65       /* All file
1350: 73 20 61 72 65 20 73 74 6f 72 65 64 20 69 6e 20  s are stored in 
1360: 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 2a 2f  a linked list */
1370: 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  .  sqlite3_file 
1380: 2a 70 52 65 61 6c 3b 20 20 20 20 20 2f 2a 20 54  *pReal;     /* T
1390: 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66  he file handle f
13a0: 6f 72 20 74 68 65 20 75 6e 64 65 72 6c 79 69 6e  or the underlyin
13b0: 67 20 76 66 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  g vfs */.};../*.
13c0: 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c 61 72  ** Method declar
13d0: 61 74 69 6f 6e 73 20 66 6f 72 20 6a 74 5f 66 69  ations for jt_fi
13e0: 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  le..*/.static in
13f0: 74 20 6a 74 43 6c 6f 73 65 28 73 71 6c 69 74 65  t jtClose(sqlite
1400: 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74 69 63  3_file*);.static
1410: 20 69 6e 74 20 6a 74 52 65 61 64 28 73 71 6c 69   int jtRead(sqli
1420: 74 65 33 5f 66 69 6c 65 2a 2c 20 76 6f 69 64 2a  te3_file*, void*
1430: 2c 20 69 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69  , int iAmt, sqli
1440: 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 29  te3_int64 iOfst)
1450: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 57  ;.static int jtW
1460: 72 69 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  rite(sqlite3_fil
1470: 65 2a 2c 63 6f 6e 73 74 20 76 6f 69 64 2a 2c 69  e*,const void*,i
1480: 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69 74 65 33  nt iAmt, sqlite3
1490: 5f 69 6e 74 36 34 20 69 4f 66 73 74 29 3b 0a 73  _int64 iOfst);.s
14a0: 74 61 74 69 63 20 69 6e 74 20 6a 74 54 72 75 6e  tatic int jtTrun
14b0: 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
14c0: 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  e*, sqlite3_int6
14d0: 34 20 73 69 7a 65 29 3b 0a 73 74 61 74 69 63 20  4 size);.static 
14e0: 69 6e 74 20 6a 74 53 79 6e 63 28 73 71 6c 69 74  int jtSync(sqlit
14f0: 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 66 6c  e3_file*, int fl
1500: 61 67 73 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ags);.static int
1510: 20 6a 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69   jtFileSize(sqli
1520: 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c 69 74  te3_file*, sqlit
1530: 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a 65 29  e3_int64 *pSize)
1540: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 4c  ;.static int jtL
1550: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
1560: 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69 63 20  *, int);.static 
1570: 69 6e 74 20 6a 74 55 6e 6c 6f 63 6b 28 73 71 6c  int jtUnlock(sql
1580: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 29  ite3_file*, int)
1590: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 43  ;.static int jtC
15a0: 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b  heckReservedLock
15b0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
15c0: 69 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69  int *);.static i
15d0: 6e 74 20 6a 74 46 69 6c 65 43 6f 6e 74 72 6f 6c  nt jtFileControl
15e0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20  (sqlite3_file*, 
15f0: 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41  int op, void *pA
1600: 72 67 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  rg);.static int 
1610: 6a 74 53 65 63 74 6f 72 53 69 7a 65 28 73 71 6c  jtSectorSize(sql
1620: 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61  ite3_file*);.sta
1630: 74 69 63 20 69 6e 74 20 6a 74 44 65 76 69 63 65  tic int jtDevice
1640: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1650: 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a  sqlite3_file*);.
1660: 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64 20 64 65  ./*.** Method de
1670: 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 6a  clarations for j
1680: 74 5f 76 66 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  t_vfs..*/.static
1690: 20 69 6e 74 20 6a 74 4f 70 65 6e 28 73 71 6c 69   int jtOpen(sqli
16a0: 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20  te3_vfs*, const 
16b0: 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65 33 5f  char *, sqlite3_
16c0: 66 69 6c 65 2a 2c 20 69 6e 74 20 2c 20 69 6e 74  file*, int , int
16d0: 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20   *);.static int 
16e0: 6a 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  jtDelete(sqlite3
16f0: 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68 61  _vfs*, const cha
1700: 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 73 79  r *zName, int sy
1710: 6e 63 44 69 72 29 3b 0a 73 74 61 74 69 63 20 69  ncDir);.static i
1720: 6e 74 20 6a 74 41 63 63 65 73 73 28 73 71 6c 69  nt jtAccess(sqli
1730: 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20  te3_vfs*, const 
1740: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
1750: 20 66 6c 61 67 73 2c 20 69 6e 74 20 2a 29 3b 0a   flags, int *);.
1760: 73 74 61 74 69 63 20 69 6e 74 20 6a 74 46 75 6c  static int jtFul
1770: 6c 50 61 74 68 6e 61 6d 65 28 73 71 6c 69 74 65  lPathname(sqlite
1780: 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63 68  3_vfs*, const ch
1790: 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 2c 20  ar *zName, int, 
17a0: 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61  char *zOut);.sta
17b0: 74 69 63 20 76 6f 69 64 20 2a 6a 74 44 6c 4f 70  tic void *jtDlOp
17c0: 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  en(sqlite3_vfs*,
17d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
17e0: 6c 65 6e 61 6d 65 29 3b 0a 73 74 61 74 69 63 20  lename);.static 
17f0: 76 6f 69 64 20 6a 74 44 6c 45 72 72 6f 72 28 73  void jtDlError(s
1800: 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74  qlite3_vfs*, int
1810: 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45   nByte, char *zE
1820: 72 72 4d 73 67 29 3b 0a 73 74 61 74 69 63 20 76  rrMsg);.static v
1830: 6f 69 64 20 28 2a 6a 74 44 6c 53 79 6d 28 73 71  oid (*jtDlSym(sq
1840: 6c 69 74 65 33 5f 76 66 73 2a 2c 76 6f 69 64 2a  lite3_vfs*,void*
1850: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  , const char *zS
1860: 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 3b 0a 73  ymbol))(void);.s
1870: 74 61 74 69 63 20 76 6f 69 64 20 6a 74 44 6c 43  tatic void jtDlC
1880: 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lose(sqlite3_vfs
1890: 2a 2c 20 76 6f 69 64 2a 29 3b 0a 73 74 61 74 69  *, void*);.stati
18a0: 63 20 69 6e 74 20 6a 74 52 61 6e 64 6f 6d 6e 65  c int jtRandomne
18b0: 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c  ss(sqlite3_vfs*,
18c0: 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72   int nByte, char
18d0: 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69 63 20   *zOut);.static 
18e0: 69 6e 74 20 6a 74 53 6c 65 65 70 28 73 71 6c 69  int jtSleep(sqli
18f0: 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20 6d 69  te3_vfs*, int mi
1900: 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 73 74 61  croseconds);.sta
1910: 74 69 63 20 69 6e 74 20 6a 74 43 75 72 72 65 6e  tic int jtCurren
1920: 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
1930: 73 2a 2c 20 64 6f 75 62 6c 65 2a 29 3b 0a 0a 73  s*, double*);..s
1940: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66  tatic sqlite3_vf
1950: 73 20 6a 74 5f 76 66 73 20 3d 20 7b 0a 20 20 31  s jt_vfs = {.  1
1960: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1980: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 73   iVersion */.  s
1990: 69 7a 65 6f 66 28 6a 74 5f 66 69 6c 65 29 2c 20  izeof(jt_file), 
19a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19b0: 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20 20 4a   szOsFile */.  J
19c0: 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2c 20  T_MAX_PATHNAME, 
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
19e0: 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f 0a 20   mxPathname */. 
19f0: 20 30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   0,             
1a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a10: 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20 4a 54  /* pNext */.  JT
1a20: 5f 56 46 53 5f 4e 41 4d 45 2c 20 20 20 20 20 20  _VFS_NAME,      
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1a40: 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c 20 20 20  zName */.  0,   
1a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 70 41 70            /* pAp
1a70: 70 44 61 74 61 20 2a 2f 0a 20 20 6a 74 4f 70 65  pData */.  jtOpe
1a80: 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n,              
1a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 4f 70            /* xOp
1aa0: 65 6e 20 2a 2f 0a 20 20 6a 74 44 65 6c 65 74 65  en */.  jtDelete
1ab0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1ac0: 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c 65 74         /* xDelet
1ad0: 65 20 2a 2f 0a 20 20 6a 74 41 63 63 65 73 73 2c  e */.  jtAccess,
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65 73 73        /* xAccess
1b00: 20 2a 2f 0a 20 20 6a 74 46 75 6c 6c 50 61 74 68   */.  jtFullPath
1b10: 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 20 20  name,           
1b20: 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50 61 74       /* xFullPat
1b30: 68 6e 61 6d 65 20 2a 2f 0a 20 20 6a 74 44 6c 4f  hname */.  jtDlO
1b40: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
1b50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c            /* xDl
1b60: 4f 70 65 6e 20 2a 2f 0a 20 20 6a 74 44 6c 45 72  Open */.  jtDlEr
1b70: 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  ror,            
1b80: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 45           /* xDlE
1b90: 72 72 6f 72 20 2a 2f 0a 20 20 6a 74 44 6c 53 79  rror */.  jtDlSy
1ba0: 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m,              
1bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 53           /* xDlS
1bc0: 79 6d 20 2a 2f 0a 20 20 6a 74 44 6c 43 6c 6f 73  ym */.  jtDlClos
1bd0: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1be0: 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43 6c 6f         /* xDlClo
1bf0: 73 65 20 2a 2f 0a 20 20 6a 74 52 61 6e 64 6f 6d  se */.  jtRandom
1c00: 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20 20 20  ness,           
1c10: 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e 64 6f         /* xRando
1c20: 6d 6e 65 73 73 20 2a 2f 0a 20 20 6a 74 53 6c 65  mness */.  jtSle
1c30: 65 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ep,             
1c40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 53 6c            /* xSl
1c50: 65 65 70 20 2a 2f 0a 20 20 6a 74 43 75 72 72 65  eep */.  jtCurre
1c60: 6e 74 54 69 6d 65 20 20 20 20 20 20 20 20 20 20  ntTime          
1c70: 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75 72 72          /* xCurr
1c80: 65 6e 74 54 69 6d 65 20 2a 2f 0a 7d 3b 0a 0a 73  entTime */.};..s
1c90: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6f  tatic sqlite3_io
1ca0: 5f 6d 65 74 68 6f 64 73 20 6a 74 5f 69 6f 5f 6d  _methods jt_io_m
1cb0: 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 31 2c 20  ethods = {.  1, 
1cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69              /* i
1ce0: 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 6a 74 43  Version */.  jtC
1cf0: 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  lose,           
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1d10: 43 6c 6f 73 65 20 2a 2f 0a 20 20 6a 74 52 65 61  Close */.  jtRea
1d20: 64 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d,              
1d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 65            /* xRe
1d40: 61 64 20 2a 2f 0a 20 20 6a 74 57 72 69 74 65 2c  ad */.  jtWrite,
1d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d60: 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69 74 65         /* xWrite
1d70: 20 2a 2f 0a 20 20 6a 74 54 72 75 6e 63 61 74 65   */.  jtTruncate
1d80: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1d90: 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63 61 74       /* xTruncat
1da0: 65 20 2a 2f 0a 20 20 6a 74 53 79 6e 63 2c 20 20  e */.  jtSync,  
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 20 2f 2a 20 78 53 79 6e 63 20 2a        /* xSync *
1dd0: 2f 0a 20 20 6a 74 46 69 6c 65 53 69 7a 65 2c 20  /.  jtFileSize, 
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a 65 20     /* xFileSize 
1e00: 2a 2f 0a 20 20 6a 74 4c 6f 63 6b 2c 20 20 20 20  */.  jtLock,    
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a 2f 0a      /* xLock */.
1e30: 20 20 6a 74 55 6e 6c 6f 63 6b 2c 20 20 20 20 20    jtUnlock,     
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f 0a 20   /* xUnlock */. 
1e60: 20 6a 74 43 68 65 63 6b 52 65 73 65 72 76 65 64   jtCheckReserved
1e70: 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20 20 20  Lock,           
1e80: 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72 76 65  /* xCheckReserve
1e90: 64 4c 6f 63 6b 20 2a 2f 0a 20 20 6a 74 46 69 6c  dLock */.  jtFil
1ea0: 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20 20 20  eControl,       
1eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 46 69            /* xFi
1ec0: 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20 20 6a  leControl */.  j
1ed0: 74 53 65 63 74 6f 72 53 69 7a 65 2c 20 20 20 20  tSectorSize,    
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ef0: 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a 2f 0a   xSectorSize */.
1f00: 20 20 6a 74 44 65 76 69 63 65 43 68 61 72 61 63    jtDeviceCharac
1f10: 74 65 72 69 73 74 69 63 73 20 20 20 20 20 20 20  teristics       
1f20: 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61 72 61   /* xDeviceChara
1f30: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 7d 3b  cteristics */.};
1f40: 0a 0a 73 74 72 75 63 74 20 4a 74 47 6c 6f 62 61  ..struct JtGloba
1f50: 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  l {.  sqlite3_vf
1f60: 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20 20 20  s *pVfs;        
1f70: 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74 20 56       /* Parent V
1f80: 46 53 20 2a 2f 0a 20 20 6a 74 5f 66 69 6c 65 20  FS */.  jt_file 
1f90: 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20 20 20  *pList;         
1fa0: 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f         /* List o
1fb0: 66 20 61 6c 6c 20 6f 70 65 6e 20 66 69 6c 65 73  f all open files
1fc0: 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20 73 74   */.};.static st
1fd0: 72 75 63 74 20 4a 74 47 6c 6f 62 61 6c 20 67 20  ruct JtGlobal g 
1fe0: 3d 20 7b 30 2c 20 30 7d 3b 0a 0a 2f 2a 0a 2a 2a  = {0, 0};../*.**
1ff0: 20 54 68 65 20 6a 74 5f 66 69 6c 65 20 70 6f 69   The jt_file poi
2000: 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 61  nted to by the a
2010: 72 67 75 6d 65 6e 74 20 6d 61 79 20 6f 72 20 6d  rgument may or m
2020: 61 79 20 6e 6f 74 20 62 65 20 61 20 66 69 6c 65  ay not be a file
2030: 2d 68 61 6e 64 6c 65 0a 2a 2a 20 6f 70 65 6e 20  -handle.** open 
2040: 6f 6e 20 61 20 6d 61 69 6e 20 64 61 74 61 62 61  on a main databa
2050: 73 65 20 66 69 6c 65 2e 20 49 66 20 69 74 20 69  se file. If it i
2060: 73 2c 20 61 6e 64 20 61 20 74 72 61 6e 73 61 63  s, and a transac
2070: 74 69 6f 6e 20 69 73 20 63 75 72 72 65 6e 74 6c  tion is currentl
2080: 79 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 74  y.** opened on t
2090: 68 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 64 69  he file, then di
20a0: 73 63 61 72 64 20 61 6c 6c 20 74 72 61 6e 73 61  scard all transa
20b0: 63 74 69 6f 6e 20 72 65 6c 61 74 65 64 20 64 61  ction related da
20c0: 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ta..*/.static vo
20d0: 69 64 20 63 6c 6f 73 65 54 72 61 6e 73 61 63 74  id closeTransact
20e0: 69 6f 6e 28 6a 74 5f 66 69 6c 65 20 2a 70 29 7b  ion(jt_file *p){
20f0: 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
2100: 44 65 73 74 72 6f 79 28 70 2d 3e 70 57 72 69 74  Destroy(p->pWrit
2110: 61 62 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33  able);.  sqlite3
2120: 5f 66 72 65 65 28 70 2d 3e 61 43 6b 73 75 6d 29  _free(p->aCksum)
2130: 3b 0a 20 20 70 2d 3e 70 57 72 69 74 61 62 6c 65  ;.  p->pWritable
2140: 20 3d 20 30 3b 0a 20 20 70 2d 3e 61 43 6b 73 75   = 0;.  p->aCksu
2150: 6d 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 53 79 6e  m = 0;.  p->nSyn
2160: 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  c = 0;.}../*.** 
2170: 43 6c 6f 73 65 20 61 6e 20 6a 74 2d 66 69 6c 65  Close an jt-file
2180: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2190: 6a 74 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  jtClose(sqlite3_
21a0: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
21b0: 6a 74 5f 66 69 6c 65 20 2a 2a 70 70 3b 0a 20 20  jt_file **pp;.  
21c0: 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74  jt_file *p = (jt
21d0: 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 0a  _file *)pFile;..
21e0: 20 20 63 6c 6f 73 65 54 72 61 6e 73 61 63 74 69    closeTransacti
21f0: 6f 6e 28 70 29 3b 0a 20 20 69 66 28 20 70 2d 3e  on(p);.  if( p->
2200: 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 66 6f 72  zName ){.    for
2210: 28 70 70 3d 26 67 2e 70 4c 69 73 74 3b 20 2a 70  (pp=&g.pList; *p
2220: 70 21 3d 70 3b 20 70 70 3d 26 28 2a 70 70 29 2d  p!=p; pp=&(*pp)-
2230: 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 2a 70 70  >pNext);.    *pp
2240: 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d   = p->pNext;.  }
2250: 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ..  return sqlit
2260: 65 33 4f 73 43 6c 6f 73 65 28 70 2d 3e 70 52 65  e3OsClose(p->pRe
2270: 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  al);.}../*.** Re
2280: 61 64 20 64 61 74 61 20 66 72 6f 6d 20 61 6e 20  ad data from an 
2290: 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  jt-file..*/.stat
22a0: 69 63 20 69 6e 74 20 6a 74 52 65 61 64 28 0a 20  ic int jtRead(. 
22b0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
22c0: 46 69 6c 65 2c 20 0a 20 20 76 6f 69 64 20 2a 7a  File, .  void *z
22d0: 42 75 66 2c 20 0a 20 20 69 6e 74 20 69 41 6d 74  Buf, .  int iAmt
22e0: 2c 20 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36  , .  sqlite_int6
22f0: 34 20 69 4f 66 73 74 0a 29 7b 0a 20 20 6a 74 5f  4 iOfst.){.  jt_
2300: 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f 66 69  file *p = (jt_fi
2310: 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20 72 65  le *)pFile;.  re
2320: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 52 65  turn sqlite3OsRe
2330: 61 64 28 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75  ad(p->pReal, zBu
2340: 66 2c 20 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b  f, iAmt, iOfst);
2350: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  .}.../*.** Param
2360: 65 74 65 72 20 7a 4a 6f 75 72 6e 61 6c 20 69 73  eter zJournal is
2370: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6a   the name of a j
2380: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74  ournal file that
2390: 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 0a 2a   is currently .*
23a0: 2a 20 6f 70 65 6e 2e 20 54 68 69 73 20 66 75 6e  * open. This fun
23b0: 63 74 69 6f 6e 20 6c 6f 63 61 74 65 73 20 61 6e  ction locates an
23c0: 64 20 72 65 74 75 72 6e 73 20 74 68 65 20 68 61  d returns the ha
23d0: 6e 64 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 74  ndle opened on t
23e0: 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70 6f 6e 64  he.** correspond
23f0: 69 6e 67 20 64 61 74 61 62 61 73 65 20 66 69 6c  ing database fil
2400: 65 20 62 79 20 74 68 65 20 70 61 67 65 72 20 74  e by the pager t
2410: 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20 68 61  hat currently ha
2420: 73 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  s the.** journal
2430: 20 66 69 6c 65 20 6f 70 65 6e 65 64 2e 20 54 68   file opened. Th
2440: 69 73 20 66 69 6c 65 2d 68 61 6e 64 6c 65 20 69  is file-handle i
2450: 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20  s identified by 
2460: 74 68 65 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  the .** followin
2470: 67 20 70 72 6f 70 65 72 74 69 65 73 3a 0a 2a 2a  g properties:.**
2480: 0a 2a 2a 20 20 20 61 29 20 53 51 4c 49 54 45 5f  .**   a) SQLITE_
2490: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 20 77 61 73  OPEN_MAIN_DB was
24a0: 20 73 70 65 63 69 66 69 65 64 20 77 68 65 6e 20   specified when 
24b0: 74 68 65 20 66 69 6c 65 20 77 61 73 20 6f 70 65  the file was ope
24c0: 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 62 29 20  ned..**.**   b) 
24d0: 54 68 65 20 66 69 6c 65 2d 6e 61 6d 65 20 73 70  The file-name sp
24e0: 65 63 69 66 69 65 64 20 77 68 65 6e 20 74 68 65  ecified when the
24f0: 20 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64   file was opened
2500: 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20 20 20 20   matches.**     
2510: 20 61 6c 6c 20 62 75 74 20 74 68 65 20 66 69 6e   all but the fin
2520: 61 6c 20 38 20 63 68 61 72 61 63 74 65 72 73 20  al 8 characters 
2530: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2540: 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ile name..**.** 
2550: 20 20 63 29 20 54 68 65 72 65 20 69 73 20 63 75    c) There is cu
2560: 72 72 65 6e 74 6c 79 20 61 20 72 65 73 65 72 76  rrently a reserv
2570: 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  ed lock on the f
2580: 69 6c 65 2e 0a 2a 2a 2f 0a 73 74 61 74 69 63 20  ile..**/.static 
2590: 6a 74 5f 66 69 6c 65 20 2a 6c 6f 63 61 74 65 44  jt_file *locateD
25a0: 61 74 61 62 61 73 65 48 61 6e 64 6c 65 28 63 6f  atabaseHandle(co
25b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e  nst char *zJourn
25c0: 61 6c 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a  al){.  jt_file *
25d0: 70 4d 61 69 6e 20 3d 20 30 3b 0a 20 20 66 6f 72  pMain = 0;.  for
25e0: 28 70 4d 61 69 6e 3d 67 2e 70 4c 69 73 74 3b 20  (pMain=g.pList; 
25f0: 70 4d 61 69 6e 3b 20 70 4d 61 69 6e 3d 70 4d 61  pMain; pMain=pMa
2600: 69 6e 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  in->pNext){.    
2610: 69 6e 74 20 6e 4e 61 6d 65 20 3d 20 73 74 72 6c  int nName = strl
2620: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 20 2d 20 73  en(zJournal) - s
2630: 74 72 6c 65 6e 28 22 2d 6a 6f 75 72 6e 61 6c 22  trlen("-journal"
2640: 29 3b 0a 20 20 20 20 69 66 28 20 28 70 4d 61 69  );.    if( (pMai
2650: 6e 2d 3e 66 6c 61 67 73 26 53 51 4c 49 54 45 5f  n->flags&SQLITE_
2660: 4f 50 45 4e 5f 4d 41 49 4e 5f 44 42 29 0a 20 20  OPEN_MAIN_DB).  
2670: 20 20 20 26 26 20 28 73 74 72 6c 65 6e 28 70 4d     && (strlen(pM
2680: 61 69 6e 2d 3e 7a 4e 61 6d 65 29 3d 3d 6e 4e 61  ain->zName)==nNa
2690: 6d 65 29 0a 20 20 20 20 20 26 26 20 30 3d 3d 6d  me).     && 0==m
26a0: 65 6d 63 6d 70 28 70 4d 61 69 6e 2d 3e 7a 4e 61  emcmp(pMain->zNa
26b0: 6d 65 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 6e 4e  me, zJournal, nN
26c0: 61 6d 65 29 0a 20 20 20 20 20 26 26 20 28 70 4d  ame).     && (pM
26d0: 61 69 6e 2d 3e 65 4c 6f 63 6b 3e 3d 53 51 4c 49  ain->eLock>=SQLI
26e0: 54 45 5f 4c 4f 43 4b 5f 52 45 53 45 52 56 45 44  TE_LOCK_RESERVED
26f0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 62  ).    ){.      b
2700: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
2710: 20 20 72 65 74 75 72 6e 20 70 4d 61 69 6e 3b 0a    return pMain;.
2720: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74  }../*.** Paramet
2730: 65 72 20 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61  er z points to a
2740: 20 62 75 66 66 65 72 20 6f 66 20 34 20 62 79 74   buffer of 4 byt
2750: 65 73 20 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61  es in size conta
2760: 69 6e 69 6e 67 20 61 20 0a 2a 2a 20 75 6e 73 69  ining a .** unsi
2770: 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65  gned 32-bit inte
2780: 67 65 72 20 73 74 6f 72 65 64 20 69 6e 20 62 69  ger stored in bi
2790: 67 2d 65 6e 64 69 61 6e 20 66 6f 72 6d 61 74 2e  g-endian format.
27a0: 20 44 65 63 6f 64 65 20 74 68 65 20 0a 2a 2a 20   Decode the .** 
27b0: 69 6e 74 65 67 65 72 20 61 6e 64 20 72 65 74 75  integer and retu
27c0: 72 6e 20 69 74 73 20 76 61 6c 75 65 2e 0a 2a 2f  rn its value..*/
27d0: 0a 73 74 61 74 69 63 20 75 33 32 20 64 65 63 6f  .static u32 deco
27e0: 64 65 55 69 6e 74 33 32 28 63 6f 6e 73 74 20 75  deUint32(const u
27f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 29  nsigned char *z)
2800: 7b 0a 20 20 72 65 74 75 72 6e 20 28 7a 5b 30 5d  {.  return (z[0]
2810: 3c 3c 32 34 29 20 2b 20 28 7a 5b 31 5d 3c 3c 31  <<24) + (z[1]<<1
2820: 36 29 20 2b 20 28 7a 5b 32 5d 3c 3c 38 29 20 2b  6) + (z[2]<<8) +
2830: 20 7a 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   z[3];.}../*.** 
2840: 43 61 6c 63 75 6c 61 74 65 20 61 20 63 68 65 63  Calculate a chec
2850: 6b 73 75 6d 20 66 72 6f 6d 20 74 68 65 20 62 75  ksum from the bu
2860: 66 66 65 72 20 6f 66 20 6c 65 6e 67 74 68 20 6e  ffer of length n
2870: 20 62 79 74 65 73 20 70 6f 69 6e 74 65 64 20 74   bytes pointed t
2880: 6f 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65  o.** by paramete
2890: 72 20 7a 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75  r z..*/.static u
28a0: 33 32 20 67 65 6e 43 6b 73 75 6d 28 63 6f 6e 73  32 genCksum(cons
28b0: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
28c0: 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e  *z, int n){.  in
28d0: 74 20 69 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d  t i;.  u32 cksum
28e0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b   = 0;.  for(i=0;
28f0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
2900: 63 6b 73 75 6d 20 3d 20 63 6b 73 75 6d 20 2b 20  cksum = cksum + 
2910: 7a 5b 69 5d 20 2b 20 28 63 6b 73 75 6d 3c 3c 33  z[i] + (cksum<<3
2920: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
2930: 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  cksum;.}../*.** 
2940: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
2950: 6e 74 2c 20 7a 42 75 66 2c 20 70 6f 69 6e 74 73  nt, zBuf, points
2960: 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
2970: 74 61 69 6e 69 6e 67 20 61 20 32 38 20 62 79 74  taining a 28 byt
2980: 65 0a 2a 2a 20 73 65 72 69 61 6c 69 7a 65 64 20  e.** serialized 
2990: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20  journal header. 
29a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64 65  This function de
29b0: 73 65 72 69 61 6c 69 7a 65 73 20 66 6f 75 72 20  serializes four 
29c0: 6f 66 20 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65  of the.** intege
29d0: 72 20 66 69 65 6c 64 73 20 63 6f 6e 74 61 69 6e  r fields contain
29e0: 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed in the journa
29f0: 6c 20 68 65 61 64 65 72 20 61 6e 64 20 77 72 69  l header and wri
2a00: 74 65 73 20 74 68 65 69 72 0a 2a 2a 20 76 61 6c  tes their.** val
2a10: 75 65 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75  ues to the outpu
2a20: 74 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  t variables..**.
2a30: 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
2a40: 72 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20  returned if the 
2a50: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
2a60: 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 0a  s successfully .
2a70: 2a 2a 20 64 65 63 6f 64 65 64 2e 20 4f 74 68 65  ** decoded. Othe
2a80: 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 45 52  rwise, SQLITE_ER
2a90: 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROR..*/.static i
2aa0: 6e 74 20 64 65 63 6f 64 65 4a 6f 75 72 6e 61 6c  nt decodeJournal
2ab0: 48 64 72 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73  Hdr(.  const uns
2ac0: 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 42 75 66  igned char *zBuf
2ad0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 70  ,         /* Inp
2ae0: 75 74 3a 20 32 38 20 62 79 74 65 20 6a 6f 75 72  ut: 28 byte jour
2af0: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
2b00: 75 33 32 20 2a 70 6e 52 65 63 2c 20 20 20 20 20  u32 *pnRec,     
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b20: 20 20 20 2f 2a 20 4f 75 74 3a 20 4e 75 6d 62 65     /* Out: Numbe
2b30: 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 6c 65 64 20  r of journalled 
2b40: 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 75 33 32  records */.  u32
2b50: 20 2a 70 6e 50 61 67 65 2c 20 20 20 20 20 20 20   *pnPage,       
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 2f 2a 20 4f 75 74 3a 20 4f 72 69 67 69 6e 61 6c  /* Out: Original
2b80: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
2b90: 6f 75 6e 74 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ount */.  u32 *p
2ba0: 6e 53 65 63 74 6f 72 2c 20 20 20 20 20 20 20 20  nSector,        
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc0: 4f 75 74 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  Out: Sector size
2bd0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
2be0: 33 32 20 2a 70 6e 50 61 67 65 73 69 7a 65 20 20  32 *pnPagesize  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c00: 20 20 2f 2a 20 4f 75 74 3a 20 50 61 67 65 20 73    /* Out: Page s
2c10: 69 7a 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ize in bytes */.
2c20: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
2c30: 61 72 20 61 4d 61 67 69 63 5b 5d 20 3d 20 7b 20  ar aMagic[] = { 
2c40: 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35  0xd9, 0xd5, 0x05
2c50: 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78  , 0xf9, 0x20, 0x
2c60: 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37 20 7d  a1, 0x63, 0xd7 }
2c70: 3b 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61  ;.  if( memcmp(a
2c80: 4d 61 67 69 63 2c 20 7a 42 75 66 2c 20 38 29 20  Magic, zBuf, 8) 
2c90: 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
2ca0: 45 52 52 4f 52 3b 0a 20 20 69 66 28 20 70 6e 52  ERROR;.  if( pnR
2cb0: 65 63 20 29 20 2a 70 6e 52 65 63 20 3d 20 64 65  ec ) *pnRec = de
2cc0: 63 6f 64 65 55 69 6e 74 33 32 28 26 7a 42 75 66  codeUint32(&zBuf
2cd0: 5b 38 5d 29 3b 0a 20 20 69 66 28 20 70 6e 50 61  [8]);.  if( pnPa
2ce0: 67 65 20 29 20 2a 70 6e 50 61 67 65 20 3d 20 64  ge ) *pnPage = d
2cf0: 65 63 6f 64 65 55 69 6e 74 33 32 28 26 7a 42 75  ecodeUint32(&zBu
2d00: 66 5b 31 36 5d 29 3b 0a 20 20 69 66 28 20 70 6e  f[16]);.  if( pn
2d10: 53 65 63 74 6f 72 20 29 20 2a 70 6e 53 65 63 74  Sector ) *pnSect
2d20: 6f 72 20 3d 20 64 65 63 6f 64 65 55 69 6e 74 33  or = decodeUint3
2d30: 32 28 26 7a 42 75 66 5b 32 30 5d 29 3b 0a 20 20  2(&zBuf[20]);.  
2d40: 69 66 28 20 70 6e 50 61 67 65 73 69 7a 65 20 29  if( pnPagesize )
2d50: 20 2a 70 6e 50 61 67 65 73 69 7a 65 20 3d 20 64   *pnPagesize = d
2d60: 65 63 6f 64 65 55 69 6e 74 33 32 28 26 7a 42 75  ecodeUint32(&zBu
2d70: 66 5b 32 34 5d 29 3b 0a 20 20 72 65 74 75 72 6e  f[24]);.  return
2d80: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
2d90: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2da0: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  on is called whe
2db0: 6e 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74  n a new transact
2dc0: 69 6f 6e 20 69 73 20 6f 70 65 6e 65 64 2c 20 6a  ion is opened, j
2dd0: 75 73 74 20 61 66 74 65 72 0a 2a 2a 20 74 68 65  ust after.** the
2de0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
2df0: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
2e00: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
2e10: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
2e20: 69 6e 74 20 6f 70 65 6e 54 72 61 6e 73 61 63 74  int openTransact
2e30: 69 6f 6e 28 6a 74 5f 66 69 6c 65 20 2a 70 4d 61  ion(jt_file *pMa
2e40: 69 6e 2c 20 6a 74 5f 66 69 6c 65 20 2a 70 4a 6f  in, jt_file *pJo
2e50: 75 72 6e 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e  urnal){.  unsign
2e60: 65 64 20 63 68 61 72 20 2a 61 44 61 74 61 3b 0a  ed char *aData;.
2e70: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
2e80: 70 20 3d 20 70 4d 61 69 6e 2d 3e 70 52 65 61 6c  p = pMain->pReal
2e90: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
2ea0: 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61 44 61 74 61  ITE_OK;..  aData
2eb0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
2ec0: 63 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69  c(pMain->nPagesi
2ed0: 7a 65 29 3b 0a 20 20 70 4d 61 69 6e 2d 3e 70 57  ze);.  pMain->pW
2ee0: 72 69 74 61 62 6c 65 20 3d 20 73 71 6c 69 74 65  ritable = sqlite
2ef0: 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70 4d  3BitvecCreate(pM
2f00: 61 69 6e 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 70  ain->nPage);.  p
2f10: 4d 61 69 6e 2d 3e 61 43 6b 73 75 6d 20 3d 20 73  Main->aCksum = s
2f20: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69  qlite3_malloc(si
2f30: 7a 65 6f 66 28 75 33 32 29 20 2a 20 28 70 4d 61  zeof(u32) * (pMa
2f40: 69 6e 2d 3e 6e 50 61 67 65 20 2b 20 31 29 29 3b  in->nPage + 1));
2f50: 0a 20 20 70 4a 6f 75 72 6e 61 6c 2d 3e 69 4d 61  .  pJournal->iMa
2f60: 78 4f 66 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28  xOff = 0;..  if(
2f70: 20 21 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62   !pMain->pWritab
2f80: 6c 65 20 7c 7c 20 21 70 4d 61 69 6e 2d 3e 61 43  le || !pMain->aC
2f90: 6b 73 75 6d 20 7c 7c 20 21 61 44 61 74 61 20 29  ksum || !aData )
2fa0: 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
2fb0: 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
2fc0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4d 61 69 6e   }else if( pMain
2fd0: 2d 3e 6e 50 61 67 65 3e 30 20 29 7b 0a 20 20 20  ->nPage>0 ){.   
2fe0: 20 75 33 32 20 69 54 72 75 6e 6b 3b 0a 0a 20 20   u32 iTrunk;..  
2ff0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
3000: 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
3010: 2e 20 41 64 64 20 74 68 65 20 70 61 67 65 2d 6e  . Add the page-n
3020: 75 6d 62 65 72 20 66 6f 72 20 65 61 63 68 20 66  umber for each f
3030: 72 65 65 2d 6c 69 73 74 0a 20 20 20 20 2a 2a 20  ree-list.    ** 
3040: 6c 65 61 66 20 74 6f 20 74 68 65 20 6a 74 5f 66  leaf to the jt_f
3050: 69 6c 65 2e 70 57 72 69 74 61 62 6c 65 20 62 69  ile.pWritable bi
3060: 74 76 65 63 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tvec..    */.   
3070: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
3080: 65 61 64 28 70 2c 20 61 44 61 74 61 2c 20 70 4d  ead(p, aData, pM
3090: 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 2c 20  ain->nPagesize, 
30a0: 30 29 3b 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  0);.    iTrunk =
30b0: 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28 26 61   decodeUint32(&a
30c0: 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 77  Data[32]);.    w
30d0: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
30e0: 5f 4f 4b 20 26 26 20 69 54 72 75 6e 6b 3e 30 20  _OK && iTrunk>0 
30f0: 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 4c 65  ){.      u32 nLe
3100: 61 66 3b 0a 20 20 20 20 20 20 75 33 32 20 69 4c  af;.      u32 iL
3110: 65 61 66 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eaf;.      sqlit
3120: 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 20 3d 20  e3_int64 iOff = 
3130: 28 69 54 72 75 6e 6b 2d 31 29 2a 70 4d 61 69 6e  (iTrunk-1)*pMain
3140: 2d 3e 6e 50 61 67 65 73 69 7a 65 3b 0a 20 20 20  ->nPagesize;.   
3150: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
3160: 73 52 65 61 64 28 70 2c 20 61 44 61 74 61 2c 20  sRead(p, aData, 
3170: 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65  pMain->nPagesize
3180: 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 6e  , iOff);.      n
3190: 4c 65 61 66 20 3d 20 64 65 63 6f 64 65 55 69 6e  Leaf = decodeUin
31a0: 74 33 32 28 26 61 44 61 74 61 5b 34 5d 29 3b 0a  t32(&aData[4]);.
31b0: 20 20 20 20 20 20 66 6f 72 28 69 4c 65 61 66 3d        for(iLeaf=
31c0: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
31d0: 20 26 26 20 69 4c 65 61 66 3c 6e 4c 65 61 66 3b   && iLeaf<nLeaf;
31e0: 20 69 4c 65 61 66 2b 2b 29 7b 0a 20 20 20 20 20   iLeaf++){.     
31f0: 20 20 20 75 33 32 20 70 67 6e 6f 20 3d 20 64 65     u32 pgno = de
3200: 63 6f 64 65 55 69 6e 74 33 32 28 26 61 44 61 74  codeUint32(&aDat
3210: 61 5b 38 2b 34 2a 69 4c 65 61 66 5d 29 3b 0a 20  a[8+4*iLeaf]);. 
3220: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
3230: 74 76 65 63 53 65 74 28 70 4d 61 69 6e 2d 3e 70  tvecSet(pMain->p
3240: 57 72 69 74 61 62 6c 65 2c 20 70 67 6e 6f 29 3b  Writable, pgno);
3250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3260: 54 72 75 6e 6b 20 3d 20 64 65 63 6f 64 65 55 69  Trunk = decodeUi
3270: 6e 74 33 32 28 61 44 61 74 61 29 3b 0a 20 20 20  nt32(aData);.   
3280: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 75   }..    /* Calcu
3290: 6c 61 74 65 20 61 6e 64 20 73 74 6f 72 65 20 61  late and store a
32a0: 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 65 61   checksum for ea
32b0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
32c0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
32d0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
32e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32f0: 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
3300: 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
3310: 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 4d 61 69  TE_OK && ii<pMai
3320: 6e 2d 3e 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b  n->nPage; ii++){
3330: 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66  .        i64 iOf
3340: 66 20 3d 20 28 69 36 34 29 28 70 4d 61 69 6e 2d  f = (i64)(pMain-
3350: 3e 6e 50 61 67 65 73 69 7a 65 29 20 2a 20 28 69  >nPagesize) * (i
3360: 36 34 29 69 69 3b 0a 20 20 20 20 20 20 20 20 72  64)ii;.        r
3370: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
3380: 64 28 70 4d 61 69 6e 2d 3e 70 52 65 61 6c 2c 20  d(pMain->pReal, 
3390: 61 44 61 74 61 2c 20 70 4d 61 69 6e 2d 3e 6e 50  aData, pMain->nP
33a0: 61 67 65 73 69 7a 65 2c 20 69 4f 66 66 29 3b 0a  agesize, iOff);.
33b0: 20 20 20 20 20 20 20 20 70 4d 61 69 6e 2d 3e 61          pMain->a
33c0: 43 6b 73 75 6d 5b 69 69 5d 20 3d 20 67 65 6e 43  Cksum[ii] = genC
33d0: 6b 73 75 6d 28 61 44 61 74 61 2c 20 70 4d 61 69  ksum(aData, pMai
33e0: 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 29 3b 0a 20  n->nPagesize);. 
33f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
3400: 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
3410: 28 61 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72  (aData);.  retur
3420: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  n rc;.}../*.** W
3430: 72 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20  rite data to an 
3440: 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  jt-file..*/.stat
3450: 69 63 20 69 6e 74 20 6a 74 57 72 69 74 65 28 0a  ic int jtWrite(.
3460: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
3470: 70 46 69 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20  pFile, .  const 
3480: 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69  void *zBuf, .  i
3490: 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69  nt iAmt, .  sqli
34a0: 74 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29  te_int64 iOfst.)
34b0: 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d  {.  jt_file *p =
34c0: 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c   (jt_file *)pFil
34d0: 65 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67  e;.  if( p->flag
34e0: 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  s&SQLITE_OPEN_MA
34f0: 49 4e 5f 4a 4f 55 52 4e 41 4c 20 29 7b 0a 20 20  IN_JOURNAL ){.  
3500: 20 20 69 66 28 20 69 4f 66 73 74 3d 3d 30 20 29    if( iOfst==0 )
3510: 7b 0a 20 20 20 20 20 20 6a 74 5f 66 69 6c 65 20  {.      jt_file 
3520: 2a 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65 44  *pMain = locateD
3530: 61 74 61 62 61 73 65 48 61 6e 64 6c 65 28 70 2d  atabaseHandle(p-
3540: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 61  >zName);.      a
3550: 73 73 65 72 74 28 20 70 4d 61 69 6e 20 29 3b 0a  ssert( pMain );.
3560: 20 20 0a 20 20 20 20 20 20 69 66 28 20 64 65 63    .      if( dec
3570: 6f 64 65 4a 6f 75 72 6e 61 6c 48 64 72 28 7a 42  odeJournalHdr(zB
3580: 75 66 2c 20 30 2c 20 26 70 4d 61 69 6e 2d 3e 6e  uf, 0, &pMain->n
3590: 50 61 67 65 2c 20 30 2c 20 26 70 4d 61 69 6e 2d  Page, 0, &pMain-
35a0: 3e 6e 50 61 67 65 73 69 7a 65 29 20 29 7b 0a 20  >nPagesize) ){. 
35b0: 20 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 69 6e         /* Zeroin
35c0: 67 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  g the first jour
35d0: 6e 61 6c 2d 66 69 6c 65 20 68 65 61 64 65 72 2e  nal-file header.
35e0: 20 54 68 69 73 20 69 73 20 74 68 65 20 65 6e 64   This is the end
35f0: 20 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a   of a.        **
3600: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f   transaction. */
3610: 0a 20 20 20 20 20 20 20 20 63 6c 6f 73 65 54 72  .        closeTr
3620: 61 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e 29  ansaction(pMain)
3630: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
3640: 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 69 6e         /* Writin
3650: 67 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  g the first jour
3660: 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 61 20  nal header to a 
3670: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
3680: 69 73 20 68 61 70 70 65 6e 73 0a 20 20 20 20 20  is happens.     
3690: 20 20 20 2a 2a 20 77 68 65 6e 20 61 20 74 72 61     ** when a tra
36a0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72 73  nsaction is firs
36b0: 74 20 73 74 61 72 74 65 64 2e 20 20 2a 2f 0a 20  t started.  */. 
36c0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20         int rc;. 
36d0: 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54         if( SQLIT
36e0: 45 5f 4f 4b 21 3d 28 72 63 3d 6f 70 65 6e 54 72  E_OK!=(rc=openTr
36f0: 61 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e 2c  ansaction(pMain,
3700: 20 70 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20   p)) ){.        
3710: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
3720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3730: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
3740: 69 4d 61 78 4f 66 66 3c 28 69 4f 66 73 74 20 2b  iMaxOff<(iOfst +
3750: 20 69 41 6d 74 29 20 29 7b 0a 20 20 20 20 20 20   iAmt) ){.      
3760: 70 2d 3e 69 4d 61 78 4f 66 66 20 3d 20 69 4f 66  p->iMaxOff = iOf
3770: 73 74 20 2b 20 69 41 6d 74 3b 0a 20 20 20 20 7d  st + iAmt;.    }
3780: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 66  .  }..  if( p->f
3790: 6c 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e  lags&SQLITE_OPEN
37a0: 5f 4d 41 49 4e 5f 44 42 20 26 26 20 70 2d 3e 70  _MAIN_DB && p->p
37b0: 57 72 69 74 61 62 6c 65 20 29 7b 0a 20 20 20 20  Writable ){.    
37c0: 75 33 32 20 70 67 6e 6f 20 3d 20 69 4f 66 73 74  u32 pgno = iOfst
37d0: 2f 70 2d 3e 6e 50 61 67 65 73 69 7a 65 20 2b 20  /p->nPagesize + 
37e0: 31 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  1;..    assert( 
37f0: 69 41 6d 74 3d 3d 70 2d 3e 6e 50 61 67 65 73 69  iAmt==p->nPagesi
3800: 7a 65 20 26 26 20 28 69 4f 66 73 74 25 70 2d 3e  ze && (iOfst%p->
3810: 6e 50 61 67 65 73 69 7a 65 29 3d 3d 30 20 29 3b  nPagesize)==0 );
3820: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 67 6e  .    assert( pgn
3830: 6f 3c 3d 70 2d 3e 6e 50 61 67 65 20 7c 7c 20 70  o<=p->nPage || p
3840: 2d 3e 6e 53 79 6e 63 3e 30 20 29 3b 0a 20 20 20  ->nSync>0 );.   
3850: 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3e 70 2d   assert( pgno>p-
3860: 3e 6e 50 61 67 65 20 7c 7c 20 73 71 6c 69 74 65  >nPage || sqlite
3870: 33 42 69 74 76 65 63 54 65 73 74 28 70 2d 3e 70  3BitvecTest(p->p
3880: 57 72 69 74 61 62 6c 65 2c 20 70 67 6e 6f 29 20  Writable, pgno) 
3890: 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
38a0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
38b0: 70 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20  p->pReal, zBuf, 
38c0: 69 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 7d 0a  iAmt, iOfst);.}.
38d0: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
38e0: 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  an jt-file..*/.s
38f0: 74 61 74 69 63 20 69 6e 74 20 6a 74 54 72 75 6e  tatic int jtTrun
3900: 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c  cate(sqlite3_fil
3910: 65 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65  e *pFile, sqlite
3920: 5f 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20 20  _int64 size){.  
3930: 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74  jt_file *p = (jt
3940: 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
3950: 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 53 51   if( p->flags&SQ
3960: 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a  LITE_OPEN_MAIN_J
3970: 4f 55 52 4e 41 4c 20 26 26 20 73 69 7a 65 3d 3d  OURNAL && size==
3980: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 75 6e  0 ){.    /* Trun
3990: 63 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  cating a journal
39a0: 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 74   file. This is t
39b0: 68 65 20 65 6e 64 20 6f 66 20 61 20 74 72 61 6e  he end of a tran
39c0: 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20  saction. */.    
39d0: 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 20 3d  jt_file *pMain =
39e0: 20 6c 6f 63 61 74 65 44 61 74 61 62 61 73 65 48   locateDatabaseH
39f0: 61 6e 64 6c 65 28 70 2d 3e 7a 4e 61 6d 65 29 3b  andle(p->zName);
3a00: 0a 20 20 20 20 63 6c 6f 73 65 54 72 61 6e 73 61  .    closeTransa
3a10: 63 74 69 6f 6e 28 70 4d 61 69 6e 29 3b 0a 20 20  ction(pMain);.  
3a20: 7d 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  }.  if( p->flags
3a30: 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  &SQLITE_OPEN_MAI
3a40: 4e 5f 44 42 20 26 26 20 70 2d 3e 70 57 72 69 74  N_DB && p->pWrit
3a50: 61 62 6c 65 20 29 7b 0a 20 20 20 20 75 33 32 20  able ){.    u32 
3a60: 70 67 6e 6f 3b 0a 20 20 20 20 75 33 32 20 6c 6f  pgno;.    u32 lo
3a70: 63 6b 69 6e 67 5f 70 61 67 65 20 3d 20 28 75 33  cking_page = (u3
3a80: 32 29 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  2)(PENDING_BYTE/
3a90: 70 2d 3e 6e 50 61 67 65 73 69 7a 65 2b 31 29 3b  p->nPagesize+1);
3aa0: 0a 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d 73 69  .    for(pgno=si
3ab0: 7a 65 2f 70 2d 3e 6e 50 61 67 65 73 69 7a 65 2b  ze/p->nPagesize+
3ac0: 31 3b 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 50 61 67  1; pgno<=p->nPag
3ad0: 65 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20  e; pgno++){.    
3ae0: 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d    assert( pgno==
3af0: 6c 6f 63 6b 69 6e 67 5f 70 61 67 65 20 7c 7c 20  locking_page || 
3b00: 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
3b10: 74 28 70 2d 3e 70 57 72 69 74 61 62 6c 65 2c 20  t(p->pWritable, 
3b20: 70 67 6e 6f 29 20 29 3b 0a 20 20 20 20 7d 0a 20  pgno) );.    }. 
3b30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
3b40: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 2d  te3OsTruncate(p-
3b50: 3e 70 52 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d  >pReal, size);.}
3b60: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ../*.** The firs
3b70: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  t argument to th
3b80: 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
3b90: 20 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20   handle open on 
3ba0: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  a journal file..
3bb0: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
3bc0: 20 72 65 61 64 73 20 74 68 65 20 6a 6f 75 72 6e   reads the journ
3bd0: 61 6c 20 66 69 6c 65 20 61 6e 64 20 61 64 64 73  al file and adds
3be0: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
3bf0: 20 66 6f 72 20 65 61 63 68 0a 2a 2a 20 70 61 67   for each.** pag
3c00: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
3c10: 20 74 6f 20 74 68 65 20 42 69 74 76 65 63 20 6f   to the Bitvec o
3c20: 62 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20  bject passed as 
3c30: 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d  the second argum
3c40: 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
3c50: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 46 69  nt readJournalFi
3c60: 6c 65 28 6a 74 5f 66 69 6c 65 20 2a 70 2c 20 6a  le(jt_file *p, j
3c70: 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 29 7b 0a  t_file *pMain){.
3c80: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
3c90: 45 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64  E_OK;.  unsigned
3ca0: 20 63 68 61 72 20 7a 42 75 66 5b 32 38 5d 3b 0a   char zBuf[28];.
3cb0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
3cc0: 70 52 65 61 6c 20 3d 20 70 2d 3e 70 52 65 61 6c  pReal = p->pReal
3cd0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  ;.  sqlite3_int6
3ce0: 34 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 73 71  4 iOff = 0;.  sq
3cf0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 53 69 7a  lite3_int64 iSiz
3d00: 65 20 3d 20 70 2d 3e 69 4d 61 78 4f 66 66 3b 0a  e = p->iMaxOff;.
3d10: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
3d20: 2a 61 50 61 67 65 3b 0a 0a 20 20 61 50 61 67 65  *aPage;..  aPage
3d30: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
3d40: 63 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69  c(pMain->nPagesi
3d50: 7a 65 29 3b 0a 20 20 69 66 28 20 21 61 50 61 67  ze);.  if( !aPag
3d60: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
3d70: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
3d80: 45 4d 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  EM;.  }..  while
3d90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
3da0: 26 26 20 69 4f 66 66 3c 69 53 69 7a 65 20 29 7b  && iOff<iSize ){
3db0: 0a 20 20 20 20 75 33 32 20 6e 52 65 63 2c 20 6e  .    u32 nRec, n
3dc0: 50 61 67 65 2c 20 6e 53 65 63 74 6f 72 2c 20 6e  Page, nSector, n
3dd0: 50 61 67 65 73 69 7a 65 3b 0a 20 20 20 20 75 33  Pagesize;.    u3
3de0: 32 20 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65  2 ii;..    /* Re
3df0: 61 64 20 61 6e 64 20 64 65 63 6f 64 65 20 74 68  ad and decode th
3e00: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 2d 68  e next journal-h
3e10: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
3e20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
3e30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
3e40: 4f 73 52 65 61 64 28 70 52 65 61 6c 2c 20 7a 42  OsRead(pReal, zB
3e50: 75 66 2c 20 32 38 2c 20 69 4f 66 66 29 3b 0a 20  uf, 28, iOff);. 
3e60: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
3e70: 45 5f 4f 4b 20 0a 20 20 20 20 20 7c 7c 20 64 65  E_OK .     || de
3e80: 63 6f 64 65 4a 6f 75 72 6e 61 6c 48 64 72 28 7a  codeJournalHdr(z
3e90: 42 75 66 2c 20 26 6e 52 65 63 2c 20 26 6e 50 61  Buf, &nRec, &nPa
3ea0: 67 65 2c 20 26 6e 53 65 63 74 6f 72 2c 20 26 6e  ge, &nSector, &n
3eb0: 50 61 67 65 73 69 7a 65 29 20 0a 20 20 20 20 29  Pagesize) .    )
3ec0: 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e  {.      goto fin
3ed0: 69 73 68 5f 72 6a 66 3b 0a 20 20 20 20 7d 0a 20  ish_rjf;.    }. 
3ee0: 20 20 20 69 4f 66 66 20 2b 3d 20 6e 53 65 63 74     iOff += nSect
3ef0: 6f 72 3b 0a 0a 20 20 20 20 69 66 28 20 6e 52 65  or;..    if( nRe
3f00: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  c==0 ){.      /*
3f10: 20 41 20 74 72 69 63 6b 2e 20 54 68 65 72 65 20   A trick. There 
3f20: 6d 69 67 68 74 20 62 65 20 61 6e 6f 74 68 65 72  might be another
3f30: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
3f40: 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a 20 20 20  immediately .   
3f50: 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
3f60: 74 68 69 73 20 6f 6e 65 2e 20 49 6e 20 74 68 69  this one. In thi
3f70: 73 20 63 61 73 65 2c 20 30 20 72 65 63 6f 72 64  s case, 0 record
3f80: 73 20 6d 65 61 6e 73 20 30 20 72 65 63 6f 72 64  s means 0 record
3f90: 73 2c 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74  s, .      ** not
3fa0: 20 22 72 65 61 64 20 75 6e 74 69 6c 20 74 68 65   "read until the
3fb0: 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65   end of the file
3fc0: 22 2e 20 53 65 65 20 61 6c 73 6f 20 74 69 63 6b  ". See also tick
3fd0: 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 20 20  et #2565..      
3fe0: 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 53 69  */.      if( iSi
3ff0: 7a 65 3e 3d 28 69 4f 66 66 2b 6e 53 65 63 74 6f  ze>=(iOff+nSecto
4000: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  r) ){.        rc
4010: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
4020: 28 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 32 38  (pReal, zBuf, 28
4030: 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20  , iOff);.       
4040: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4050: 4f 4b 20 7c 7c 20 30 3d 3d 64 65 63 6f 64 65 4a  OK || 0==decodeJ
4060: 6f 75 72 6e 61 6c 48 64 72 28 7a 42 75 66 2c 20  ournalHdr(zBuf, 
4070: 30 2c 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20  0, 0, 0, 0) ){. 
4080: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
4090: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
40a0: 20 20 20 7d 0a 20 20 20 20 20 20 6e 52 65 63 20     }.      nRec 
40b0: 3d 20 28 69 53 69 7a 65 2d 69 4f 66 66 29 20 2f  = (iSize-iOff) /
40c0: 20 28 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69   (pMain->nPagesi
40d0: 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ze+8);.    }..  
40e0: 20 20 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68    /* Read all th
40f0: 65 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 66  e records that f
4100: 6f 6c 6c 6f 77 20 74 68 65 20 6a 6f 75 72 6e 61  ollow the journa
4110: 6c 2d 68 65 61 64 65 72 20 6a 75 73 74 20 72 65  l-header just re
4120: 61 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69  ad. */.    for(i
4130: 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
4140: 4f 4b 20 26 26 20 69 69 3c 6e 52 65 63 20 26 26  OK && ii<nRec &&
4150: 20 69 4f 66 66 3c 69 53 69 7a 65 3b 20 69 69 2b   iOff<iSize; ii+
4160: 2b 29 7b 0a 20 20 20 20 20 20 75 33 32 20 70 67  +){.      u32 pg
4170: 6e 6f 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  no;.      rc = s
4180: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 52 65  qlite3OsRead(pRe
4190: 61 6c 2c 20 7a 42 75 66 2c 20 34 2c 20 69 4f 66  al, zBuf, 4, iOf
41a0: 66 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  f);.      if( rc
41b0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
41c0: 20 20 20 20 20 20 20 70 67 6e 6f 20 3d 20 64 65         pgno = de
41d0: 63 6f 64 65 55 69 6e 74 33 32 28 7a 42 75 66 29  codeUint32(zBuf)
41e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67  ;.        if( pg
41f0: 6e 6f 3e 30 20 26 26 20 70 67 6e 6f 3c 3d 70 4d  no>0 && pgno<=pM
4200: 61 69 6e 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20  ain->nPage ){.  
4210: 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73          if( 0==s
4220: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
4230: 28 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c  (pMain->pWritabl
4240: 65 2c 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20  e, pgno) ){.    
4250: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
4260: 69 74 65 33 4f 73 52 65 61 64 28 70 52 65 61 6c  ite3OsRead(pReal
4270: 2c 20 61 50 61 67 65 2c 20 70 4d 61 69 6e 2d 3e  , aPage, pMain->
4280: 6e 50 61 67 65 73 69 7a 65 2c 20 69 4f 66 66 2b  nPagesize, iOff+
4290: 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  4);.            
42a0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
42b0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
42c0: 20 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 67     u32 cksum = g
42d0: 65 6e 43 6b 73 75 6d 28 61 50 61 67 65 2c 20 70  enCksum(aPage, p
42e0: 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 29  Main->nPagesize)
42f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
4300: 61 73 73 65 72 74 28 20 63 6b 73 75 6d 3d 3d 70  assert( cksum==p
4310: 4d 61 69 6e 2d 3e 61 43 6b 73 75 6d 5b 70 67 6e  Main->aCksum[pgn
4320: 6f 2d 31 5d 20 29 3b 0a 20 20 20 20 20 20 20 20  o-1] );.        
4330: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
4340: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
4350: 74 65 33 42 69 74 76 65 63 53 65 74 28 70 4d 61  te3BitvecSet(pMa
4360: 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65 2c 20 70  in->pWritable, p
4370: 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  gno);.        }.
4380: 20 20 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20          iOff += 
4390: 28 38 20 2b 20 70 4d 61 69 6e 2d 3e 6e 50 61 67  (8 + pMain->nPag
43a0: 65 73 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  esize);.      }.
43b0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 4f 66 66 20      }..    iOff 
43c0: 3d 20 28 28 69 4f 66 66 20 2b 20 28 6e 53 65 63  = ((iOff + (nSec
43d0: 74 6f 72 2d 31 29 29 20 2f 20 6e 53 65 63 74 6f  tor-1)) / nSecto
43e0: 72 29 20 2a 20 6e 53 65 63 74 6f 72 3b 0a 20 20  r) * nSector;.  
43f0: 7d 0a 0a 66 69 6e 69 73 68 5f 72 6a 66 3a 0a 20  }..finish_rjf:. 
4400: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 50   sqlite3_free(aP
4410: 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
4420: 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
4430: 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 72  RT_READ ){.    r
4440: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
4450: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
4460: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e  }../*.** Sync an
4470: 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61   jt-file..*/.sta
4480: 74 69 63 20 69 6e 74 20 6a 74 53 79 6e 63 28 73  tic int jtSync(s
4490: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
44a0: 6c 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  le, int flags){.
44b0: 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28    jt_file *p = (
44c0: 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  jt_file *)pFile;
44d0: 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ..  if( p->flags
44e0: 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  &SQLITE_OPEN_MAI
44f0: 4e 5f 4a 4f 55 52 4e 41 4c 20 29 7b 0a 20 20 20  N_JOURNAL ){.   
4500: 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 6a 74 5f   int rc;.    jt_
4510: 66 69 6c 65 20 2a 70 4d 61 69 6e 3b 20 20 20 20  file *pMain;    
4520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4530: 2a 20 54 68 65 20 61 73 73 6f 63 69 61 74 65 64  * The associated
4540: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
4550: 2f 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f  /..    /* The jo
4560: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
4570: 69 6e 67 20 73 79 6e 63 65 64 2e 20 41 74 20 74  ing synced. At t
4580: 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 69 6e  his point, we in
4590: 73 70 65 63 74 20 74 68 65 20 0a 20 20 20 20 2a  spect the .    *
45a0: 2a 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  * contents of th
45b0: 65 20 66 69 6c 65 20 75 70 20 74 6f 20 74 68 69  e file up to thi
45c0: 73 20 70 6f 69 6e 74 20 61 6e 64 20 73 65 74 20  s point and set 
45d0: 65 61 63 68 20 62 69 74 20 69 6e 20 74 68 65 20  each bit in the 
45e0: 0a 20 20 20 20 2a 2a 20 6a 74 5f 66 69 6c 65 2e  .    ** jt_file.
45f0: 70 57 72 69 74 61 62 6c 65 20 62 69 74 76 65 63  pWritable bitvec
4600: 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74   of the main dat
4610: 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
4620: 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a  iated with.    *
4630: 2a 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 66  * this journal f
4640: 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
4650: 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61  pMain = locateDa
4660: 74 61 62 61 73 65 48 61 6e 64 6c 65 28 70 2d 3e  tabaseHandle(p->
4670: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65  zName);.    asse
4680: 72 74 28 70 4d 61 69 6e 29 3b 0a 0a 20 20 20 20  rt(pMain);..    
4690: 2f 2a 20 53 65 74 20 74 68 65 20 62 69 74 76 65  /* Set the bitve
46a0: 63 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20  c values */.    
46b0: 69 66 28 20 70 4d 61 69 6e 2d 3e 70 57 72 69 74  if( pMain->pWrit
46c0: 61 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 4d  able ){.      pM
46d0: 61 69 6e 2d 3e 6e 53 79 6e 63 2b 2b 3b 0a 20 20  ain->nSync++;.  
46e0: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
46f0: 72 6e 61 6c 46 69 6c 65 28 70 2c 20 70 4d 61 69  rnalFile(p, pMai
4700: 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  n);.      if( rc
4710: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
4720: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
4730: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4740: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71    }..  return sq
4750: 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 2d 3e 70  lite3OsSync(p->p
4760: 52 65 61 6c 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a  Real, flags);.}.
4770: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
4780: 65 20 63 75 72 72 65 6e 74 20 66 69 6c 65 2d 73  e current file-s
4790: 69 7a 65 20 6f 66 20 61 6e 20 6a 74 2d 66 69 6c  ize of an jt-fil
47a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
47b0: 20 6a 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69   jtFileSize(sqli
47c0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
47d0: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70   sqlite_int64 *p
47e0: 53 69 7a 65 29 7b 0a 20 20 6a 74 5f 66 69 6c 65  Size){.  jt_file
47f0: 20 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a   *p = (jt_file *
4800: 29 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e  )pFile;.  return
4810: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
4820: 7a 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70 53 69  ze(p->pReal, pSi
4830: 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  ze);.}../*.** Lo
4840: 63 6b 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a  ck an jt-file..*
4850: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 4c  /.static int jtL
4860: 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ock(sqlite3_file
4870: 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f   *pFile, int eLo
4880: 63 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ck){.  int rc;. 
4890: 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a   jt_file *p = (j
48a0: 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  t_file *)pFile;.
48b0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
48c0: 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65  Lock(p->pReal, e
48d0: 4c 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d  Lock);.  if( rc=
48e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 4c  =SQLITE_OK && eL
48f0: 6f 63 6b 3e 70 2d 3e 65 4c 6f 63 6b 20 29 7b 0a  ock>p->eLock ){.
4900: 20 20 20 20 70 2d 3e 65 4c 6f 63 6b 20 3d 20 65      p->eLock = e
4910: 4c 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Lock;.  }.  retu
4920: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4930: 55 6e 6c 6f 63 6b 20 61 6e 20 6a 74 2d 66 69 6c  Unlock an jt-fil
4940: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4950: 20 6a 74 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65   jtUnlock(sqlite
4960: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69  3_file *pFile, i
4970: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74  nt eLock){.  int
4980: 20 72 63 3b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a   rc;.  jt_file *
4990: 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70  p = (jt_file *)p
49a0: 46 69 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  File;.  rc = sql
49b0: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 2d 3e  ite3OsUnlock(p->
49c0: 70 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20  pReal, eLock);. 
49d0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
49e0: 4f 4b 20 26 26 20 65 4c 6f 63 6b 3c 70 2d 3e 65  OK && eLock<p->e
49f0: 4c 6f 63 6b 20 29 7b 0a 20 20 20 20 70 2d 3e 65  Lock ){.    p->e
4a00: 4c 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20  Lock = eLock;.  
4a10: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4a20: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66  ../*.** Check if
4a30: 20 61 6e 6f 74 68 65 72 20 66 69 6c 65 2d 68 61   another file-ha
4a40: 6e 64 6c 65 20 68 6f 6c 64 73 20 61 20 52 45 53  ndle holds a RES
4a50: 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e  ERVED lock on an
4a60: 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61   jt-file..*/.sta
4a70: 74 69 63 20 69 6e 74 20 6a 74 43 68 65 63 6b 52  tic int jtCheckR
4a80: 65 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69  eservedLock(sqli
4a90: 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
4aa0: 20 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a   int *pResOut){.
4ab0: 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28    jt_file *p = (
4ac0: 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  jt_file *)pFile;
4ad0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4ae0: 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
4af0: 4c 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 70  Lock(p->pReal, p
4b00: 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ResOut);.}../*.*
4b10: 2a 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d  * File control m
4b20: 65 74 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f  ethod. For custo
4b30: 6d 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20  m operations on 
4b40: 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73  an jt-file..*/.s
4b50: 74 61 74 69 63 20 69 6e 74 20 6a 74 46 69 6c 65  tatic int jtFile
4b60: 43 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f  Control(sqlite3_
4b70: 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74  file *pFile, int
4b80: 20 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29   op, void *pArg)
4b90: 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d  {.  jt_file *p =
4ba0: 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c   (jt_file *)pFil
4bb0: 65 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  e;.  return sqli
4bc0: 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c  te3OsFileControl
4bd0: 28 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70  (p->pReal, op, p
4be0: 41 72 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Arg);.}../*.** R
4bf0: 65 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72  eturn the sector
4c00: 2d 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 66  -size in bytes f
4c10: 6f 72 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a  or an jt-file..*
4c20: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 53  /.static int jtS
4c30: 65 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65  ectorSize(sqlite
4c40: 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a  3_file *pFile){.
4c50: 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28    jt_file *p = (
4c60: 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b  jt_file *)pFile;
4c70: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4c80: 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 2d  3OsSectorSize(p-
4c90: 3e 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  >pReal);.}../*.*
4ca0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76  * Return the dev
4cb0: 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
4cc0: 69 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74  ic flags support
4cd0: 65 64 20 62 79 20 61 6e 20 6a 74 2d 66 69 6c 65  ed by an jt-file
4ce0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4cf0: 6a 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65  jtDeviceCharacte
4d00: 72 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f  ristics(sqlite3_
4d10: 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20  file *pFile){.  
4d20: 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74  jt_file *p = (jt
4d30: 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
4d40: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
4d50: 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
4d60: 69 73 74 69 63 73 28 70 2d 3e 70 52 65 61 6c 29  istics(p->pReal)
4d70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
4d80: 61 6e 20 6a 74 20 66 69 6c 65 20 68 61 6e 64 6c  an jt file handl
4d90: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
4da0: 20 6a 74 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74   jtOpen(.  sqlit
4db0: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20  e3_vfs *pVfs,.  
4dc0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d  const char *zNam
4dd0: 65 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  e,.  sqlite3_fil
4de0: 65 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20  e *pFile,.  int 
4df0: 66 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f  flags,.  int *pO
4e00: 75 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e 74  utFlags.){.  int
4e10: 20 72 63 3b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a   rc;.  jt_file *
4e20: 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70  p = (jt_file *)p
4e30: 46 69 6c 65 3b 0a 20 20 70 2d 3e 70 52 65 61 6c  File;.  p->pReal
4e40: 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
4e50: 20 2a 29 26 70 5b 31 5d 3b 0a 20 20 70 2d 3e 70   *)&p[1];.  p->p
4e60: 52 65 61 6c 2d 3e 70 4d 65 74 68 6f 64 73 20 3d  Real->pMethods =
4e70: 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
4e80: 65 33 4f 73 4f 70 65 6e 28 67 2e 70 56 66 73 2c  e3OsOpen(g.pVfs,
4e90: 20 7a 4e 61 6d 65 2c 20 70 2d 3e 70 52 65 61 6c   zName, p->pReal
4ea0: 2c 20 66 6c 61 67 73 2c 20 70 4f 75 74 46 6c 61  , flags, pOutFla
4eb0: 67 73 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72  gs);.  assert( r
4ec0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c==SQLITE_OK || 
4ed0: 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74 68 6f  p->pReal->pMetho
4ee0: 64 73 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 72  ds==0 );.  if( r
4ef0: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
4f00: 20 20 20 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68      pFile->pMeth
4f10: 6f 64 73 20 3d 20 26 6a 74 5f 69 6f 5f 6d 65 74  ods = &jt_io_met
4f20: 68 6f 64 73 3b 0a 20 20 20 20 70 2d 3e 65 4c 6f  hods;.    p->eLo
4f30: 63 6b 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 7a  ck = 0;.    p->z
4f40: 4e 61 6d 65 20 3d 20 7a 4e 61 6d 65 3b 0a 20 20  Name = zName;.  
4f50: 20 20 70 2d 3e 66 6c 61 67 73 20 3d 20 66 6c 61    p->flags = fla
4f60: 67 73 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78 74  gs;.    p->pNext
4f70: 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 70 57 72   = 0;.    p->pWr
4f80: 69 74 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  itable = 0;.    
4f90: 70 2d 3e 61 43 6b 73 75 6d 20 3d 20 30 3b 0a 20  p->aCksum = 0;. 
4fa0: 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a     if( zName ){.
4fb0: 20 20 20 20 20 20 70 2d 3e 70 4e 65 78 74 20 3d        p->pNext =
4fc0: 20 67 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   g.pList;.      
4fd0: 67 2e 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20  g.pList = p;.   
4fe0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4ff0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  rc;.}../*.** Del
5000: 65 74 65 20 74 68 65 20 66 69 6c 65 20 6c 6f 63  ete the file loc
5010: 61 74 65 64 20 61 74 20 7a 50 61 74 68 2e 20 49  ated at zPath. I
5020: 66 20 74 68 65 20 64 69 72 53 79 6e 63 20 61 72  f the dirSync ar
5030: 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 0a  gument is true,.
5040: 2a 2a 20 65 6e 73 75 72 65 20 74 68 65 20 66 69  ** ensure the fi
5050: 6c 65 2d 73 79 73 74 65 6d 20 6d 6f 64 69 66 69  le-system modifi
5060: 63 61 74 69 6f 6e 73 20 61 72 65 20 73 79 6e 63  cations are sync
5070: 65 64 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  ed to disk befor
5080: 65 0a 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a  e.** returning..
5090: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74  */.static int jt
50a0: 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76  Delete(sqlite3_v
50b0: 66 73 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20  fs *pVfs, const 
50c0: 63 68 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74  char *zPath, int
50d0: 20 64 69 72 53 79 6e 63 29 7b 0a 20 20 69 6e 74   dirSync){.  int
50e0: 20 6e 50 61 74 68 20 3d 20 73 74 72 6c 65 6e 28   nPath = strlen(
50f0: 7a 50 61 74 68 29 3b 0a 20 20 69 66 28 20 6e 50  zPath);.  if( nP
5100: 61 74 68 3e 38 20 26 26 20 30 3d 3d 73 74 72 63  ath>8 && 0==strc
5110: 6d 70 28 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 26  mp("-journal", &
5120: 7a 50 61 74 68 5b 6e 50 61 74 68 2d 38 5d 29 20  zPath[nPath-8]) 
5130: 29 7b 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 69  ){.    /* Deleti
5140: 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ng a journal fil
5150: 65 2e 20 54 68 65 20 65 6e 64 20 6f 66 20 61 20  e. The end of a 
5160: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
5170: 20 20 20 20 6a 74 5f 66 69 6c 65 20 2a 70 4d 61      jt_file *pMa
5180: 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61 74 61 62  in = locateDatab
5190: 61 73 65 48 61 6e 64 6c 65 28 7a 50 61 74 68 29  aseHandle(zPath)
51a0: 3b 0a 20 20 20 20 69 66 28 20 70 4d 61 69 6e 20  ;.    if( pMain 
51b0: 29 7b 0a 20 20 20 20 20 20 63 6c 6f 73 65 54 72  ){.      closeTr
51c0: 61 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e 29  ansaction(pMain)
51d0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
51e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 44  eturn sqlite3OsD
51f0: 65 6c 65 74 65 28 67 2e 70 56 66 73 2c 20 7a 50  elete(g.pVfs, zP
5200: 61 74 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a 7d  ath, dirSync);.}
5210: 0a 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72  ../*.** Test for
5220: 20 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69   access permissi
5230: 6f 6e 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65  ons. Return true
5240: 20 69 66 20 74 68 65 20 72 65 71 75 65 73 74 65   if the requeste
5250: 64 20 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20  d permission.** 
5260: 69 73 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72  is available, or
5270: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
5280: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
5290: 6a 74 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69  jtAccess(.  sqli
52a0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a  te3_vfs *pVfs, .
52b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
52c0: 61 74 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67  ath, .  int flag
52d0: 73 2c 20 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f  s, .  int *pResO
52e0: 75 74 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73  ut.){.  return s
52f0: 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 67  qlite3OsAccess(g
5300: 2e 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 66 6c  .pVfs, zPath, fl
5310: 61 67 73 2c 20 70 52 65 73 4f 75 74 29 3b 0a 7d  ags, pResOut);.}
5320: 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65  ../*.** Populate
5330: 20 62 75 66 66 65 72 20 7a 4f 75 74 20 77 69 74   buffer zOut wit
5340: 68 20 74 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e  h the full canon
5350: 69 63 61 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f  ical pathname co
5360: 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74  rresponding.** t
5370: 6f 20 74 68 65 20 70 61 74 68 6e 61 6d 65 20 69  o the pathname i
5380: 6e 20 7a 50 61 74 68 2e 20 7a 4f 75 74 20 69 73  n zPath. zOut is
5390: 20 67 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70   guaranteed to p
53a0: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
53b0: 0a 2a 2a 20 6f 66 20 61 74 20 6c 65 61 73 74 20  .** of at least 
53c0: 28 4a 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45  (JT_MAX_PATHNAME
53d0: 2b 31 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74  +1) bytes..*/.st
53e0: 61 74 69 63 20 69 6e 74 20 6a 74 46 75 6c 6c 50  atic int jtFullP
53f0: 61 74 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74  athname(.  sqlit
5400: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20  e3_vfs *pVfs, . 
5410: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
5420: 74 68 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c  th, .  int nOut,
5430: 20 0a 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29   .  char *zOut.)
5440: 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  {.  return sqlit
5450: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
5460: 28 67 2e 70 56 66 73 2c 20 7a 50 61 74 68 2c 20  (g.pVfs, zPath, 
5470: 6e 4f 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d 0a 0a  nOut, zOut);.}..
5480: 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64  /*.** Open the d
5490: 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 6c  ynamic library l
54a0: 6f 63 61 74 65 64 20 61 74 20 7a 50 61 74 68 20  ocated at zPath 
54b0: 61 6e 64 20 72 65 74 75 72 6e 20 61 20 68 61 6e  and return a han
54c0: 64 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dle..*/.static v
54d0: 6f 69 64 20 2a 6a 74 44 6c 4f 70 65 6e 28 73 71  oid *jtDlOpen(sq
54e0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c  lite3_vfs *pVfs,
54f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
5500: 74 68 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e  th){.  return g.
5510: 70 56 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 67 2e  pVfs->xDlOpen(g.
5520: 70 56 66 73 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a  pVfs, zPath);.}.
5530: 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  ./*.** Populate 
5540: 74 68 65 20 62 75 66 66 65 72 20 7a 45 72 72 4d  the buffer zErrM
5550: 73 67 20 28 73 69 7a 65 20 6e 42 79 74 65 20 62  sg (size nByte b
5560: 79 74 65 73 29 20 77 69 74 68 20 61 20 68 75 6d  ytes) with a hum
5570: 61 6e 20 72 65 61 64 61 62 6c 65 0a 2a 2a 20 75  an readable.** u
5580: 74 66 2d 38 20 73 74 72 69 6e 67 20 64 65 73 63  tf-8 string desc
5590: 72 69 62 69 6e 67 20 74 68 65 20 6d 6f 73 74 20  ribing the most 
55a0: 72 65 63 65 6e 74 20 65 72 72 6f 72 20 65 6e 63  recent error enc
55b0: 6f 75 6e 74 65 72 65 64 20 61 73 73 6f 63 69 61  ountered associa
55c0: 74 65 64 20 0a 2a 2a 20 77 69 74 68 20 64 79 6e  ted .** with dyn
55d0: 61 6d 69 63 20 6c 69 62 72 61 72 69 65 73 2e 0a  amic libraries..
55e0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a  */.static void j
55f0: 74 44 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33  tDlError(sqlite3
5600: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
5610: 6e 42 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72  nByte, char *zEr
5620: 72 4d 73 67 29 7b 0a 20 20 67 2e 70 56 66 73 2d  rMsg){.  g.pVfs-
5630: 3e 78 44 6c 45 72 72 6f 72 28 67 2e 70 56 66 73  >xDlError(g.pVfs
5640: 2c 20 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73 67  , nByte, zErrMsg
5650: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
5660: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
5670: 74 68 65 20 73 79 6d 62 6f 6c 20 7a 53 79 6d 62  the symbol zSymb
5680: 6f 6c 20 69 6e 20 74 68 65 20 64 79 6e 61 6d 69  ol in the dynami
5690: 63 20 6c 69 62 72 61 72 79 20 70 48 61 6e 64 6c  c library pHandl
56a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
56b0: 64 20 28 2a 6a 74 44 6c 53 79 6d 28 73 71 6c 69  d (*jtDlSym(sqli
56c0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76  te3_vfs *pVfs, v
56d0: 6f 69 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  oid *p, const ch
56e0: 61 72 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29  ar *zSym))(void)
56f0: 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e 70 56 66  {.  return g.pVf
5700: 73 2d 3e 78 44 6c 53 79 6d 28 67 2e 70 56 66 73  s->xDlSym(g.pVfs
5710: 2c 20 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f  , p, zSym);.}../
5720: 2a 0a 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 64  *.** Close the d
5730: 79 6e 61 6d 69 63 20 6c 69 62 72 61 72 79 20 68  ynamic library h
5740: 61 6e 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a  andle pHandle..*
5750: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 74  /.static void jt
5760: 44 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f  DlClose(sqlite3_
5770: 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20  vfs *pVfs, void 
5780: 2a 70 48 61 6e 64 6c 65 29 7b 0a 20 20 67 2e 70  *pHandle){.  g.p
5790: 56 66 73 2d 3e 78 44 6c 43 6c 6f 73 65 28 67 2e  Vfs->xDlClose(g.
57a0: 70 56 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b 0a  pVfs, pHandle);.
57b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74  }../*.** Populat
57c0: 65 20 74 68 65 20 62 75 66 66 65 72 20 70 6f 69  e the buffer poi
57d0: 6e 74 65 64 20 74 6f 20 62 79 20 7a 42 75 66 4f  nted to by zBufO
57e0: 75 74 20 77 69 74 68 20 6e 42 79 74 65 20 62 79  ut with nByte by
57f0: 74 65 73 20 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f  tes of .** rando
5800: 6d 20 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69  m data..*/.stati
5810: 63 20 69 6e 74 20 6a 74 52 61 6e 64 6f 6d 6e 65  c int jtRandomne
5820: 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ss(sqlite3_vfs *
5830: 70 56 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c  pVfs, int nByte,
5840: 20 63 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b   char *zBufOut){
5850: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5860: 33 4f 73 52 61 6e 64 6f 6d 6e 65 73 73 28 67 2e  3OsRandomness(g.
5870: 70 56 66 73 2c 20 6e 42 79 74 65 2c 20 7a 42 75  pVfs, nByte, zBu
5880: 66 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fOut);.}../*.** 
5890: 53 6c 65 65 70 20 66 6f 72 20 6e 4d 69 63 72 6f  Sleep for nMicro
58a0: 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 52   microseconds. R
58b0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
58c0: 20 6f 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73   of microseconds
58d0: 20 0a 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73 6c   .** actually sl
58e0: 65 70 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ept..*/.static i
58f0: 6e 74 20 6a 74 53 6c 65 65 70 28 73 71 6c 69 74  nt jtSleep(sqlit
5900: 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e  e3_vfs *pVfs, in
5910: 74 20 6e 4d 69 63 72 6f 29 7b 0a 20 20 72 65 74  t nMicro){.  ret
5920: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 53 6c 65  urn sqlite3OsSle
5930: 65 70 28 67 2e 70 56 66 73 2c 20 6e 4d 69 63 72  ep(g.pVfs, nMicr
5940: 6f 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  o);.}../*.** Ret
5950: 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  urn the current 
5960: 74 69 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e  time as a Julian
5970: 20 44 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a   Day number in *
5980: 70 54 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61  pTimeOut..*/.sta
5990: 74 69 63 20 69 6e 74 20 6a 74 43 75 72 72 65 6e  tic int jtCurren
59a0: 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66  tTime(sqlite3_vf
59b0: 73 20 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20  s *pVfs, double 
59c0: 2a 70 54 69 6d 65 4f 75 74 29 7b 0a 20 20 72 65  *pTimeOut){.  re
59d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 43 75  turn sqlite3OsCu
59e0: 72 72 65 6e 74 54 69 6d 65 28 67 2e 70 56 66 73  rrentTime(g.pVfs
59f0: 2c 20 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a  , pTimeOut);.}..
5a00: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
5a10: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a20: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a30: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a40: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53  ***********.** S
5a50: 74 61 72 74 20 6f 66 20 70 75 62 6c 69 63 20 41  tart of public A
5a60: 50 49 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f  PI..*/../*.** Co
5a70: 6e 66 69 67 75 72 65 20 74 68 65 20 6a 74 20 56  nfigure the jt V
5a80: 46 53 20 61 73 20 61 20 77 72 61 70 70 65 72 20  FS as a wrapper 
5a90: 61 72 6f 75 6e 64 20 74 68 65 20 56 46 53 20 6e  around the VFS n
5aa0: 61 6d 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  amed by paramete
5ab0: 72 20 0a 2a 2a 20 7a 57 72 61 70 2e 20 49 66 20  r .** zWrap. If 
5ac0: 74 68 65 20 69 73 44 65 66 61 75 6c 74 20 70 61  the isDefault pa
5ad0: 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c  rameter is true,
5ae0: 20 74 68 65 6e 20 74 68 65 20 6a 74 20 56 46 53   then the jt VFS
5af0: 20 69 73 20 69 6e 73 74 61 6c 6c 65 64 0a 2a 2a   is installed.**
5b00: 20 61 73 20 74 68 65 20 6e 65 77 20 64 65 66 61   as the new defa
5b10: 75 6c 74 20 56 46 53 20 66 6f 72 20 53 51 4c 69  ult VFS for SQLi
5b20: 74 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20  te connections. 
5b30: 49 66 20 69 73 44 65 66 61 75 6c 74 20 69 73 20  If isDefault is 
5b40: 6e 6f 74 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65  not.** true, the
5b50: 6e 20 74 68 65 20 6a 74 20 56 46 53 20 69 73 20  n the jt VFS is 
5b60: 69 6e 73 74 61 6c 6c 65 64 20 61 73 20 6e 6f 6e  installed as non
5b70: 2d 64 65 66 61 75 6c 74 2e 20 49 6e 20 74 68 69  -default. In thi
5b80: 73 20 63 61 73 65 20 69 74 0a 2a 2a 20 69 73 20  s case it.** is 
5b90: 61 76 61 69 6c 61 62 6c 65 20 76 69 61 20 69 74  available via it
5ba0: 73 20 6e 61 6d 65 2c 20 22 6a 74 22 2e 0a 2a 2f  s name, "jt"..*/
5bb0: 0a 69 6e 74 20 6a 74 5f 72 65 67 69 73 74 65 72  .int jt_register
5bc0: 28 63 68 61 72 20 2a 7a 57 72 61 70 2c 20 69 6e  (char *zWrap, in
5bd0: 74 20 69 73 44 65 66 61 75 6c 74 29 7b 0a 20 20  t isDefault){.  
5be0: 67 2e 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33  g.pVfs = sqlite3
5bf0: 5f 76 66 73 5f 66 69 6e 64 28 7a 57 72 61 70 29  _vfs_find(zWrap)
5c00: 3b 0a 20 20 69 66 28 20 67 2e 70 56 66 73 3d 3d  ;.  if( g.pVfs==
5c10: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5c20: 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
5c30: 7d 0a 20 20 6a 74 5f 76 66 73 2e 73 7a 4f 73 46  }.  jt_vfs.szOsF
5c40: 69 6c 65 20 3d 20 73 69 7a 65 6f 66 28 6a 74 5f  ile = sizeof(jt_
5c50: 66 69 6c 65 29 20 2b 20 67 2e 70 56 66 73 2d 3e  file) + g.pVfs->
5c60: 73 7a 4f 73 46 69 6c 65 3b 0a 20 20 73 71 6c 69  szOsFile;.  sqli
5c70: 74 65 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72  te3_vfs_register
5c80: 28 26 6a 74 5f 76 66 73 2c 20 69 73 44 65 66 61  (&jt_vfs, isDefa
5c90: 75 6c 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ult);.  return S
5ca0: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
5cb0: 2a 2a 20 55 6e 69 6e 73 74 61 6c 6c 20 74 68 65  ** Uninstall the
5cc0: 20 6a 74 20 56 46 53 2c 20 69 66 20 69 74 20 69   jt VFS, if it i
5cd0: 73 20 69 6e 73 74 61 6c 6c 65 64 2e 0a 2a 2f 0a  s installed..*/.
5ce0: 76 6f 69 64 20 6a 74 5f 75 6e 72 65 67 69 73 74  void jt_unregist
5cf0: 65 72 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  er(){.  sqlite3_
5d00: 76 66 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26  vfs_unregister(&
5d10: 6a 74 5f 76 66 73 29 3b 0a 7d 0a 0a 23 65 6e 64  jt_vfs);.}..#end
5d20: 69 66 0a                                         if.