/ Hex Artifact Content
Login

Artifact 1e7baebc212b2c79f03f2c647cfd0b4f3678bf4c:


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 31 34 20  ournal.c,v 1.14 
0290: 32 30 30 39 2f 30 33 2f 32 38 20 31 37 3a 32 31  2009/03/28 17:21
02a0: 3a 35 32 20 64 61 6e 69 65 6c 6b 31 39 37 37 20  :52 danielk1977 
02b0: 45 78 70 20 24 0a 2a 2f 0a 23 69 66 20 53 51 4c  Exp $.*/.#if SQL
02c0: 49 54 45 5f 54 45 53 54 20 20 20 20 20 20 20 20  ITE_TEST        
02d0: 20 20 2f 2a 20 54 68 69 73 20 66 69 6c 65 20 69    /* This file i
02e0: 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69  s used for testi
02f0: 6e 67 20 6f 6e 6c 79 20 2a 2f 0a 0a 23 69 6e 63  ng only */..#inc
0300: 6c 75 64 65 20 22 73 71 6c 69 74 65 33 2e 68 22  lude "sqlite3.h"
0310: 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74  .#include "sqlit
0320: 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 49  eInt.h"../*.** I
0330: 4e 54 45 52 46 41 43 45 0a 2a 2a 0a 2a 2a 20 20  NTERFACE.**.**  
0340: 20 54 68 65 20 70 75 62 6c 69 63 20 69 6e 74 65   The public inte
0350: 72 66 61 63 65 20 74 6f 20 74 68 69 73 20 77 72  rface to this wr
0360: 61 70 70 65 72 20 56 46 53 20 69 73 20 74 77 6f  apper VFS is two
0370: 20 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a   functions:.**.*
0380: 2a 20 20 20 20 20 6a 74 5f 72 65 67 69 73 74 65  *     jt_registe
0390: 72 28 29 0a 2a 2a 20 20 20 20 20 6a 74 5f 75 6e  r().**     jt_un
03a0: 72 65 67 69 73 74 65 72 28 29 0a 2a 2a 0a 2a 2a  register().**.**
03b0: 20 20 20 53 65 65 20 68 65 61 64 65 72 20 63 6f     See header co
03c0: 6d 6d 65 6e 74 73 20 61 73 73 6f 63 69 61 74 65  mments associate
03d0: 64 20 77 69 74 68 20 74 68 6f 73 65 20 74 77 6f  d with those two
03e0: 20 66 75 6e 63 74 69 6f 6e 73 20 62 65 6c 6f 77   functions below
03f0: 20 66 6f 72 20 0a 2a 2a 20 20 20 64 65 74 61 69   for .**   detai
0400: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 4c 49 4d 49 54 41  ls..**.** LIMITA
0410: 54 49 4f 4e 53 0a 2a 2a 0a 2a 2a 20 20 20 54 68  TIONS.**.**   Th
0420: 69 73 20 77 72 61 70 70 65 72 20 77 69 6c 6c 20  is wrapper will 
0430: 6e 6f 74 20 77 6f 72 6b 20 69 66 20 22 50 52 41  not work if "PRA
0440: 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20  GMA synchronous 
0450: 3d 20 6f 66 66 22 20 69 73 20 75 73 65 64 2e 0a  = off" is used..
0460: 2a 2a 0a 2a 2a 20 4f 50 45 52 41 54 49 4f 4e 0a  **.** OPERATION.
0470: 2a 2a 0a 2a 2a 20 20 53 74 61 72 74 69 6e 67 20  **.**  Starting 
0480: 61 20 54 72 61 6e 73 61 63 74 69 6f 6e 3a 0a 2a  a Transaction:.*
0490: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 61 20 77 72  *.**   When a wr
04a0: 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
04b0: 69 73 20 73 74 61 72 74 65 64 2c 20 74 68 65 20  is started, the 
04c0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
04d0: 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 20  database is.**  
04e0: 20 69 6e 73 70 65 63 74 65 64 20 61 6e 64 20 74   inspected and t
04f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 61 74  he following dat
0500: 61 20 73 74 6f 72 65 64 20 61 73 20 70 61 72 74  a stored as part
0510: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
0520: 20 66 69 6c 65 20 0a 2a 2a 20 20 20 68 61 6e 64   file .**   hand
0530: 6c 65 20 28 74 79 70 65 20 73 74 72 75 63 74 20  le (type struct 
0540: 6a 74 5f 66 69 6c 65 29 3a 0a 2a 2a 0a 2a 2a 20  jt_file):.**.** 
0550: 20 20 20 20 61 29 20 54 68 65 20 70 61 67 65 2d      a) The page-
0560: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
0570: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
0580: 20 20 62 29 20 54 68 65 20 6e 75 6d 62 65 72 20    b) The number 
0590: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72  of pages that ar
05a0: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
05b0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 63  e file..**     c
05c0: 29 20 54 68 65 20 73 65 74 20 6f 66 20 70 61 67  ) The set of pag
05d0: 65 20 6e 75 6d 62 65 72 73 20 63 6f 72 72 65 73  e numbers corres
05e0: 70 6f 6e 64 69 6e 67 20 74 6f 20 66 72 65 65 2d  ponding to free-
05f0: 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65 73 2e  list leaf pages.
0600: 0a 2a 2a 20 20 20 20 20 64 29 20 41 20 63 68 65  .**     d) A che
0610: 63 6b 2d 73 75 6d 20 66 6f 72 20 65 76 65 72 79  ck-sum for every
0620: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
0630: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
0640: 2a 20 20 20 54 68 65 20 73 74 61 72 74 20 6f 66  *   The start of
0650: 20 61 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63   a write-transac
0660: 74 69 6f 6e 20 69 73 20 64 65 65 6d 65 64 20 74  tion is deemed t
0670: 6f 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  o have occurred 
0680: 77 68 65 6e 20 61 20 0a 2a 2a 20 20 20 32 38 2d  when a .**   28-
0690: 62 79 74 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  byte journal hea
06a0: 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 74  der is written t
06b0: 6f 20 62 79 74 65 20 6f 66 66 73 65 74 20 30 20  o byte offset 0 
06c0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  of the journal .
06d0: 2a 2a 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  **   file..**.**
06e0: 20 20 53 79 6e 63 69 6e 67 20 74 68 65 20 4a 6f    Syncing the Jo
06f0: 75 72 6e 61 6c 20 46 69 6c 65 3a 0a 2a 2a 0a 2a  urnal File:.**.*
0700: 2a 20 20 20 57 68 65 6e 65 76 65 72 20 74 68 65  *   Whenever the
0710: 20 78 53 79 6e 63 20 6d 65 74 68 6f 64 20 69 73   xSync method is
0720: 20 69 6e 76 6f 6b 65 64 20 74 6f 20 73 79 6e 63   invoked to sync
0730: 20 61 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c   a journal-file,
0740: 20 74 68 65 0a 2a 2a 20 20 20 63 6f 6e 74 65 6e   the.**   conten
0750: 74 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ts of the journa
0760: 6c 20 66 69 6c 65 20 61 72 65 20 72 65 61 64 2e  l file are read.
0770: 20 46 6f 72 20 65 61 63 68 20 70 61 67 65 20 77   For each page w
0780: 72 69 74 74 65 6e 20 74 6f 0a 2a 2a 20 20 20 74  ritten to.**   t
0790: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  he journal file,
07a0: 20 61 20 63 68 65 63 6b 2d 73 75 6d 20 69 73 20   a check-sum is 
07b0: 63 61 6c 63 75 6c 61 74 65 64 20 61 6e 64 20 63  calculated and c
07c0: 6f 6d 70 61 72 65 64 20 74 6f 20 74 68 65 20 20  ompared to the  
07d0: 0a 2a 2a 20 20 20 63 68 65 63 6b 2d 73 75 6d 20  .**   check-sum 
07e0: 63 61 6c 63 75 6c 61 74 65 64 20 66 6f 72 20 74  calculated for t
07f0: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
0800: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 77   database page w
0810: 68 65 6e 20 74 68 65 0a 2a 2a 20 20 20 77 72 69  hen the.**   wri
0820: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  te-transaction w
0830: 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  as initialized. 
0840: 54 68 65 20 73 75 63 63 65 73 73 20 6f 66 20 74  The success of t
0850: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 0a 2a 2a  he comparison.**
0860: 20 20 20 69 73 20 61 73 73 65 72 74 28 29 65 64     is assert()ed
0870: 2e 20 53 6f 20 69 66 20 53 51 4c 69 74 65 20 68  . So if SQLite h
0880: 61 73 20 77 72 69 74 74 65 6e 20 73 6f 6d 65 74  as written somet
0890: 68 69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20  hing other than 
08a0: 74 68 65 0a 2a 2a 20 20 20 6f 72 69 67 69 6e 61  the.**   origina
08b0: 6c 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65  l content to the
08c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
08d0: 61 6e 20 61 73 73 65 72 74 28 29 20 77 69 6c 6c  an assert() will
08e0: 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 41   fail..**.**   A
08f0: 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65  dditionally, the
0900: 20 73 65 74 20 6f 66 20 70 61 67 65 20 6e 75 6d   set of page num
0910: 62 65 72 73 20 66 6f 72 20 77 68 69 63 68 20 72  bers for which r
0920: 65 63 6f 72 64 73 20 65 78 69 73 74 20 69 6e 0a  ecords exist in.
0930: 2a 2a 20 20 20 74 68 65 20 6a 6f 75 72 6e 61 6c  **   the journal
0940: 20 66 69 6c 65 20 69 73 20 61 64 64 65 64 20 74   file is added t
0950: 6f 20 28 75 6e 69 6f 6e 65 64 20 77 69 74 68 29  o (unioned with)
0960: 20 74 68 65 20 73 65 74 20 6f 66 20 70 61 67 65   the set of page
0970: 20 6e 75 6d 62 65 72 73 0a 2a 2a 20 20 20 63 6f   numbers.**   co
0980: 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 66  rresponding to f
0990: 72 65 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61  ree-list leaf pa
09a0: 67 65 73 20 63 6f 6c 6c 65 63 74 65 64 20 77 68  ges collected wh
09b0: 65 6e 20 74 68 65 20 0a 2a 2a 20 20 20 77 72 69  en the .**   wri
09c0: 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  te-transaction w
09d0: 61 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 2e 20  as initialized. 
09e0: 54 68 69 73 20 73 65 74 20 63 6f 6d 70 72 69 73  This set compris
09f0: 65 73 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62  es the page-numb
0a00: 65 72 73 20 0a 2a 2a 20 20 20 63 6f 72 72 65 73  ers .**   corres
0a10: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 6f 73 65  ponding to those
0a20: 20 70 61 67 65 73 20 74 68 61 74 20 53 51 4c 69   pages that SQLi
0a30: 74 65 20 6d 61 79 20 6e 6f 77 20 73 61 66 65 6c  te may now safel
0a40: 79 20 6d 6f 64 69 66 79 2e 0a 2a 2a 0a 2a 2a 20  y modify..**.** 
0a50: 20 57 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   Writing to the 
0a60: 44 61 74 61 62 61 73 65 20 46 69 6c 65 3a 0a 2a  Database File:.*
0a70: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 61 20 62 6c  *.**   When a bl
0a80: 6f 63 6b 20 6f 66 20 64 61 74 61 20 69 73 20 77  ock of data is w
0a90: 72 69 74 74 65 6e 20 74 6f 20 61 20 64 61 74 61  ritten to a data
0aa0: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 20 66  base file, the f
0ab0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 20 20 69 6e  ollowing.**   in
0ac0: 76 61 72 69 61 6e 74 73 20 61 72 65 20 61 73 73  variants are ass
0ad0: 65 72 74 65 64 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  erted:.**.**    
0ae0: 20 61 29 20 54 68 61 74 20 74 68 65 20 62 6c 6f   a) That the blo
0af0: 63 6b 20 6f 66 20 64 61 74 61 20 69 73 20 61 6e  ck of data is an
0b00: 20 61 6c 69 67 6e 65 64 20 62 6c 6f 63 6b 20 6f   aligned block o
0b10: 66 20 70 61 67 65 2d 73 69 7a 65 20 62 79 74 65  f page-size byte
0b20: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 62 29 20  s..**.**     b) 
0b30: 54 68 61 74 20 69 66 20 74 68 65 20 70 61 67 65  That if the page
0b40: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 64   being written d
0b50: 69 64 20 6e 6f 74 20 65 78 69 73 74 20 77 68 65  id not exist whe
0b60: 6e 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20  n the .**       
0b70: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
0b80: 20 73 74 61 72 74 65 64 20 28 69 2e 65 2e 20 74   started (i.e. t
0b90: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
0ba0: 20 69 73 20 67 72 6f 77 69 6e 67 29 2c 20 74 68   is growing), th
0bb0: 65 6e 0a 2a 2a 20 20 20 20 20 20 20 20 74 68 65  en.**        the
0bc0: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 75   journal-file mu
0bd0: 73 74 20 68 61 76 65 20 62 65 65 6e 20 73 79 6e  st have been syn
0be0: 63 65 64 20 61 74 20 6c 65 61 73 74 20 6f 6e 63  ced at least onc
0bf0: 65 20 73 69 6e 63 65 0a 2a 2a 20 20 20 20 20 20  e since.**      
0c00: 20 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74    the start of t
0c10: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  he transaction..
0c20: 2a 2a 0a 2a 2a 20 20 20 20 20 63 29 20 54 68 61  **.**     c) Tha
0c30: 74 20 69 66 20 74 68 65 20 70 61 67 65 20 62 65  t if the page be
0c40: 69 6e 67 20 77 72 69 74 74 65 6e 20 64 69 64 20  ing written did 
0c50: 65 78 69 73 74 20 77 68 65 6e 20 74 68 65 20 74  exist when the t
0c60: 72 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20  ransaction .**  
0c70: 20 20 20 20 20 20 77 61 73 20 73 74 61 72 74 65        was starte
0c80: 64 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  d, then the page
0c90: 20 6d 75 73 74 20 68 61 76 65 20 65 69 74 68 65   must have eithe
0ca0: 72 20 62 65 65 6e 20 61 20 66 72 65 65 2d 6c 69  r been a free-li
0cb0: 73 74 0a 2a 2a 20 20 20 20 20 20 20 20 6c 65 61  st.**        lea
0cc0: 66 20 70 61 67 65 20 61 74 20 74 68 65 20 73 74  f page at the st
0cd0: 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
0ce0: 61 63 74 69 6f 6e 2c 20 6f 72 20 65 6c 73 65 20  action, or else 
0cf0: 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 20 20 20  must have.**    
0d00: 20 20 20 20 62 65 65 6e 20 73 74 6f 72 65 64 20      been stored 
0d10: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
0d20: 69 6c 65 20 70 72 69 6f 72 20 74 6f 20 74 68 65  ile prior to the
0d30: 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 73 79 6e   most recent syn
0d40: 63 2e 0a 2a 2a 0a 2a 2a 20 20 43 6c 6f 73 69 6e  c..**.**  Closin
0d50: 67 20 61 20 54 72 61 6e 73 61 63 74 69 6f 6e 3a  g a Transaction:
0d60: 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 61 20  .**.**   When a 
0d70: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
0d80: 6c 6f 73 65 64 2c 20 61 6c 6c 20 64 61 74 61 20  losed, all data 
0d90: 63 6f 6c 6c 65 63 74 65 64 20 61 74 20 74 68 65  collected at the
0da0: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 74   start of.**   t
0db0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  he transaction, 
0dc0: 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 6e 20  or following an 
0dd0: 78 53 79 6e 63 20 6f 66 20 61 20 6a 6f 75 72 6e  xSync of a journ
0de0: 61 6c 2d 66 69 6c 65 2c 20 69 73 20 0a 2a 2a 20  al-file, is .** 
0df0: 20 20 64 69 73 63 61 72 64 65 64 2e 20 54 68 65    discarded. The
0e00: 20 65 6e 64 20 6f 66 20 61 20 74 72 61 6e 73 61   end of a transa
0e10: 63 74 69 6f 6e 20 69 73 20 72 65 63 6f 67 6e 69  ction is recogni
0e20: 7a 65 64 20 77 68 65 6e 20 61 6e 79 20 6f 6e 65  zed when any one
0e30: 20 0a 2a 2a 20 20 20 6f 66 20 74 68 65 20 66 6f   .**   of the fo
0e40: 6c 6c 6f 77 69 6e 67 20 6f 63 63 75 72 3a 0a 2a  llowing occur:.*
0e50: 2a 0a 2a 2a 20 20 20 20 20 61 29 20 41 20 62 6c  *.**     a) A bl
0e60: 6f 63 6b 20 6f 66 20 7a 65 72 6f 65 73 20 28 6f  ock of zeroes (o
0e70: 72 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65 20  r anything else 
0e80: 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 76 61  that is not a va
0e90: 6c 69 64 20 0a 2a 2a 20 20 20 20 20 20 20 20 6a  lid .**        j
0ea0: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 29 20 69  ournal-header) i
0eb0: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
0ec0: 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
0ed0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  urnal file..**.*
0ee0: 2a 20 20 20 20 20 62 29 20 41 20 6a 6f 75 72 6e  *     b) A journ
0ef0: 61 6c 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  al file is trunc
0f00: 61 74 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74  ated to zero byt
0f10: 65 73 20 69 6e 20 73 69 7a 65 20 75 73 69 6e 67  es in size using
0f20: 20 78 54 72 75 6e 63 61 74 65 2e 0a 2a 2a 0a 2a   xTruncate..**.*
0f30: 2a 20 20 20 20 20 63 29 20 54 68 65 20 6a 6f 75  *     c) The jou
0f40: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 6c  rnal file is del
0f50: 65 74 65 64 20 75 73 69 6e 67 20 78 44 65 6c 65  eted using xDele
0f60: 74 65 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  te..*/../*.** Ma
0f70: 78 69 6d 75 6d 20 70 61 74 68 6e 61 6d 65 20 6c  ximum pathname l
0f80: 65 6e 67 74 68 20 73 75 70 70 6f 72 74 65 64 20  ength supported 
0f90: 62 79 20 74 68 65 20 6a 74 20 62 61 63 6b 65 6e  by the jt backen
0fa0: 64 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 54  d..*/.#define JT
0fb0: 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 20 35 31  _MAX_PATHNAME 51
0fc0: 32 0a 0a 2f 2a 0a 2a 2a 20 4e 61 6d 65 20 75 73  2../*.** Name us
0fd0: 65 64 20 74 6f 20 69 64 65 6e 74 69 66 79 20 74  ed to identify t
0fe0: 68 69 73 20 56 46 53 2e 0a 2a 2f 0a 23 64 65 66  his VFS..*/.#def
0ff0: 69 6e 65 20 4a 54 5f 56 46 53 5f 4e 41 4d 45 20  ine JT_VFS_NAME 
1000: 22 6a 74 22 0a 0a 74 79 70 65 64 65 66 20 73 74  "jt"..typedef st
1010: 72 75 63 74 20 6a 74 5f 66 69 6c 65 20 6a 74 5f  ruct jt_file jt_
1020: 66 69 6c 65 3b 0a 73 74 72 75 63 74 20 6a 74 5f  file;.struct jt_
1030: 66 69 6c 65 20 7b 0a 20 20 73 71 6c 69 74 65 33  file {.  sqlite3
1040: 5f 66 69 6c 65 20 62 61 73 65 3b 0a 20 20 63 6f  _file base;.  co
1050: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
1060: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
1070: 66 20 6f 70 65 6e 20 66 69 6c 65 20 2a 2f 0a 20  f open file */. 
1080: 20 69 6e 74 20 66 6c 61 67 73 3b 20 20 20 20 20   int flags;     
1090: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
10a0: 67 73 20 74 68 65 20 66 69 6c 65 20 77 61 73 20  gs the file was 
10b0: 6f 70 65 6e 65 64 20 77 69 74 68 20 2a 2f 0a 0a  opened with */..
10c0: 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
10d0: 6e 67 20 61 72 65 20 6f 6e 6c 79 20 75 73 65 64  ng are only used
10e0: 20 62 79 20 64 61 74 61 62 61 73 65 20 66 69 6c   by database fil
10f0: 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 73 20 2a  e file handles *
1100: 2f 0a 20 20 69 6e 74 20 65 4c 6f 63 6b 3b 20 20  /.  int eLock;  
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1120: 43 75 72 72 65 6e 74 20 6c 6f 63 6b 20 68 65 6c  Current lock hel
1130: 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 20 2a 2f  d on the file */
1140: 0a 20 20 75 33 32 20 6e 50 61 67 65 3b 20 20 20  .  u32 nPage;   
1150: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
1160: 69 7a 65 20 6f 66 20 66 69 6c 65 20 69 6e 20 70  ize of file in p
1170: 61 67 65 73 20 77 68 65 6e 20 74 72 61 6e 73 61  ages when transa
1180: 63 74 69 6f 6e 20 73 74 61 72 74 65 64 20 2a 2f  ction started */
1190: 0a 20 20 75 33 32 20 6e 50 61 67 65 73 69 7a 65  .  u32 nPagesize
11a0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  ;           /* P
11b0: 61 67 65 20 73 69 7a 65 20 77 68 65 6e 20 74 72  age size when tr
11c0: 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
11d0: 64 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  d */.  Bitvec *p
11e0: 57 72 69 74 61 62 6c 65 3b 20 20 20 20 20 20 20  Writable;       
11f0: 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70 61 67  /* Bitvec of pag
1200: 65 73 20 74 68 61 74 20 6d 61 79 20 62 65 20 77  es that may be w
1210: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
1220: 6c 65 20 2a 2f 0a 20 20 75 33 32 20 2a 61 43 6b  le */.  u32 *aCk
1230: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
1240: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 66 6f 72   /* Checksum for
1250: 20 66 69 72 73 74 20 6e 50 61 67 65 20 70 61 67   first nPage pag
1260: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 79 6e  es */.  int nSyn
1270: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
1280: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 69   /* Number of ti
1290: 6d 65 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  mes journal file
12a0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
12b0: 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 6e 6c 79 20 75   */..  /* Only u
12c0: 73 65 64 20 62 79 20 6a 6f 75 72 6e 61 6c 20 66  sed by journal f
12d0: 69 6c 65 2d 68 61 6e 64 6c 65 73 20 2a 2f 0a 20  ile-handles */. 
12e0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
12f0: 4d 61 78 4f 66 66 3b 20 20 20 2f 2a 20 4d 61 78  MaxOff;   /* Max
1300: 69 6d 75 6d 20 6f 66 66 73 65 74 20 77 72 69 74  imum offset writ
1310: 74 65 6e 20 74 6f 20 74 68 69 73 20 74 72 61 6e  ten to this tran
1320: 73 61 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 6a 74  saction */..  jt
1330: 5f 66 69 6c 65 20 2a 70 4e 65 78 74 3b 20 20 20  _file *pNext;   
1340: 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 66 69         /* All fi
1350: 6c 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 69  les are stored i
1360: 6e 20 61 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  n a linked list 
1370: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
1380: 65 20 2a 70 52 65 61 6c 3b 20 20 20 20 20 2f 2a  e *pReal;     /*
1390: 20 54 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   The file handle
13a0: 20 66 6f 72 20 74 68 65 20 75 6e 64 65 72 6c 79   for the underly
13b0: 69 6e 67 20 76 66 73 20 2a 2f 0a 7d 3b 0a 0a 2f  ing vfs */.};../
13c0: 2a 0a 2a 2a 20 4d 65 74 68 6f 64 20 64 65 63 6c  *.** Method decl
13d0: 61 72 61 74 69 6f 6e 73 20 66 6f 72 20 6a 74 5f  arations for jt_
13e0: 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
13f0: 69 6e 74 20 6a 74 43 6c 6f 73 65 28 73 71 6c 69  int jtClose(sqli
1400: 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73 74 61 74  te3_file*);.stat
1410: 69 63 20 69 6e 74 20 6a 74 52 65 61 64 28 73 71  ic int jtRead(sq
1420: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 76 6f 69  lite3_file*, voi
1430: 64 2a 2c 20 69 6e 74 20 69 41 6d 74 2c 20 73 71  d*, int iAmt, sq
1440: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 4f 66 73  lite3_int64 iOfs
1450: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  t);.static int j
1460: 74 57 72 69 74 65 28 73 71 6c 69 74 65 33 5f 66  tWrite(sqlite3_f
1470: 69 6c 65 2a 2c 63 6f 6e 73 74 20 76 6f 69 64 2a  ile*,const void*
1480: 2c 69 6e 74 20 69 41 6d 74 2c 20 73 71 6c 69 74  ,int iAmt, sqlit
1490: 65 33 5f 69 6e 74 36 34 20 69 4f 66 73 74 29 3b  e3_int64 iOfst);
14a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 54 72  .static int jtTr
14b0: 75 6e 63 61 74 65 28 73 71 6c 69 74 65 33 5f 66  uncate(sqlite3_f
14c0: 69 6c 65 2a 2c 20 73 71 6c 69 74 65 33 5f 69 6e  ile*, sqlite3_in
14d0: 74 36 34 20 73 69 7a 65 29 3b 0a 73 74 61 74 69  t64 size);.stati
14e0: 63 20 69 6e 74 20 6a 74 53 79 6e 63 28 73 71 6c  c int jtSync(sql
14f0: 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20  ite3_file*, int 
1500: 66 6c 61 67 73 29 3b 0a 73 74 61 74 69 63 20 69  flags);.static i
1510: 6e 74 20 6a 74 46 69 6c 65 53 69 7a 65 28 73 71  nt jtFileSize(sq
1520: 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 73 71 6c  lite3_file*, sql
1530: 69 74 65 33 5f 69 6e 74 36 34 20 2a 70 53 69 7a  ite3_int64 *pSiz
1540: 65 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  e);.static int j
1550: 74 4c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  tLock(sqlite3_fi
1560: 6c 65 2a 2c 20 69 6e 74 29 3b 0a 73 74 61 74 69  le*, int);.stati
1570: 63 20 69 6e 74 20 6a 74 55 6e 6c 6f 63 6b 28 73  c int jtUnlock(s
1580: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 2c 20 69 6e  qlite3_file*, in
1590: 74 29 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  t);.static int j
15a0: 74 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f  tCheckReservedLo
15b0: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ck(sqlite3_file*
15c0: 2c 20 69 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63  , int *);.static
15d0: 20 69 6e 74 20 6a 74 46 69 6c 65 43 6f 6e 74 72   int jtFileContr
15e0: 6f 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  ol(sqlite3_file*
15f0: 2c 20 69 6e 74 20 6f 70 2c 20 76 6f 69 64 20 2a  , int op, void *
1600: 70 41 72 67 29 3b 0a 73 74 61 74 69 63 20 69 6e  pArg);.static in
1610: 74 20 6a 74 53 65 63 74 6f 72 53 69 7a 65 28 73  t jtSectorSize(s
1620: 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29 3b 0a 73  qlite3_file*);.s
1630: 74 61 74 69 63 20 69 6e 74 20 6a 74 44 65 76 69  tatic int jtDevi
1640: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
1650: 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29  s(sqlite3_file*)
1660: 3b 0a 0a 2f 2a 0a 2a 2a 20 4d 65 74 68 6f 64 20  ;../*.** Method 
1670: 64 65 63 6c 61 72 61 74 69 6f 6e 73 20 66 6f 72  declarations for
1680: 20 6a 74 5f 76 66 73 2e 0a 2a 2f 0a 73 74 61 74   jt_vfs..*/.stat
1690: 69 63 20 69 6e 74 20 6a 74 4f 70 65 6e 28 73 71  ic int jtOpen(sq
16a0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73  lite3_vfs*, cons
16b0: 74 20 63 68 61 72 20 2a 2c 20 73 71 6c 69 74 65  t char *, sqlite
16c0: 33 5f 66 69 6c 65 2a 2c 20 69 6e 74 20 2c 20 69  3_file*, int , i
16d0: 6e 74 20 2a 29 3b 0a 73 74 61 74 69 63 20 69 6e  nt *);.static in
16e0: 74 20 6a 74 44 65 6c 65 74 65 28 73 71 6c 69 74  t jtDelete(sqlit
16f0: 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20 63  e3_vfs*, const c
1700: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20  har *zName, int 
1710: 73 79 6e 63 44 69 72 29 3b 0a 73 74 61 74 69 63  syncDir);.static
1720: 20 69 6e 74 20 6a 74 41 63 63 65 73 73 28 73 71   int jtAccess(sq
1730: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73  lite3_vfs*, cons
1740: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
1750: 6e 74 20 66 6c 61 67 73 2c 20 69 6e 74 20 2a 29  nt flags, int *)
1760: 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 46  ;.static int jtF
1770: 75 6c 6c 50 61 74 68 6e 61 6d 65 28 73 71 6c 69  ullPathname(sqli
1780: 74 65 33 5f 76 66 73 2a 2c 20 63 6f 6e 73 74 20  te3_vfs*, const 
1790: 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74  char *zName, int
17a0: 2c 20 63 68 61 72 20 2a 7a 4f 75 74 29 3b 0a 73  , char *zOut);.s
17b0: 74 61 74 69 63 20 76 6f 69 64 20 2a 6a 74 44 6c  tatic void *jtDl
17c0: 4f 70 65 6e 28 73 71 6c 69 74 65 33 5f 76 66 73  Open(sqlite3_vfs
17d0: 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  *, const char *z
17e0: 46 69 6c 65 6e 61 6d 65 29 3b 0a 73 74 61 74 69  Filename);.stati
17f0: 63 20 76 6f 69 64 20 6a 74 44 6c 45 72 72 6f 72  c void jtDlError
1800: 28 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69  (sqlite3_vfs*, i
1810: 6e 74 20 6e 42 79 74 65 2c 20 63 68 61 72 20 2a  nt nByte, char *
1820: 7a 45 72 72 4d 73 67 29 3b 0a 73 74 61 74 69 63  zErrMsg);.static
1830: 20 76 6f 69 64 20 28 2a 6a 74 44 6c 53 79 6d 28   void (*jtDlSym(
1840: 73 71 6c 69 74 65 33 5f 76 66 73 2a 2c 76 6f 69  sqlite3_vfs*,voi
1850: 64 2a 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  d*, const char *
1860: 7a 53 79 6d 62 6f 6c 29 29 28 76 6f 69 64 29 3b  zSymbol))(void);
1870: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 74 44  .static void jtD
1880: 6c 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76  lClose(sqlite3_v
1890: 66 73 2a 2c 20 76 6f 69 64 2a 29 3b 0a 73 74 61  fs*, void*);.sta
18a0: 74 69 63 20 69 6e 74 20 6a 74 52 61 6e 64 6f 6d  tic int jtRandom
18b0: 6e 65 73 73 28 73 71 6c 69 74 65 33 5f 76 66 73  ness(sqlite3_vfs
18c0: 2a 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63 68  *, int nByte, ch
18d0: 61 72 20 2a 7a 4f 75 74 29 3b 0a 73 74 61 74 69  ar *zOut);.stati
18e0: 63 20 69 6e 74 20 6a 74 53 6c 65 65 70 28 73 71  c int jtSleep(sq
18f0: 6c 69 74 65 33 5f 76 66 73 2a 2c 20 69 6e 74 20  lite3_vfs*, int 
1900: 6d 69 63 72 6f 73 65 63 6f 6e 64 73 29 3b 0a 73  microseconds);.s
1910: 74 61 74 69 63 20 69 6e 74 20 6a 74 43 75 72 72  tatic int jtCurr
1920: 65 6e 74 54 69 6d 65 28 73 71 6c 69 74 65 33 5f  entTime(sqlite3_
1930: 76 66 73 2a 2c 20 64 6f 75 62 6c 65 2a 29 3b 0a  vfs*, double*);.
1940: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
1950: 76 66 73 20 6a 74 5f 76 66 73 20 3d 20 7b 0a 20  vfs jt_vfs = {. 
1960: 20 31 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   1,             
1970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1980: 2f 2a 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20  /* iVersion */. 
1990: 20 73 69 7a 65 6f 66 28 6a 74 5f 66 69 6c 65 29   sizeof(jt_file)
19a0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19b0: 2f 2a 20 73 7a 4f 73 46 69 6c 65 20 2a 2f 0a 20  /* szOsFile */. 
19c0: 20 4a 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45   JT_MAX_PATHNAME
19d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
19e0: 2f 2a 20 6d 78 50 61 74 68 6e 61 6d 65 20 2a 2f  /* mxPathname */
19f0: 0a 20 20 30 2c 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: 20 20 2f 2a 20 70 4e 65 78 74 20 2a 2f 0a 20 20    /* pNext */.  
1a20: 4a 54 5f 56 46 53 5f 4e 41 4d 45 2c 20 20 20 20  JT_VFS_NAME,    
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1a40: 2a 20 7a 4e 61 6d 65 20 2a 2f 0a 20 20 30 2c 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 20 20 2f 2a 20 70              /* p
1a70: 41 70 70 44 61 74 61 20 2a 2f 0a 20 20 6a 74 4f  AppData */.  jtO
1a80: 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20 20 20  pen,            
1a90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1aa0: 4f 70 65 6e 20 2a 2f 0a 20 20 6a 74 44 65 6c 65  Open */.  jtDele
1ab0: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1ac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 65 6c           /* xDel
1ad0: 65 74 65 20 2a 2f 0a 20 20 6a 74 41 63 63 65 73  ete */.  jtAcces
1ae0: 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s,              
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 78 41 63 63 65          /* xAcce
1b00: 73 73 20 2a 2f 0a 20 20 6a 74 46 75 6c 6c 50 61  ss */.  jtFullPa
1b10: 74 68 6e 61 6d 65 2c 20 20 20 20 20 20 20 20 20  thname,         
1b20: 20 20 20 20 20 20 20 2f 2a 20 78 46 75 6c 6c 50         /* xFullP
1b30: 61 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 6a 74 44  athname */.  jtD
1b40: 6c 4f 70 65 6e 2c 20 20 20 20 20 20 20 20 20 20  lOpen,          
1b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1b60: 44 6c 4f 70 65 6e 20 2a 2f 0a 20 20 6a 74 44 6c  DlOpen */.  jtDl
1b70: 45 72 72 6f 72 2c 20 20 20 20 20 20 20 20 20 20  Error,          
1b80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1b90: 6c 45 72 72 6f 72 20 2a 2f 0a 20 20 6a 74 44 6c  lError */.  jtDl
1ba0: 53 79 6d 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sym,            
1bb0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44             /* xD
1bc0: 6c 53 79 6d 20 2a 2f 0a 20 20 6a 74 44 6c 43 6c  lSym */.  jtDlCl
1bd0: 6f 73 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ose,            
1be0: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 44 6c 43           /* xDlC
1bf0: 6c 6f 73 65 20 2a 2f 0a 20 20 6a 74 52 61 6e 64  lose */.  jtRand
1c00: 6f 6d 6e 65 73 73 2c 20 20 20 20 20 20 20 20 20  omness,         
1c10: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 52 61 6e           /* xRan
1c20: 64 6f 6d 6e 65 73 73 20 2a 2f 0a 20 20 6a 74 53  domness */.  jtS
1c30: 6c 65 65 70 2c 20 20 20 20 20 20 20 20 20 20 20  leep,           
1c40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1c50: 53 6c 65 65 70 20 2a 2f 0a 20 20 6a 74 43 75 72  Sleep */.  jtCur
1c60: 72 65 6e 74 54 69 6d 65 20 20 20 20 20 20 20 20  rentTime        
1c70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78 43 75            /* xCu
1c80: 72 72 65 6e 74 54 69 6d 65 20 2a 2f 0a 7d 3b 0a  rrentTime */.};.
1c90: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
1ca0: 69 6f 5f 6d 65 74 68 6f 64 73 20 6a 74 5f 69 6f  io_methods jt_io
1cb0: 5f 6d 65 74 68 6f 64 73 20 3d 20 7b 0a 20 20 31  _methods = {.  1
1cc0: 2c 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 20 20 2f 2a                /*
1ce0: 20 69 56 65 72 73 69 6f 6e 20 2a 2f 0a 20 20 6a   iVersion */.  j
1cf0: 74 43 6c 6f 73 65 2c 20 20 20 20 20 20 20 20 20  tClose,         
1d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1d10: 20 78 43 6c 6f 73 65 20 2a 2f 0a 20 20 6a 74 52   xClose */.  jtR
1d20: 65 61 64 2c 20 20 20 20 20 20 20 20 20 20 20 20  ead,            
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1d40: 52 65 61 64 20 2a 2f 0a 20 20 6a 74 57 72 69 74  Read */.  jtWrit
1d50: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
1d60: 20 20 20 20 20 20 20 20 20 2f 2a 20 78 57 72 69           /* xWri
1d70: 74 65 20 2a 2f 0a 20 20 6a 74 54 72 75 6e 63 61  te */.  jtTrunca
1d80: 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1d90: 20 20 20 20 20 20 20 2f 2a 20 78 54 72 75 6e 63         /* xTrunc
1da0: 61 74 65 20 2a 2f 0a 20 20 6a 74 53 79 6e 63 2c  ate */.  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 20 20 2f 2a 20 78 53 79 6e 63          /* xSync
1dd0: 20 2a 2f 0a 20 20 6a 74 46 69 6c 65 53 69 7a 65   */.  jtFileSize
1de0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
1df0: 20 20 20 20 20 2f 2a 20 78 46 69 6c 65 53 69 7a       /* xFileSiz
1e00: 65 20 2a 2f 0a 20 20 6a 74 4c 6f 63 6b 2c 20 20  e */.  jtLock,  
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e20: 20 20 20 20 20 20 2f 2a 20 78 4c 6f 63 6b 20 2a        /* xLock *
1e30: 2f 0a 20 20 6a 74 55 6e 6c 6f 63 6b 2c 20 20 20  /.  jtUnlock,   
1e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e50: 20 20 20 2f 2a 20 78 55 6e 6c 6f 63 6b 20 2a 2f     /* xUnlock */
1e60: 0a 20 20 6a 74 43 68 65 63 6b 52 65 73 65 72 76  .  jtCheckReserv
1e70: 65 64 4c 6f 63 6b 2c 20 20 20 20 20 20 20 20 20  edLock,         
1e80: 20 20 2f 2a 20 78 43 68 65 63 6b 52 65 73 65 72    /* xCheckReser
1e90: 76 65 64 4c 6f 63 6b 20 2a 2f 0a 20 20 6a 74 46  vedLock */.  jtF
1ea0: 69 6c 65 43 6f 6e 74 72 6f 6c 2c 20 20 20 20 20  ileControl,     
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 78              /* x
1ec0: 46 69 6c 65 43 6f 6e 74 72 6f 6c 20 2a 2f 0a 20  FileControl */. 
1ed0: 20 6a 74 53 65 63 74 6f 72 53 69 7a 65 2c 20 20   jtSectorSize,  
1ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ef0: 2f 2a 20 78 53 65 63 74 6f 72 53 69 7a 65 20 2a  /* xSectorSize *
1f00: 2f 0a 20 20 6a 74 44 65 76 69 63 65 43 68 61 72  /.  jtDeviceChar
1f10: 61 63 74 65 72 69 73 74 69 63 73 20 20 20 20 20  acteristics     
1f20: 20 20 20 2f 2a 20 78 44 65 76 69 63 65 43 68 61     /* xDeviceCha
1f30: 72 61 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a  racteristics */.
1f40: 7d 3b 0a 0a 73 74 72 75 63 74 20 4a 74 47 6c 6f  };..struct JtGlo
1f50: 62 61 6c 20 7b 0a 20 20 73 71 6c 69 74 65 33 5f  bal {.  sqlite3_
1f60: 76 66 73 20 2a 70 56 66 73 3b 20 20 20 20 20 20  vfs *pVfs;      
1f70: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 65 6e 74         /* Parent
1f80: 20 56 46 53 20 2a 2f 0a 20 20 6a 74 5f 66 69 6c   VFS */.  jt_fil
1f90: 65 20 2a 70 4c 69 73 74 3b 20 20 20 20 20 20 20  e *pList;       
1fa0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
1fb0: 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 66 69 6c   of all open fil
1fc0: 65 73 20 2a 2f 0a 7d 3b 0a 73 74 61 74 69 63 20  es */.};.static 
1fd0: 73 74 72 75 63 74 20 4a 74 47 6c 6f 62 61 6c 20  struct JtGlobal 
1fe0: 67 20 3d 20 7b 30 2c 20 30 7d 3b 0a 0a 2f 2a 0a  g = {0, 0};../*.
1ff0: 2a 2a 20 46 75 6e 63 74 69 6f 6e 73 20 74 6f 20  ** Functions to 
2000: 6f 62 74 61 69 6e 20 61 6e 64 20 72 65 6c 69 6e  obtain and relin
2010: 71 75 69 73 68 20 61 20 6d 75 74 65 78 20 74 6f  quish a mutex to
2020: 20 70 72 6f 74 65 63 74 20 67 2e 70 4c 69 73 74   protect g.pList
2030: 2e 20 54 68 65 0a 2a 2a 20 53 54 41 54 49 43 5f  . The.** STATIC_
2040: 50 52 4e 47 20 6d 75 74 65 78 20 69 73 20 72 65  PRNG mutex is re
2050: 75 73 65 64 2c 20 70 75 72 65 6c 79 20 66 6f 72  used, purely for
2060: 20 74 68 65 20 73 61 6b 65 20 6f 66 20 63 6f 6e   the sake of con
2070: 76 65 6e 69 65 6e 63 65 2e 0a 2a 2f 0a 73 74 61  venience..*/.sta
2080: 74 69 63 20 76 6f 69 64 20 65 6e 74 65 72 4a 74  tic void enterJt
2090: 4d 75 74 65 78 28 76 6f 69 64 29 7b 0a 20 20 73  Mutex(void){.  s
20a0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
20b0: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
20c0: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
20d0: 54 45 58 5f 53 54 41 54 49 43 5f 50 52 4e 47 29  TEX_STATIC_PRNG)
20e0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
20f0: 20 6c 65 61 76 65 4a 74 4d 75 74 65 78 28 76 6f   leaveJtMutex(vo
2100: 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 6d  id){.  sqlite3_m
2110: 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
2120: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
2130: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
2140: 49 43 5f 50 52 4e 47 29 29 3b 0a 7d 0a 0a 65 78  IC_PRNG));.}..ex
2150: 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33  tern int sqlite3
2160: 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
2170: 67 3b 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  g;.static void s
2180: 74 6f 70 5f 69 6f 65 72 72 5f 73 69 6d 75 6c 61  top_ioerr_simula
2190: 74 69 6f 6e 28 69 6e 74 20 2a 70 69 53 61 76 65  tion(int *piSave
21a0: 29 7b 0a 20 20 2a 70 69 53 61 76 65 20 3d 20 73  ){.  *piSave = s
21b0: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
21c0: 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c 69 74  pending;.  sqlit
21d0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
21e0: 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 73 74 61 74  ing = -1;.}.stat
21f0: 69 63 20 76 6f 69 64 20 73 74 61 72 74 5f 69 6f  ic void start_io
2200: 65 72 72 5f 73 69 6d 75 6c 61 74 69 6f 6e 28 69  err_simulation(i
2210: 6e 74 20 69 53 61 76 65 29 7b 0a 20 20 73 71 6c  nt iSave){.  sql
2220: 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
2230: 6e 64 69 6e 67 20 3d 20 69 53 61 76 65 3b 0a 7d  nding = iSave;.}
2240: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 74 5f 66  ../*.** The jt_f
2250: 69 6c 65 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  ile pointed to b
2260: 79 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 6d  y the argument m
2270: 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65  ay or may not be
2280: 20 61 20 66 69 6c 65 2d 68 61 6e 64 6c 65 0a 2a   a file-handle.*
2290: 2a 20 6f 70 65 6e 20 6f 6e 20 61 20 6d 61 69 6e  * open on a main
22a0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22b0: 49 66 20 69 74 20 69 73 2c 20 61 6e 64 20 61 20  If it is, and a 
22c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
22d0: 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 6f 70 65 6e  urrently.** open
22e0: 65 64 20 6f 6e 20 74 68 65 20 66 69 6c 65 2c 20  ed on the file, 
22f0: 74 68 65 6e 20 64 69 73 63 61 72 64 20 61 6c 6c  then discard all
2300: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72 65 6c   transaction rel
2310: 61 74 65 64 20 64 61 74 61 2e 0a 2a 2f 0a 73 74  ated data..*/.st
2320: 61 74 69 63 20 76 6f 69 64 20 63 6c 6f 73 65 54  atic void closeT
2330: 72 61 6e 73 61 63 74 69 6f 6e 28 6a 74 5f 66 69  ransaction(jt_fi
2340: 6c 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65  le *p){.  sqlite
2350: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
2360: 2d 3e 70 57 72 69 74 61 62 6c 65 29 3b 0a 20 20  ->pWritable);.  
2370: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
2380: 61 43 6b 73 75 6d 29 3b 0a 20 20 70 2d 3e 70 57  aCksum);.  p->pW
2390: 72 69 74 61 62 6c 65 20 3d 20 30 3b 0a 20 20 70  ritable = 0;.  p
23a0: 2d 3e 61 43 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  ->aCksum = 0;.  
23b0: 70 2d 3e 6e 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  p->nSync = 0;.}.
23c0: 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
23d0: 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  jt-file..*/.stat
23e0: 69 63 20 69 6e 74 20 6a 74 43 6c 6f 73 65 28 73  ic int jtClose(s
23f0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69  qlite3_file *pFi
2400: 6c 65 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a  le){.  jt_file *
2410: 2a 70 70 3b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a  *pp;.  jt_file *
2420: 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70  p = (jt_file *)p
2430: 46 69 6c 65 3b 0a 0a 20 20 63 6c 6f 73 65 54 72  File;..  closeTr
2440: 61 6e 73 61 63 74 69 6f 6e 28 70 29 3b 0a 20 20  ansaction(p);.  
2450: 65 6e 74 65 72 4a 74 4d 75 74 65 78 28 29 3b 0a  enterJtMutex();.
2460: 20 20 69 66 28 20 70 2d 3e 7a 4e 61 6d 65 20 29    if( p->zName )
2470: 7b 0a 20 20 20 20 66 6f 72 28 70 70 3d 26 67 2e  {.    for(pp=&g.
2480: 70 4c 69 73 74 3b 20 2a 70 70 21 3d 70 3b 20 70  pList; *pp!=p; p
2490: 70 3d 26 28 2a 70 70 29 2d 3e 70 4e 65 78 74 29  p=&(*pp)->pNext)
24a0: 3b 0a 20 20 20 20 2a 70 70 20 3d 20 70 2d 3e 70  ;.    *pp = p->p
24b0: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 6c 65 61 76  Next;.  }.  leav
24c0: 65 4a 74 4d 75 74 65 78 28 29 3b 0a 20 20 72 65  eJtMutex();.  re
24d0: 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 43 6c  turn sqlite3OsCl
24e0: 6f 73 65 28 70 2d 3e 70 52 65 61 6c 29 3b 0a 7d  ose(p->pReal);.}
24f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 64 61 74  ../*.** Read dat
2500: 61 20 66 72 6f 6d 20 61 6e 20 6a 74 2d 66 69 6c  a from an jt-fil
2510: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2520: 20 6a 74 52 65 61 64 28 0a 20 20 73 71 6c 69 74   jtRead(.  sqlit
2530: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
2540: 0a 20 20 76 6f 69 64 20 2a 7a 42 75 66 2c 20 0a  .  void *zBuf, .
2550: 20 20 69 6e 74 20 69 41 6d 74 2c 20 0a 20 20 73    int iAmt, .  s
2560: 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 4f 66 73  qlite_int64 iOfs
2570: 74 0a 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a  t.){.  jt_file *
2580: 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70  p = (jt_file *)p
2590: 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20 73  File;.  return s
25a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 2d 3e  qlite3OsRead(p->
25b0: 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69 41 6d  pReal, zBuf, iAm
25c0: 74 2c 20 69 4f 66 73 74 29 3b 0a 7d 0a 0a 2f 2a  t, iOfst);.}../*
25d0: 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4a  .** Parameter zJ
25e0: 6f 75 72 6e 61 6c 20 69 73 20 74 68 65 20 6e 61  ournal is the na
25f0: 6d 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  me of a journal 
2600: 66 69 6c 65 20 74 68 61 74 20 69 73 20 63 75 72  file that is cur
2610: 72 65 6e 74 6c 79 20 0a 2a 2a 20 6f 70 65 6e 2e  rently .** open.
2620: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6c   This function l
2630: 6f 63 61 74 65 73 20 61 6e 64 20 72 65 74 75 72  ocates and retur
2640: 6e 73 20 74 68 65 20 68 61 6e 64 6c 65 20 6f 70  ns the handle op
2650: 65 6e 65 64 20 6f 6e 20 74 68 65 0a 2a 2a 20 63  ened on the.** c
2660: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 64 61 74  orresponding dat
2670: 61 62 61 73 65 20 66 69 6c 65 20 62 79 20 74 68  abase file by th
2680: 65 20 70 61 67 65 72 20 74 68 61 74 20 63 75 72  e pager that cur
2690: 72 65 6e 74 6c 79 20 68 61 73 20 74 68 65 0a 2a  rently has the.*
26a0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  * journal file o
26b0: 70 65 6e 65 64 2e 20 54 68 69 73 20 66 69 6c 65  pened. This file
26c0: 2d 68 61 6e 64 6c 65 20 69 73 20 69 64 65 6e 74  -handle is ident
26d0: 69 66 69 65 64 20 62 79 20 74 68 65 20 0a 2a 2a  ified by the .**
26e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 70 72 6f 70 65   following prope
26f0: 72 74 69 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61  rties:.**.**   a
2700: 29 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  ) SQLITE_OPEN_MA
2710: 49 4e 5f 44 42 20 77 61 73 20 73 70 65 63 69 66  IN_DB was specif
2720: 69 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 6c  ied when the fil
2730: 65 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 2a 2a  e was opened..**
2740: 0a 2a 2a 20 20 20 62 29 20 54 68 65 20 66 69 6c  .**   b) The fil
2750: 65 2d 6e 61 6d 65 20 73 70 65 63 69 66 69 65 64  e-name specified
2760: 20 77 68 65 6e 20 74 68 65 20 66 69 6c 65 20 77   when the file w
2770: 61 73 20 6f 70 65 6e 65 64 20 6d 61 74 63 68 65  as opened matche
2780: 73 0a 2a 2a 20 20 20 20 20 20 61 6c 6c 20 62 75  s.**      all bu
2790: 74 20 74 68 65 20 66 69 6e 61 6c 20 38 20 63 68  t the final 8 ch
27a0: 61 72 61 63 74 65 72 73 20 6f 66 20 74 68 65 20  aracters of the 
27b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
27c0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 63 29 20 54 68  e..**.**   c) Th
27d0: 65 72 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ere is currently
27e0: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
27f0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a   on the file..**
2800: 2f 0a 73 74 61 74 69 63 20 6a 74 5f 66 69 6c 65  /.static jt_file
2810: 20 2a 6c 6f 63 61 74 65 44 61 74 61 62 61 73 65   *locateDatabase
2820: 48 61 6e 64 6c 65 28 63 6f 6e 73 74 20 63 68 61  Handle(const cha
2830: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 29 7b 0a 20 20  r *zJournal){.  
2840: 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 20 3d  jt_file *pMain =
2850: 20 30 3b 0a 20 20 65 6e 74 65 72 4a 74 4d 75 74   0;.  enterJtMut
2860: 65 78 28 29 3b 0a 20 20 66 6f 72 28 70 4d 61 69  ex();.  for(pMai
2870: 6e 3d 67 2e 70 4c 69 73 74 3b 20 70 4d 61 69 6e  n=g.pList; pMain
2880: 3b 20 70 4d 61 69 6e 3d 70 4d 61 69 6e 2d 3e 70  ; pMain=pMain->p
2890: 4e 65 78 74 29 7b 0a 20 20 20 20 69 6e 74 20 6e  Next){.    int n
28a0: 4e 61 6d 65 20 3d 20 73 74 72 6c 65 6e 28 7a 4a  Name = strlen(zJ
28b0: 6f 75 72 6e 61 6c 29 20 2d 20 73 74 72 6c 65 6e  ournal) - strlen
28c0: 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b 0a 20 20  ("-journal");.  
28d0: 20 20 69 66 28 20 28 70 4d 61 69 6e 2d 3e 66 6c    if( (pMain->fl
28e0: 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
28f0: 4d 41 49 4e 5f 44 42 29 0a 20 20 20 20 20 26 26  MAIN_DB).     &&
2900: 20 28 73 74 72 6c 65 6e 28 70 4d 61 69 6e 2d 3e   (strlen(pMain->
2910: 7a 4e 61 6d 65 29 3d 3d 6e 4e 61 6d 65 29 0a 20  zName)==nName). 
2920: 20 20 20 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70      && 0==memcmp
2930: 28 70 4d 61 69 6e 2d 3e 7a 4e 61 6d 65 2c 20 7a  (pMain->zName, z
2940: 4a 6f 75 72 6e 61 6c 2c 20 6e 4e 61 6d 65 29 0a  Journal, nName).
2950: 20 20 20 20 20 26 26 20 28 70 4d 61 69 6e 2d 3e       && (pMain->
2960: 65 4c 6f 63 6b 3e 3d 53 51 4c 49 54 45 5f 4c 4f  eLock>=SQLITE_LO
2970: 43 4b 5f 52 45 53 45 52 56 45 44 29 0a 20 20 20  CK_RESERVED).   
2980: 20 29 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   ){.      break;
2990: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 6c 65 61  .    }.  }.  lea
29a0: 76 65 4a 74 4d 75 74 65 78 28 29 3b 0a 20 20 72  veJtMutex();.  r
29b0: 65 74 75 72 6e 20 70 4d 61 69 6e 3b 0a 7d 0a 0a  eturn pMain;.}..
29c0: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
29d0: 7a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 62 75  z points to a bu
29e0: 66 66 65 72 20 6f 66 20 34 20 62 79 74 65 73 20  ffer of 4 bytes 
29f0: 69 6e 20 73 69 7a 65 20 63 6f 6e 74 61 69 6e 69  in size containi
2a00: 6e 67 20 61 20 0a 2a 2a 20 75 6e 73 69 67 6e 65  ng a .** unsigne
2a10: 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
2a20: 20 73 74 6f 72 65 64 20 69 6e 20 62 69 67 2d 65   stored in big-e
2a30: 6e 64 69 61 6e 20 66 6f 72 6d 61 74 2e 20 44 65  ndian format. De
2a40: 63 6f 64 65 20 74 68 65 20 0a 2a 2a 20 69 6e 74  code the .** int
2a50: 65 67 65 72 20 61 6e 64 20 72 65 74 75 72 6e 20  eger and return 
2a60: 69 74 73 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  its value..*/.st
2a70: 61 74 69 63 20 75 33 32 20 64 65 63 6f 64 65 55  atic u32 decodeU
2a80: 69 6e 74 33 32 28 63 6f 6e 73 74 20 75 6e 73 69  int32(const unsi
2a90: 67 6e 65 64 20 63 68 61 72 20 2a 7a 29 7b 0a 20  gned char *z){. 
2aa0: 20 72 65 74 75 72 6e 20 28 7a 5b 30 5d 3c 3c 32   return (z[0]<<2
2ab0: 34 29 20 2b 20 28 7a 5b 31 5d 3c 3c 31 36 29 20  4) + (z[1]<<16) 
2ac0: 2b 20 28 7a 5b 32 5d 3c 3c 38 29 20 2b 20 7a 5b  + (z[2]<<8) + z[
2ad0: 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c  3];.}../*.** Cal
2ae0: 63 75 6c 61 74 65 20 61 20 63 68 65 63 6b 73 75  culate a checksu
2af0: 6d 20 66 72 6f 6d 20 74 68 65 20 62 75 66 66 65  m from the buffe
2b00: 72 20 6f 66 20 6c 65 6e 67 74 68 20 6e 20 62 79  r of length n by
2b10: 74 65 73 20 70 6f 69 6e 74 65 64 20 74 6f 0a 2a  tes pointed to.*
2b20: 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20 7a  * by parameter z
2b30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
2b40: 67 65 6e 43 6b 73 75 6d 28 63 6f 6e 73 74 20 75  genCksum(const u
2b50: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 2c  nsigned char *z,
2b60: 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69   int n){.  int i
2b70: 3b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  ;.  u32 cksum = 
2b80: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
2b90: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
2ba0: 75 6d 20 3d 20 63 6b 73 75 6d 20 2b 20 7a 5b 69  um = cksum + z[i
2bb0: 5d 20 2b 20 28 63 6b 73 75 6d 3c 3c 33 29 3b 0a  ] + (cksum<<3);.
2bc0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
2bd0: 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  um;.}../*.** The
2be0: 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 2c   first argument,
2bf0: 20 7a 42 75 66 2c 20 70 6f 69 6e 74 73 20 74 6f   zBuf, points to
2c00: 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
2c10: 6e 69 6e 67 20 61 20 32 38 20 62 79 74 65 0a 2a  ning a 28 byte.*
2c20: 2a 20 73 65 72 69 61 6c 69 7a 65 64 20 6a 6f 75  * serialized jou
2c30: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 54 68 69  rnal header. Thi
2c40: 73 20 66 75 6e 63 74 69 6f 6e 20 64 65 73 65 72  s function deser
2c50: 69 61 6c 69 7a 65 73 20 66 6f 75 72 20 6f 66 20  ializes four of 
2c60: 74 68 65 0a 2a 2a 20 69 6e 74 65 67 65 72 20 66  the.** integer f
2c70: 69 65 6c 64 73 20 63 6f 6e 74 61 69 6e 65 64 20  ields contained 
2c80: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  in the journal h
2c90: 65 61 64 65 72 20 61 6e 64 20 77 72 69 74 65 73  eader and writes
2ca0: 20 74 68 65 69 72 0a 2a 2a 20 76 61 6c 75 65 73   their.** values
2cb0: 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 76   to the output v
2cc0: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
2cd0: 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2ce0: 75 72 6e 65 64 20 69 66 20 74 68 65 20 6a 6f 75  urned if the jou
2cf0: 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 73 20 73  rnal-header is s
2d00: 75 63 63 65 73 73 66 75 6c 6c 79 20 0a 2a 2a 20  uccessfully .** 
2d10: 64 65 63 6f 64 65 64 2e 20 4f 74 68 65 72 77 69  decoded. Otherwi
2d20: 73 65 2c 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  se, SQLITE_ERROR
2d30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2d40: 64 65 63 6f 64 65 4a 6f 75 72 6e 61 6c 48 64 72  decodeJournalHdr
2d50: 28 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  (.  const unsign
2d60: 65 64 20 63 68 61 72 20 2a 7a 42 75 66 2c 20 20  ed char *zBuf,  
2d70: 20 20 20 20 20 20 20 2f 2a 20 49 6e 70 75 74 3a         /* Input:
2d80: 20 32 38 20 62 79 74 65 20 6a 6f 75 72 6e 61 6c   28 byte journal
2d90: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32   header */.  u32
2da0: 20 2a 70 6e 52 65 63 2c 20 20 20 20 20 20 20 20   *pnRec,        
2db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dc0: 2f 2a 20 4f 75 74 3a 20 4e 75 6d 62 65 72 20 6f  /* Out: Number o
2dd0: 66 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 72 65 63  f journalled rec
2de0: 6f 72 64 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ords */.  u32 *p
2df0: 6e 50 61 67 65 2c 20 20 20 20 20 20 20 20 20 20  nPage,          
2e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e10: 4f 75 74 3a 20 4f 72 69 67 69 6e 61 6c 20 64 61  Out: Original da
2e20: 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
2e30: 74 20 2a 2f 0a 20 20 75 33 32 20 2a 70 6e 53 65  t */.  u32 *pnSe
2e40: 63 74 6f 72 2c 20 20 20 20 20 20 20 20 20 20 20  ctor,           
2e50: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74            /* Out
2e60: 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 69 6e  : Sector size in
2e70: 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
2e80: 2a 70 6e 50 61 67 65 73 69 7a 65 20 20 20 20 20  *pnPagesize     
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2ea0: 2a 20 4f 75 74 3a 20 50 61 67 65 20 73 69 7a 65  * Out: Page size
2eb0: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 29 7b 0a   in bytes */.){.
2ec0: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
2ed0: 61 4d 61 67 69 63 5b 5d 20 3d 20 7b 20 30 78 64  aMagic[] = { 0xd
2ee0: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
2ef0: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
2f00: 20 30 78 36 33 2c 20 30 78 64 37 20 7d 3b 0a 20   0x63, 0xd7 };. 
2f10: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
2f20: 69 63 2c 20 7a 42 75 66 2c 20 38 29 20 29 20 72  ic, zBuf, 8) ) r
2f30: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
2f40: 4f 52 3b 0a 20 20 69 66 28 20 70 6e 52 65 63 20  OR;.  if( pnRec 
2f50: 29 20 2a 70 6e 52 65 63 20 3d 20 64 65 63 6f 64  ) *pnRec = decod
2f60: 65 55 69 6e 74 33 32 28 26 7a 42 75 66 5b 38 5d  eUint32(&zBuf[8]
2f70: 29 3b 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20  );.  if( pnPage 
2f80: 29 20 2a 70 6e 50 61 67 65 20 3d 20 64 65 63 6f  ) *pnPage = deco
2f90: 64 65 55 69 6e 74 33 32 28 26 7a 42 75 66 5b 31  deUint32(&zBuf[1
2fa0: 36 5d 29 3b 0a 20 20 69 66 28 20 70 6e 53 65 63  6]);.  if( pnSec
2fb0: 74 6f 72 20 29 20 2a 70 6e 53 65 63 74 6f 72 20  tor ) *pnSector 
2fc0: 3d 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28 26  = decodeUint32(&
2fd0: 7a 42 75 66 5b 32 30 5d 29 3b 0a 20 20 69 66 28  zBuf[20]);.  if(
2fe0: 20 70 6e 50 61 67 65 73 69 7a 65 20 29 20 2a 70   pnPagesize ) *p
2ff0: 6e 50 61 67 65 73 69 7a 65 20 3d 20 64 65 63 6f  nPagesize = deco
3000: 64 65 55 69 6e 74 33 32 28 26 7a 42 75 66 5b 32  deUint32(&zBuf[2
3010: 34 5d 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  4]);.  return SQ
3020: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
3030: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
3040: 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61  is called when a
3050: 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69 6f 6e   new transaction
3060: 20 69 73 20 6f 70 65 6e 65 64 2c 20 6a 75 73 74   is opened, just
3070: 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 66 69   after.** the fi
3080: 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  rst journal-head
3090: 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  er is written to
30a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
30b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
30c0: 20 6f 70 65 6e 54 72 61 6e 73 61 63 74 69 6f 6e   openTransaction
30d0: 28 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 2c  (jt_file *pMain,
30e0: 20 6a 74 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e   jt_file *pJourn
30f0: 61 6c 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  al){.  unsigned 
3100: 63 68 61 72 20 2a 61 44 61 74 61 3b 0a 20 20 73  char *aData;.  s
3110: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 20 3d  qlite3_file *p =
3120: 20 70 4d 61 69 6e 2d 3e 70 52 65 61 6c 3b 0a 20   pMain->pReal;. 
3130: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
3140: 5f 4f 4b 3b 0a 0a 20 20 61 44 61 74 61 20 3d 20  _OK;..  aData = 
3150: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70  sqlite3_malloc(p
3160: 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 29  Main->nPagesize)
3170: 3b 0a 20 20 70 4d 61 69 6e 2d 3e 70 57 72 69 74  ;.  pMain->pWrit
3180: 61 62 6c 65 20 3d 20 73 71 6c 69 74 65 33 42 69  able = sqlite3Bi
3190: 74 76 65 63 43 72 65 61 74 65 28 70 4d 61 69 6e  tvecCreate(pMain
31a0: 2d 3e 6e 50 61 67 65 29 3b 0a 20 20 70 4d 61 69  ->nPage);.  pMai
31b0: 6e 2d 3e 61 43 6b 73 75 6d 20 3d 20 73 71 6c 69  n->aCksum = sqli
31c0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 73 69 7a 65 6f  te3_malloc(sizeo
31d0: 66 28 75 33 32 29 20 2a 20 28 70 4d 61 69 6e 2d  f(u32) * (pMain-
31e0: 3e 6e 50 61 67 65 20 2b 20 31 29 29 3b 0a 20 20  >nPage + 1));.  
31f0: 70 4a 6f 75 72 6e 61 6c 2d 3e 69 4d 61 78 4f 66  pJournal->iMaxOf
3200: 66 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 21 70  f = 0;..  if( !p
3210: 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65 20  Main->pWritable 
3220: 7c 7c 20 21 70 4d 61 69 6e 2d 3e 61 43 6b 73 75  || !pMain->aCksu
3230: 6d 20 7c 7c 20 21 61 44 61 74 61 20 29 7b 0a 20  m || !aData ){. 
3240: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49     rc = SQLITE_I
3250: 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65  OERR_NOMEM;.  }e
3260: 6c 73 65 20 69 66 28 20 70 4d 61 69 6e 2d 3e 6e  lse if( pMain->n
3270: 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20 75 33  Page>0 ){.    u3
3280: 32 20 69 54 72 75 6e 6b 3b 0a 20 20 20 20 69 6e  2 iTrunk;.    in
3290: 74 20 69 53 61 76 65 3b 0a 0a 20 20 20 20 73 74  t iSave;..    st
32a0: 6f 70 5f 69 6f 65 72 72 5f 73 69 6d 75 6c 61 74  op_ioerr_simulat
32b0: 69 6f 6e 28 26 69 53 61 76 65 29 3b 0a 0a 20 20  ion(&iSave);..  
32c0: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 64 61    /* Read the da
32d0: 74 61 62 61 73 65 20 66 72 65 65 2d 6c 69 73 74  tabase free-list
32e0: 2e 20 41 64 64 20 74 68 65 20 70 61 67 65 2d 6e  . Add the page-n
32f0: 75 6d 62 65 72 20 66 6f 72 20 65 61 63 68 20 66  umber for each f
3300: 72 65 65 2d 6c 69 73 74 0a 20 20 20 20 2a 2a 20  ree-list.    ** 
3310: 6c 65 61 66 20 74 6f 20 74 68 65 20 6a 74 5f 66  leaf to the jt_f
3320: 69 6c 65 2e 70 57 72 69 74 61 62 6c 65 20 62 69  ile.pWritable bi
3330: 74 76 65 63 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tvec..    */.   
3340: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
3350: 65 61 64 28 70 2c 20 61 44 61 74 61 2c 20 70 4d  ead(p, aData, pM
3360: 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 2c 20  ain->nPagesize, 
3370: 30 29 3b 0a 20 20 20 20 69 54 72 75 6e 6b 20 3d  0);.    iTrunk =
3380: 20 64 65 63 6f 64 65 55 69 6e 74 33 32 28 26 61   decodeUint32(&a
3390: 44 61 74 61 5b 33 32 5d 29 3b 0a 20 20 20 20 77  Data[32]);.    w
33a0: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
33b0: 5f 4f 4b 20 26 26 20 69 54 72 75 6e 6b 3e 30 20  _OK && iTrunk>0 
33c0: 29 7b 0a 20 20 20 20 20 20 75 33 32 20 6e 4c 65  ){.      u32 nLe
33d0: 61 66 3b 0a 20 20 20 20 20 20 75 33 32 20 69 4c  af;.      u32 iL
33e0: 65 61 66 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  eaf;.      sqlit
33f0: 65 33 5f 69 6e 74 36 34 20 69 4f 66 66 20 3d 20  e3_int64 iOff = 
3400: 28 69 54 72 75 6e 6b 2d 31 29 2a 70 4d 61 69 6e  (iTrunk-1)*pMain
3410: 2d 3e 6e 50 61 67 65 73 69 7a 65 3b 0a 20 20 20  ->nPagesize;.   
3420: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
3430: 73 52 65 61 64 28 70 2c 20 61 44 61 74 61 2c 20  sRead(p, aData, 
3440: 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65  pMain->nPagesize
3450: 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 6e  , iOff);.      n
3460: 4c 65 61 66 20 3d 20 64 65 63 6f 64 65 55 69 6e  Leaf = decodeUin
3470: 74 33 32 28 26 61 44 61 74 61 5b 34 5d 29 3b 0a  t32(&aData[4]);.
3480: 20 20 20 20 20 20 66 6f 72 28 69 4c 65 61 66 3d        for(iLeaf=
3490: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
34a0: 20 26 26 20 69 4c 65 61 66 3c 6e 4c 65 61 66 3b   && iLeaf<nLeaf;
34b0: 20 69 4c 65 61 66 2b 2b 29 7b 0a 20 20 20 20 20   iLeaf++){.     
34c0: 20 20 20 75 33 32 20 70 67 6e 6f 20 3d 20 64 65     u32 pgno = de
34d0: 63 6f 64 65 55 69 6e 74 33 32 28 26 61 44 61 74  codeUint32(&aDat
34e0: 61 5b 38 2b 34 2a 69 4c 65 61 66 5d 29 3b 0a 20  a[8+4*iLeaf]);. 
34f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
3500: 74 76 65 63 53 65 74 28 70 4d 61 69 6e 2d 3e 70  tvecSet(pMain->p
3510: 57 72 69 74 61 62 6c 65 2c 20 70 67 6e 6f 29 3b  Writable, pgno);
3520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
3530: 54 72 75 6e 6b 20 3d 20 64 65 63 6f 64 65 55 69  Trunk = decodeUi
3540: 6e 74 33 32 28 61 44 61 74 61 29 3b 0a 20 20 20  nt32(aData);.   
3550: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 61 6c 63 75   }..    /* Calcu
3560: 6c 61 74 65 20 61 6e 64 20 73 74 6f 72 65 20 61  late and store a
3570: 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 65 61   checksum for ea
3580: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
3590: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
35a0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
35b0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
35c0: 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 66 6f  int ii;.      fo
35d0: 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
35e0: 54 45 5f 4f 4b 20 26 26 20 69 69 3c 70 4d 61 69  TE_OK && ii<pMai
35f0: 6e 2d 3e 6e 50 61 67 65 3b 20 69 69 2b 2b 29 7b  n->nPage; ii++){
3600: 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4f 66  .        i64 iOf
3610: 66 20 3d 20 28 69 36 34 29 28 70 4d 61 69 6e 2d  f = (i64)(pMain-
3620: 3e 6e 50 61 67 65 73 69 7a 65 29 20 2a 20 28 69  >nPagesize) * (i
3630: 36 34 29 69 69 3b 0a 20 20 20 20 20 20 20 20 69  64)ii;.        i
3640: 66 28 20 69 4f 66 66 3d 3d 50 45 4e 44 49 4e 47  f( iOff==PENDING
3650: 5f 42 59 54 45 20 29 20 63 6f 6e 74 69 6e 75 65  _BYTE ) continue
3660: 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
3670: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61  qlite3OsRead(pMa
3680: 69 6e 2d 3e 70 52 65 61 6c 2c 20 61 44 61 74 61  in->pReal, aData
3690: 2c 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69  , pMain->nPagesi
36a0: 7a 65 2c 20 69 4f 66 66 29 3b 0a 20 20 20 20 20  ze, iOff);.     
36b0: 20 20 20 70 4d 61 69 6e 2d 3e 61 43 6b 73 75 6d     pMain->aCksum
36c0: 5b 69 69 5d 20 3d 20 67 65 6e 43 6b 73 75 6d 28  [ii] = genCksum(
36d0: 61 44 61 74 61 2c 20 70 4d 61 69 6e 2d 3e 6e 50  aData, pMain->nP
36e0: 61 67 65 73 69 7a 65 29 3b 0a 20 20 20 20 20 20  agesize);.      
36f0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 74 61  }.    }..    sta
3700: 72 74 5f 69 6f 65 72 72 5f 73 69 6d 75 6c 61 74  rt_ioerr_simulat
3710: 69 6f 6e 28 69 53 61 76 65 29 3b 0a 20 20 7d 0a  ion(iSave);.  }.
3720: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
3730: 61 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e  aData);.  return
3740: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
3750: 69 74 65 20 64 61 74 61 20 74 6f 20 61 6e 20 6a  ite data to an j
3760: 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  t-file..*/.stati
3770: 63 20 69 6e 74 20 6a 74 57 72 69 74 65 28 0a 20  c int jtWrite(. 
3780: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
3790: 46 69 6c 65 2c 20 0a 20 20 63 6f 6e 73 74 20 76  File, .  const v
37a0: 6f 69 64 20 2a 7a 42 75 66 2c 20 0a 20 20 69 6e  oid *zBuf, .  in
37b0: 74 20 69 41 6d 74 2c 20 0a 20 20 73 71 6c 69 74  t iAmt, .  sqlit
37c0: 65 5f 69 6e 74 36 34 20 69 4f 66 73 74 0a 29 7b  e_int64 iOfst.){
37d0: 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20  .  jt_file *p = 
37e0: 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  (jt_file *)pFile
37f0: 3b 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73  ;.  if( p->flags
3800: 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  &SQLITE_OPEN_MAI
3810: 4e 5f 4a 4f 55 52 4e 41 4c 20 29 7b 0a 20 20 20  N_JOURNAL ){.   
3820: 20 69 66 28 20 69 4f 66 73 74 3d 3d 30 20 29 7b   if( iOfst==0 ){
3830: 0a 20 20 20 20 20 20 6a 74 5f 66 69 6c 65 20 2a  .      jt_file *
3840: 70 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61  pMain = locateDa
3850: 74 61 62 61 73 65 48 61 6e 64 6c 65 28 70 2d 3e  tabaseHandle(p->
3860: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 61 73  zName);.      as
3870: 73 65 72 74 28 20 70 4d 61 69 6e 20 29 3b 0a 20  sert( pMain );. 
3880: 20 0a 20 20 20 20 20 20 69 66 28 20 64 65 63 6f   .      if( deco
3890: 64 65 4a 6f 75 72 6e 61 6c 48 64 72 28 7a 42 75  deJournalHdr(zBu
38a0: 66 2c 20 30 2c 20 26 70 4d 61 69 6e 2d 3e 6e 50  f, 0, &pMain->nP
38b0: 61 67 65 2c 20 30 2c 20 26 70 4d 61 69 6e 2d 3e  age, 0, &pMain->
38c0: 6e 50 61 67 65 73 69 7a 65 29 20 29 7b 0a 20 20  nPagesize) ){.  
38d0: 20 20 20 20 20 20 2f 2a 20 5a 65 72 6f 69 6e 67        /* Zeroing
38e0: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
38f0: 61 6c 2d 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al-file header. 
3900: 54 68 69 73 20 69 73 20 74 68 65 20 65 6e 64 20  This is the end 
3910: 6f 66 20 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  of a.        ** 
3920: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a  transaction. */.
3930: 20 20 20 20 20 20 20 20 63 6c 6f 73 65 54 72 61          closeTra
3940: 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e 29 3b  nsaction(pMain);
3950: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
3960: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 69 6e 67        /* Writing
3970: 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e   the first journ
3980: 61 6c 20 68 65 61 64 65 72 20 74 6f 20 61 20 6a  al header to a j
3990: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69  ournal file. Thi
39a0: 73 20 68 61 70 70 65 6e 73 0a 20 20 20 20 20 20  s happens.      
39b0: 20 20 2a 2a 20 77 68 65 6e 20 61 20 74 72 61 6e    ** when a tran
39c0: 73 61 63 74 69 6f 6e 20 69 73 20 66 69 72 73 74  saction is first
39d0: 20 73 74 61 72 74 65 64 2e 20 20 2a 2f 0a 20 20   started.  */.  
39e0: 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
39f0: 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
3a00: 5f 4f 4b 21 3d 28 72 63 3d 6f 70 65 6e 54 72 61  _OK!=(rc=openTra
3a10: 6e 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e 2c 20  nsaction(pMain, 
3a20: 70 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  p)) ){.         
3a30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
3a40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3a50: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 69    }.    if( p->i
3a60: 4d 61 78 4f 66 66 3c 28 69 4f 66 73 74 20 2b 20  MaxOff<(iOfst + 
3a70: 69 41 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 70  iAmt) ){.      p
3a80: 2d 3e 69 4d 61 78 4f 66 66 20 3d 20 69 4f 66 73  ->iMaxOff = iOfs
3a90: 74 20 2b 20 69 41 6d 74 3b 0a 20 20 20 20 7d 0a  t + iAmt;.    }.
3aa0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 66 6c    }..  if( p->fl
3ab0: 61 67 73 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ags&SQLITE_OPEN_
3ac0: 4d 41 49 4e 5f 44 42 20 26 26 20 70 2d 3e 70 57  MAIN_DB && p->pW
3ad0: 72 69 74 61 62 6c 65 20 29 7b 0a 20 20 20 20 69  ritable ){.    i
3ae0: 66 28 20 69 41 6d 74 3c 70 2d 3e 6e 50 61 67 65  f( iAmt<p->nPage
3af0: 73 69 7a 65 20 0a 20 20 20 20 20 26 26 20 70 2d  size .     && p-
3b00: 3e 6e 50 61 67 65 73 69 7a 65 25 69 41 6d 74 3d  >nPagesize%iAmt=
3b10: 3d 30 20 0a 20 20 20 20 20 26 26 20 69 4f 66 73  =0 .     && iOfs
3b20: 74 3e 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  t>=(PENDING_BYTE
3b30: 2b 35 31 32 29 20 0a 20 20 20 20 20 26 26 20 69  +512) .     && i
3b40: 4f 66 73 74 2b 69 41 6d 74 3c 3d 50 45 4e 44 49  Ofst+iAmt<=PENDI
3b50: 4e 47 5f 42 59 54 45 2b 70 2d 3e 6e 50 61 67 65  NG_BYTE+p->nPage
3b60: 73 69 7a 65 0a 20 20 20 20 29 7b 0a 20 20 20 20  size.    ){.    
3b70: 20 20 2f 2a 20 4e 6f 2d 6f 70 2e 20 54 68 69 73    /* No-op. This
3b80: 20 73 70 65 63 69 61 6c 20 63 61 73 65 20 69 73   special case is
3b90: 20 68 69 74 20 77 68 65 6e 20 74 68 65 20 62 61   hit when the ba
3ba0: 63 6b 75 70 20 63 6f 64 65 20 69 73 20 63 6f 70  ckup code is cop
3bb0: 79 69 6e 67 20 61 0a 20 20 20 20 20 20 2a 2a 20  ying a.      ** 
3bc0: 74 6f 20 61 20 64 61 74 61 62 61 73 65 20 77 69  to a database wi
3bd0: 74 68 20 61 20 6c 61 72 67 65 72 20 70 61 67 65  th a larger page
3be0: 2d 73 69 7a 65 20 74 68 61 6e 20 74 68 65 20 73  -size than the s
3bf0: 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 61  ource database a
3c00: 6e 64 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 6e  nd.      ** it n
3c10: 65 65 64 73 20 74 6f 20 66 69 6c 6c 20 69 6e 20  eeds to fill in 
3c20: 74 68 65 20 6e 6f 6e 2d 6c 6f 63 6b 69 6e 67 2d  the non-locking-
3c30: 72 65 67 69 6f 6e 20 70 61 72 74 20 6f 66 20 74  region part of t
3c40: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 20 20 20 20  he original.    
3c50: 20 20 2a 2a 20 70 65 6e 64 69 6e 67 2d 62 79 74    ** pending-byt
3c60: 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 2a 2f  e page..      */
3c70: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
3c80: 20 20 75 33 32 20 70 67 6e 6f 20 3d 20 69 4f 66    u32 pgno = iOf
3c90: 73 74 2f 70 2d 3e 6e 50 61 67 65 73 69 7a 65 20  st/p->nPagesize 
3ca0: 2b 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  + 1;.      asser
3cb0: 74 28 20 28 69 41 6d 74 3d 3d 31 7c 7c 69 41 6d  t( (iAmt==1||iAm
3cc0: 74 3d 3d 70 2d 3e 6e 50 61 67 65 73 69 7a 65 29  t==p->nPagesize)
3cd0: 20 26 26 20 28 28 69 4f 66 73 74 2b 69 41 6d 74   && ((iOfst+iAmt
3ce0: 29 25 70 2d 3e 6e 50 61 67 65 73 69 7a 65 29 3d  )%p->nPagesize)=
3cf0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  =0 );.      asse
3d00: 72 74 28 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 50 61  rt( pgno<=p->nPa
3d10: 67 65 20 7c 7c 20 70 2d 3e 6e 53 79 6e 63 3e 30  ge || p->nSync>0
3d20: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
3d30: 28 20 70 67 6e 6f 3e 70 2d 3e 6e 50 61 67 65 20  ( pgno>p->nPage 
3d40: 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  || sqlite3Bitvec
3d50: 54 65 73 74 28 70 2d 3e 70 57 72 69 74 61 62 6c  Test(p->pWritabl
3d60: 65 2c 20 70 67 6e 6f 29 20 29 3b 0a 20 20 20 20  e, pgno) );.    
3d70: 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
3d80: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
3d90: 2d 3e 70 52 65 61 6c 2c 20 7a 42 75 66 2c 20 69  ->pReal, zBuf, i
3da0: 41 6d 74 2c 20 69 4f 66 73 74 29 3b 0a 7d 0a 0a  Amt, iOfst);.}..
3db0: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 61  /*.** Truncate a
3dc0: 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  n jt-file..*/.st
3dd0: 61 74 69 63 20 69 6e 74 20 6a 74 54 72 75 6e 63  atic int jtTrunc
3de0: 61 74 65 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  ate(sqlite3_file
3df0: 20 2a 70 46 69 6c 65 2c 20 73 71 6c 69 74 65 5f   *pFile, sqlite_
3e00: 69 6e 74 36 34 20 73 69 7a 65 29 7b 0a 20 20 6a  int64 size){.  j
3e10: 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f  t_file *p = (jt_
3e20: 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
3e30: 69 66 28 20 70 2d 3e 66 6c 61 67 73 26 53 51 4c  if( p->flags&SQL
3e40: 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f  ITE_OPEN_MAIN_JO
3e50: 55 52 4e 41 4c 20 26 26 20 73 69 7a 65 3d 3d 30  URNAL && size==0
3e60: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 75 6e 63   ){.    /* Trunc
3e70: 61 74 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 20  ating a journal 
3e80: 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 74 68  file. This is th
3e90: 65 20 65 6e 64 20 6f 66 20 61 20 74 72 61 6e 73  e end of a trans
3ea0: 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 6a  action. */.    j
3eb0: 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 20 3d 20  t_file *pMain = 
3ec0: 6c 6f 63 61 74 65 44 61 74 61 62 61 73 65 48 61  locateDatabaseHa
3ed0: 6e 64 6c 65 28 70 2d 3e 7a 4e 61 6d 65 29 3b 0a  ndle(p->zName);.
3ee0: 20 20 20 20 63 6c 6f 73 65 54 72 61 6e 73 61 63      closeTransac
3ef0: 74 69 6f 6e 28 70 4d 61 69 6e 29 3b 0a 20 20 7d  tion(pMain);.  }
3f00: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26  .  if( p->flags&
3f10: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
3f20: 5f 44 42 20 26 26 20 70 2d 3e 70 57 72 69 74 61  _DB && p->pWrita
3f30: 62 6c 65 20 29 7b 0a 20 20 20 20 75 33 32 20 70  ble ){.    u32 p
3f40: 67 6e 6f 3b 0a 20 20 20 20 75 33 32 20 6c 6f 63  gno;.    u32 loc
3f50: 6b 69 6e 67 5f 70 61 67 65 20 3d 20 28 75 33 32  king_page = (u32
3f60: 29 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  )(PENDING_BYTE/p
3f70: 2d 3e 6e 50 61 67 65 73 69 7a 65 2b 31 29 3b 0a  ->nPagesize+1);.
3f80: 20 20 20 20 66 6f 72 28 70 67 6e 6f 3d 73 69 7a      for(pgno=siz
3f90: 65 2f 70 2d 3e 6e 50 61 67 65 73 69 7a 65 2b 31  e/p->nPagesize+1
3fa0: 3b 20 70 67 6e 6f 3c 3d 70 2d 3e 6e 50 61 67 65  ; pgno<=p->nPage
3fb0: 3b 20 70 67 6e 6f 2b 2b 29 7b 0a 20 20 20 20 20  ; pgno++){.     
3fc0: 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3d 3d 6c   assert( pgno==l
3fd0: 6f 63 6b 69 6e 67 5f 70 61 67 65 20 7c 7c 20 73  ocking_page || s
3fe0: 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
3ff0: 28 70 2d 3e 70 57 72 69 74 61 62 6c 65 2c 20 70  (p->pWritable, p
4000: 67 6e 6f 29 20 29 3b 0a 20 20 20 20 7d 0a 20 20  gno) );.    }.  
4010: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
4020: 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 2d 3e  e3OsTruncate(p->
4030: 70 52 65 61 6c 2c 20 73 69 7a 65 29 3b 0a 7d 0a  pReal, size);.}.
4040: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  ./*.** The first
4050: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68 69   argument to thi
4060: 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
4070: 68 61 6e 64 6c 65 20 6f 70 65 6e 20 6f 6e 20 61  handle open on a
4080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
4090: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
40a0: 72 65 61 64 73 20 74 68 65 20 6a 6f 75 72 6e 61  reads the journa
40b0: 6c 20 66 69 6c 65 20 61 6e 64 20 61 64 64 73 20  l file and adds 
40c0: 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
40d0: 66 6f 72 20 65 61 63 68 0a 2a 2a 20 70 61 67 65  for each.** page
40e0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
40f0: 74 6f 20 74 68 65 20 42 69 74 76 65 63 20 6f 62  to the Bitvec ob
4100: 6a 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74  ject passed as t
4110: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
4120: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
4130: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 46 69 6c  t readJournalFil
4140: 65 28 6a 74 5f 66 69 6c 65 20 2a 70 2c 20 6a 74  e(jt_file *p, jt
4150: 5f 66 69 6c 65 20 2a 70 4d 61 69 6e 29 7b 0a 20  _file *pMain){. 
4160: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
4170: 5f 4f 4b 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20  _OK;.  unsigned 
4180: 63 68 61 72 20 7a 42 75 66 5b 32 38 5d 3b 0a 20  char zBuf[28];. 
4190: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
41a0: 52 65 61 6c 20 3d 20 70 2d 3e 70 52 65 61 6c 3b  Real = p->pReal;
41b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
41c0: 20 69 4f 66 66 20 3d 20 30 3b 0a 20 20 73 71 6c   iOff = 0;.  sql
41d0: 69 74 65 33 5f 69 6e 74 36 34 20 69 53 69 7a 65  ite3_int64 iSize
41e0: 20 3d 20 70 2d 3e 69 4d 61 78 4f 66 66 3b 0a 20   = p->iMaxOff;. 
41f0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4200: 61 50 61 67 65 3b 0a 20 20 69 6e 74 20 69 53 61  aPage;.  int iSa
4210: 76 65 3b 0a 0a 20 20 61 50 61 67 65 20 3d 20 73  ve;..  aPage = s
4220: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 4d  qlite3_malloc(pM
4230: 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 29 3b  ain->nPagesize);
4240: 0a 20 20 69 66 28 20 21 61 50 61 67 65 20 29 7b  .  if( !aPage ){
4250: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4260: 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a  TE_IOERR_NOMEM;.
4270: 20 20 7d 0a 0a 20 20 73 74 6f 70 5f 69 6f 65 72    }..  stop_ioer
4280: 72 5f 73 69 6d 75 6c 61 74 69 6f 6e 28 26 69 53  r_simulation(&iS
4290: 61 76 65 29 3b 0a 0a 20 20 77 68 69 6c 65 28 20  ave);..  while( 
42a0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
42b0: 20 69 4f 66 66 3c 69 53 69 7a 65 20 29 7b 0a 20   iOff<iSize ){. 
42c0: 20 20 20 75 33 32 20 6e 52 65 63 2c 20 6e 50 61     u32 nRec, nPa
42d0: 67 65 2c 20 6e 53 65 63 74 6f 72 2c 20 6e 50 61  ge, nSector, nPa
42e0: 67 65 73 69 7a 65 3b 0a 20 20 20 20 75 33 32 20  gesize;.    u32 
42f0: 69 69 3b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64  ii;..    /* Read
4300: 20 61 6e 64 20 64 65 63 6f 64 65 20 74 68 65 20   and decode the 
4310: 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 2d 68 65 61  next journal-hea
4320: 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  der from the jou
4330: 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
4340: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
4350: 52 65 61 64 28 70 52 65 61 6c 2c 20 7a 42 75 66  Read(pReal, zBuf
4360: 2c 20 32 38 2c 20 69 4f 66 66 29 3b 0a 20 20 20  , 28, iOff);.   
4370: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4380: 4f 4b 20 0a 20 20 20 20 20 7c 7c 20 64 65 63 6f  OK .     || deco
4390: 64 65 4a 6f 75 72 6e 61 6c 48 64 72 28 7a 42 75  deJournalHdr(zBu
43a0: 66 2c 20 26 6e 52 65 63 2c 20 26 6e 50 61 67 65  f, &nRec, &nPage
43b0: 2c 20 26 6e 53 65 63 74 6f 72 2c 20 26 6e 50 61  , &nSector, &nPa
43c0: 67 65 73 69 7a 65 29 20 0a 20 20 20 20 29 7b 0a  gesize) .    ){.
43d0: 20 20 20 20 20 20 67 6f 74 6f 20 66 69 6e 69 73        goto finis
43e0: 68 5f 72 6a 66 3b 0a 20 20 20 20 7d 0a 20 20 20  h_rjf;.    }.   
43f0: 20 69 4f 66 66 20 2b 3d 20 6e 53 65 63 74 6f 72   iOff += nSector
4400: 3b 0a 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  ;..    if( nRec=
4410: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41  =0 ){.      /* A
4420: 20 74 72 69 63 6b 2e 20 54 68 65 72 65 20 6d 69   trick. There mi
4430: 67 68 74 20 62 65 20 61 6e 6f 74 68 65 72 20 6a  ght be another j
4440: 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69 6d  ournal-header im
4450: 6d 65 64 69 61 74 65 6c 79 20 0a 20 20 20 20 20  mediately .     
4460: 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68   ** following th
4470: 69 73 20 6f 6e 65 2e 20 49 6e 20 74 68 69 73 20  is one. In this 
4480: 63 61 73 65 2c 20 30 20 72 65 63 6f 72 64 73 20  case, 0 records 
4490: 6d 65 61 6e 73 20 30 20 72 65 63 6f 72 64 73 2c  means 0 records,
44a0: 20 0a 20 20 20 20 20 20 2a 2a 20 6e 6f 74 20 22   .      ** not "
44b0: 72 65 61 64 20 75 6e 74 69 6c 20 74 68 65 20 65  read until the e
44c0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 22 2e  nd of the file".
44d0: 20 53 65 65 20 61 6c 73 6f 20 74 69 63 6b 65 74   See also ticket
44e0: 20 23 32 35 36 35 2e 0a 20 20 20 20 20 20 2a 2f   #2565..      */
44f0: 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 7a 65  .      if( iSize
4500: 3e 3d 28 69 4f 66 66 2b 6e 53 65 63 74 6f 72 29  >=(iOff+nSector)
4510: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
4520: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
4530: 52 65 61 6c 2c 20 7a 42 75 66 2c 20 32 38 2c 20  Real, zBuf, 28, 
4540: 69 4f 66 66 29 3b 0a 20 20 20 20 20 20 20 20 69  iOff);.        i
4550: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4560: 20 7c 7c 20 30 3d 3d 64 65 63 6f 64 65 4a 6f 75   || 0==decodeJou
4570: 72 6e 61 6c 48 64 72 28 7a 42 75 66 2c 20 30 2c  rnalHdr(zBuf, 0,
4580: 20 30 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20   0, 0, 0) ){.   
4590: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
45a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
45b0: 20 7d 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20   }.      nRec = 
45c0: 28 69 53 69 7a 65 2d 69 4f 66 66 29 20 2f 20 28  (iSize-iOff) / (
45d0: 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65  pMain->nPagesize
45e0: 2b 38 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  +8);.    }..    
45f0: 2f 2a 20 52 65 61 64 20 61 6c 6c 20 74 68 65 20  /* Read all the 
4600: 72 65 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c  records that fol
4610: 6c 6f 77 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  low the journal-
4620: 68 65 61 64 65 72 20 6a 75 73 74 20 72 65 61 64  header just read
4630: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d  . */.    for(ii=
4640: 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  0; rc==SQLITE_OK
4650: 20 26 26 20 69 69 3c 6e 52 65 63 20 26 26 20 69   && ii<nRec && i
4660: 4f 66 66 3c 69 53 69 7a 65 3b 20 69 69 2b 2b 29  Off<iSize; ii++)
4670: 7b 0a 20 20 20 20 20 20 75 33 32 20 70 67 6e 6f  {.      u32 pgno
4680: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
4690: 69 74 65 33 4f 73 52 65 61 64 28 70 52 65 61 6c  ite3OsRead(pReal
46a0: 2c 20 7a 42 75 66 2c 20 34 2c 20 69 4f 66 66 29  , zBuf, 4, iOff)
46b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
46c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
46d0: 20 20 20 20 20 70 67 6e 6f 20 3d 20 64 65 63 6f       pgno = deco
46e0: 64 65 55 69 6e 74 33 32 28 7a 42 75 66 29 3b 0a  deUint32(zBuf);.
46f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f          if( pgno
4700: 3e 30 20 26 26 20 70 67 6e 6f 3c 3d 70 4d 61 69  >0 && pgno<=pMai
4710: 6e 2d 3e 6e 50 61 67 65 20 29 7b 0a 20 20 20 20  n->nPage ){.    
4720: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71 6c        if( 0==sql
4730: 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70  ite3BitvecTest(p
4740: 4d 61 69 6e 2d 3e 70 57 72 69 74 61 62 6c 65 2c  Main->pWritable,
4750: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
4760: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
4770: 65 33 4f 73 52 65 61 64 28 70 52 65 61 6c 2c 20  e3OsRead(pReal, 
4780: 61 50 61 67 65 2c 20 70 4d 61 69 6e 2d 3e 6e 50  aPage, pMain->nP
4790: 61 67 65 73 69 7a 65 2c 20 69 4f 66 66 2b 34 29  agesize, iOff+4)
47a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
47b0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
47c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
47d0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 67 65 6e   u32 cksum = gen
47e0: 43 6b 73 75 6d 28 61 50 61 67 65 2c 20 70 4d 61  Cksum(aPage, pMa
47f0: 69 6e 2d 3e 6e 50 61 67 65 73 69 7a 65 29 3b 0a  in->nPagesize);.
4800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
4810: 73 65 72 74 28 20 63 6b 73 75 6d 3d 3d 70 4d 61  sert( cksum==pMa
4820: 69 6e 2d 3e 61 43 6b 73 75 6d 5b 70 67 6e 6f 2d  in->aCksum[pgno-
4830: 31 5d 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  1] );.          
4840: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
4850: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
4860: 33 42 69 74 76 65 63 53 65 74 28 70 4d 61 69 6e  3BitvecSet(pMain
4870: 2d 3e 70 57 72 69 74 61 62 6c 65 2c 20 70 67 6e  ->pWritable, pgn
4880: 6f 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  o);.        }.  
4890: 20 20 20 20 20 20 69 4f 66 66 20 2b 3d 20 28 38        iOff += (8
48a0: 20 2b 20 70 4d 61 69 6e 2d 3e 6e 50 61 67 65 73   + pMain->nPages
48b0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
48c0: 20 20 7d 0a 0a 20 20 20 20 69 4f 66 66 20 3d 20    }..    iOff = 
48d0: 28 28 69 4f 66 66 20 2b 20 28 6e 53 65 63 74 6f  ((iOff + (nSecto
48e0: 72 2d 31 29 29 20 2f 20 6e 53 65 63 74 6f 72 29  r-1)) / nSector)
48f0: 20 2a 20 6e 53 65 63 74 6f 72 3b 0a 20 20 7d 0a   * nSector;.  }.
4900: 0a 66 69 6e 69 73 68 5f 72 6a 66 3a 0a 20 20 73  .finish_rjf:.  s
4910: 74 61 72 74 5f 69 6f 65 72 72 5f 73 69 6d 75 6c  tart_ioerr_simul
4920: 61 74 69 6f 6e 28 69 53 61 76 65 29 3b 0a 20 20  ation(iSave);.  
4930: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 50 61  sqlite3_free(aPa
4940: 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  ge);.  if( rc==S
4950: 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
4960: 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 72 63  T_READ ){.    rc
4970: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
4980: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
4990: 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 61 6e 20  ../*.** Sync an 
49a0: 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  jt-file..*/.stat
49b0: 69 63 20 69 6e 74 20 6a 74 53 79 6e 63 28 73 71  ic int jtSync(sq
49c0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c  lite3_file *pFil
49d0: 65 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  e, int flags){. 
49e0: 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a   jt_file *p = (j
49f0: 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  t_file *)pFile;.
4a00: 0a 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 26  .  if( p->flags&
4a10: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
4a20: 5f 4a 4f 55 52 4e 41 4c 20 29 7b 0a 20 20 20 20  _JOURNAL ){.    
4a30: 69 6e 74 20 72 63 3b 0a 20 20 20 20 6a 74 5f 66  int rc;.    jt_f
4a40: 69 6c 65 20 2a 70 4d 61 69 6e 3b 20 20 20 20 20  ile *pMain;     
4a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4a60: 20 54 68 65 20 61 73 73 6f 63 69 61 74 65 64 20   The associated 
4a70: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
4a80: 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75  ..    /* The jou
4a90: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65 69  rnal file is bei
4aa0: 6e 67 20 73 79 6e 63 65 64 2e 20 41 74 20 74 68  ng synced. At th
4ab0: 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 69 6e 73  is point, we ins
4ac0: 70 65 63 74 20 74 68 65 20 0a 20 20 20 20 2a 2a  pect the .    **
4ad0: 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
4ae0: 20 66 69 6c 65 20 75 70 20 74 6f 20 74 68 69 73   file up to this
4af0: 20 70 6f 69 6e 74 20 61 6e 64 20 73 65 74 20 65   point and set e
4b00: 61 63 68 20 62 69 74 20 69 6e 20 74 68 65 20 0a  ach bit in the .
4b10: 20 20 20 20 2a 2a 20 6a 74 5f 66 69 6c 65 2e 70      ** jt_file.p
4b20: 57 72 69 74 61 62 6c 65 20 62 69 74 76 65 63 20  Writable bitvec 
4b30: 6f 66 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  of the main data
4b40: 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69  base file associ
4b50: 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 2a 2a  ated with.    **
4b60: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 66 69   this journal fi
4b70: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  le..    */.    p
4b80: 4d 61 69 6e 20 3d 20 6c 6f 63 61 74 65 44 61 74  Main = locateDat
4b90: 61 62 61 73 65 48 61 6e 64 6c 65 28 70 2d 3e 7a  abaseHandle(p->z
4ba0: 4e 61 6d 65 29 3b 0a 20 20 20 20 61 73 73 65 72  Name);.    asser
4bb0: 74 28 70 4d 61 69 6e 29 3b 0a 0a 20 20 20 20 2f  t(pMain);..    /
4bc0: 2a 20 53 65 74 20 74 68 65 20 62 69 74 76 65 63  * Set the bitvec
4bd0: 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 20 20 69   values */.    i
4be0: 66 28 20 70 4d 61 69 6e 2d 3e 70 57 72 69 74 61  f( pMain->pWrita
4bf0: 62 6c 65 20 29 7b 0a 20 20 20 20 20 20 70 4d 61  ble ){.      pMa
4c00: 69 6e 2d 3e 6e 53 79 6e 63 2b 2b 3b 0a 20 20 20  in->nSync++;.   
4c10: 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
4c20: 6e 61 6c 46 69 6c 65 28 70 2c 20 70 4d 61 69 6e  nalFile(p, pMain
4c30: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
4c40: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
4c50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
4c60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4c70: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 73 71 6c   }..  return sql
4c80: 69 74 65 33 4f 73 53 79 6e 63 28 70 2d 3e 70 52  ite3OsSync(p->pR
4c90: 65 61 6c 2c 20 66 6c 61 67 73 29 3b 0a 7d 0a 0a  eal, flags);.}..
4ca0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
4cb0: 20 63 75 72 72 65 6e 74 20 66 69 6c 65 2d 73 69   current file-si
4cc0: 7a 65 20 6f 66 20 61 6e 20 6a 74 2d 66 69 6c 65  ze of an jt-file
4cd0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4ce0: 6a 74 46 69 6c 65 53 69 7a 65 28 73 71 6c 69 74  jtFileSize(sqlit
4cf0: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
4d00: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 70 53  sqlite_int64 *pS
4d10: 69 7a 65 29 7b 0a 20 20 6a 74 5f 66 69 6c 65 20  ize){.  jt_file 
4d20: 2a 70 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29  *p = (jt_file *)
4d30: 70 46 69 6c 65 3b 0a 20 20 72 65 74 75 72 6e 20  pFile;.  return 
4d40: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
4d50: 65 28 70 2d 3e 70 52 65 61 6c 2c 20 70 53 69 7a  e(p->pReal, pSiz
4d60: 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63  e);.}../*.** Loc
4d70: 6b 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f  k an jt-file..*/
4d80: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 4c 6f  .static int jtLo
4d90: 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  ck(sqlite3_file 
4da0: 2a 70 46 69 6c 65 2c 20 69 6e 74 20 65 4c 6f 63  *pFile, int eLoc
4db0: 6b 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  k){.  int rc;.  
4dc0: 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74  jt_file *p = (jt
4dd0: 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20  _file *)pFile;. 
4de0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
4df0: 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 65 4c  ock(p->pReal, eL
4e00: 6f 63 6b 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  ock);.  if( rc==
4e10: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 4c 6f  SQLITE_OK && eLo
4e20: 63 6b 3e 70 2d 3e 65 4c 6f 63 6b 20 29 7b 0a 20  ck>p->eLock ){. 
4e30: 20 20 20 70 2d 3e 65 4c 6f 63 6b 20 3d 20 65 4c     p->eLock = eL
4e40: 6f 63 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ock;.  }.  retur
4e50: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  n rc;.}../*.** U
4e60: 6e 6c 6f 63 6b 20 61 6e 20 6a 74 2d 66 69 6c 65  nlock an jt-file
4e70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4e80: 6a 74 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33  jtUnlock(sqlite3
4e90: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e  _file *pFile, in
4ea0: 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 6e 74 20  t eLock){.  int 
4eb0: 72 63 3b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70  rc;.  jt_file *p
4ec0: 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46   = (jt_file *)pF
4ed0: 69 6c 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ile;.  rc = sqli
4ee0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 2d 3e 70  te3OsUnlock(p->p
4ef0: 52 65 61 6c 2c 20 65 4c 6f 63 6b 29 3b 0a 20 20  Real, eLock);.  
4f00: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4f10: 4b 20 26 26 20 65 4c 6f 63 6b 3c 70 2d 3e 65 4c  K && eLock<p->eL
4f20: 6f 63 6b 20 29 7b 0a 20 20 20 20 70 2d 3e 65 4c  ock ){.    p->eL
4f30: 6f 63 6b 20 3d 20 65 4c 6f 63 6b 3b 0a 20 20 7d  ock = eLock;.  }
4f40: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4f50: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20  ./*.** Check if 
4f60: 61 6e 6f 74 68 65 72 20 66 69 6c 65 2d 68 61 6e  another file-han
4f70: 64 6c 65 20 68 6f 6c 64 73 20 61 20 52 45 53 45  dle holds a RESE
4f80: 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 61 6e 20  RVED lock on an 
4f90: 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  jt-file..*/.stat
4fa0: 69 63 20 69 6e 74 20 6a 74 43 68 65 63 6b 52 65  ic int jtCheckRe
4fb0: 73 65 72 76 65 64 4c 6f 63 6b 28 73 71 6c 69 74  servedLock(sqlit
4fc0: 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20  e3_file *pFile, 
4fd0: 69 6e 74 20 2a 70 52 65 73 4f 75 74 29 7b 0a 20  int *pResOut){. 
4fe0: 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a   jt_file *p = (j
4ff0: 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  t_file *)pFile;.
5000: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5010: 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
5020: 6f 63 6b 28 70 2d 3e 70 52 65 61 6c 2c 20 70 52  ock(p->pReal, pR
5030: 65 73 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  esOut);.}../*.**
5040: 20 46 69 6c 65 20 63 6f 6e 74 72 6f 6c 20 6d 65   File control me
5050: 74 68 6f 64 2e 20 46 6f 72 20 63 75 73 74 6f 6d  thod. For custom
5060: 20 6f 70 65 72 61 74 69 6f 6e 73 20 6f 6e 20 61   operations on a
5070: 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f 0a 73 74  n jt-file..*/.st
5080: 61 74 69 63 20 69 6e 74 20 6a 74 46 69 6c 65 43  atic int jtFileC
5090: 6f 6e 74 72 6f 6c 28 73 71 6c 69 74 65 33 5f 66  ontrol(sqlite3_f
50a0: 69 6c 65 20 2a 70 46 69 6c 65 2c 20 69 6e 74 20  ile *pFile, int 
50b0: 6f 70 2c 20 76 6f 69 64 20 2a 70 41 72 67 29 7b  op, void *pArg){
50c0: 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20  .  jt_file *p = 
50d0: 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65  (jt_file *)pFile
50e0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
50f0: 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28  e3OsFileControl(
5100: 70 2d 3e 70 52 65 61 6c 2c 20 6f 70 2c 20 70 41  p->pReal, op, pA
5110: 72 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  rg);.}../*.** Re
5120: 74 75 72 6e 20 74 68 65 20 73 65 63 74 6f 72 2d  turn the sector-
5130: 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 66 6f  size in bytes fo
5140: 72 20 61 6e 20 6a 74 2d 66 69 6c 65 2e 0a 2a 2f  r an jt-file..*/
5150: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 53 65  .static int jtSe
5160: 63 74 6f 72 53 69 7a 65 28 73 71 6c 69 74 65 33  ctorSize(sqlite3
5170: 5f 66 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20  _file *pFile){. 
5180: 20 6a 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a   jt_file *p = (j
5190: 74 5f 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a  t_file *)pFile;.
51a0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
51b0: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 2d 3e  OsSectorSize(p->
51c0: 70 52 65 61 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pReal);.}../*.**
51d0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 65 76 69   Return the devi
51e0: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
51f0: 63 20 66 6c 61 67 73 20 73 75 70 70 6f 72 74 65  c flags supporte
5200: 64 20 62 79 20 61 6e 20 6a 74 2d 66 69 6c 65 2e  d by an jt-file.
5210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a  .*/.static int j
5220: 74 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  tDeviceCharacter
5230: 69 73 74 69 63 73 28 73 71 6c 69 74 65 33 5f 66  istics(sqlite3_f
5240: 69 6c 65 20 2a 70 46 69 6c 65 29 7b 0a 20 20 6a  ile *pFile){.  j
5250: 74 5f 66 69 6c 65 20 2a 70 20 3d 20 28 6a 74 5f  t_file *p = (jt_
5260: 66 69 6c 65 20 2a 29 70 46 69 6c 65 3b 0a 20 20  file *)pFile;.  
5270: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
5280: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
5290: 73 74 69 63 73 28 70 2d 3e 70 52 65 61 6c 29 3b  stics(p->pReal);
52a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
52b0: 6e 20 6a 74 20 66 69 6c 65 20 68 61 6e 64 6c 65  n jt file handle
52c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
52d0: 6a 74 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  jtOpen(.  sqlite
52e0: 33 5f 76 66 73 20 2a 70 56 66 73 2c 0a 20 20 63  3_vfs *pVfs,.  c
52f0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5300: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ,.  sqlite3_file
5310: 20 2a 70 46 69 6c 65 2c 0a 20 20 69 6e 74 20 66   *pFile,.  int f
5320: 6c 61 67 73 2c 0a 20 20 69 6e 74 20 2a 70 4f 75  lags,.  int *pOu
5330: 74 46 6c 61 67 73 0a 29 7b 0a 20 20 69 6e 74 20  tFlags.){.  int 
5340: 72 63 3b 0a 20 20 6a 74 5f 66 69 6c 65 20 2a 70  rc;.  jt_file *p
5350: 20 3d 20 28 6a 74 5f 66 69 6c 65 20 2a 29 70 46   = (jt_file *)pF
5360: 69 6c 65 3b 0a 20 20 70 46 69 6c 65 2d 3e 70 4d  ile;.  pFile->pM
5370: 65 74 68 6f 64 73 20 3d 20 30 3b 0a 20 20 70 2d  ethods = 0;.  p-
5380: 3e 70 52 65 61 6c 20 3d 20 28 73 71 6c 69 74 65  >pReal = (sqlite
5390: 33 5f 66 69 6c 65 20 2a 29 26 70 5b 31 5d 3b 0a  3_file *)&p[1];.
53a0: 20 20 70 2d 3e 70 52 65 61 6c 2d 3e 70 4d 65 74    p->pReal->pMet
53b0: 68 6f 64 73 20 3d 20 30 3b 0a 20 20 72 63 20 3d  hods = 0;.  rc =
53c0: 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 67   sqlite3OsOpen(g
53d0: 2e 70 56 66 73 2c 20 7a 4e 61 6d 65 2c 20 70 2d  .pVfs, zName, p-
53e0: 3e 70 52 65 61 6c 2c 20 66 6c 61 67 73 2c 20 70  >pReal, flags, p
53f0: 4f 75 74 46 6c 61 67 73 29 3b 0a 20 20 61 73 73  OutFlags);.  ass
5400: 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
5410: 4f 4b 20 7c 7c 20 70 2d 3e 70 52 65 61 6c 2d 3e  OK || p->pReal->
5420: 70 4d 65 74 68 6f 64 73 3d 3d 30 20 29 3b 0a 20  pMethods==0 );. 
5430: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
5440: 4f 4b 20 29 7b 0a 20 20 20 20 70 46 69 6c 65 2d  OK ){.    pFile-
5450: 3e 70 4d 65 74 68 6f 64 73 20 3d 20 26 6a 74 5f  >pMethods = &jt_
5460: 69 6f 5f 6d 65 74 68 6f 64 73 3b 0a 20 20 20 20  io_methods;.    
5470: 70 2d 3e 65 4c 6f 63 6b 20 3d 20 30 3b 0a 20 20  p->eLock = 0;.  
5480: 20 20 70 2d 3e 7a 4e 61 6d 65 20 3d 20 7a 4e 61    p->zName = zNa
5490: 6d 65 3b 0a 20 20 20 20 70 2d 3e 66 6c 61 67 73  me;.    p->flags
54a0: 20 3d 20 66 6c 61 67 73 3b 0a 20 20 20 20 70 2d   = flags;.    p-
54b0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 20 20  >pNext = 0;.    
54c0: 70 2d 3e 70 57 72 69 74 61 62 6c 65 20 3d 20 30  p->pWritable = 0
54d0: 3b 0a 20 20 20 20 70 2d 3e 61 43 6b 73 75 6d 20  ;.    p->aCksum 
54e0: 3d 20 30 3b 0a 20 20 20 20 65 6e 74 65 72 4a 74  = 0;.    enterJt
54f0: 4d 75 74 65 78 28 29 3b 0a 20 20 20 20 69 66 28  Mutex();.    if(
5500: 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
5510: 70 2d 3e 70 4e 65 78 74 20 3d 20 67 2e 70 4c 69  p->pNext = g.pLi
5520: 73 74 3b 0a 20 20 20 20 20 20 67 2e 70 4c 69 73  st;.      g.pLis
5530: 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20  t = p;.    }.   
5540: 20 6c 65 61 76 65 4a 74 4d 75 74 65 78 28 29 3b   leaveJtMutex();
5550: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
5560: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
5570: 65 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 61 74  e the file locat
5580: 65 64 20 61 74 20 7a 50 61 74 68 2e 20 49 66 20  ed at zPath. If 
5590: 74 68 65 20 64 69 72 53 79 6e 63 20 61 72 67 75  the dirSync argu
55a0: 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 0a 2a 2a  ment is true,.**
55b0: 20 65 6e 73 75 72 65 20 74 68 65 20 66 69 6c 65   ensure the file
55c0: 2d 73 79 73 74 65 6d 20 6d 6f 64 69 66 69 63 61  -system modifica
55d0: 74 69 6f 6e 73 20 61 72 65 20 73 79 6e 63 65 64  tions are synced
55e0: 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72 65 0a   to disk before.
55f0: 2a 2a 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f  ** returning..*/
5600: 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74 44 65  .static int jtDe
5610: 6c 65 74 65 28 73 71 6c 69 74 65 33 5f 76 66 73  lete(sqlite3_vfs
5620: 20 2a 70 56 66 73 2c 20 63 6f 6e 73 74 20 63 68   *pVfs, const ch
5630: 61 72 20 2a 7a 50 61 74 68 2c 20 69 6e 74 20 64  ar *zPath, int d
5640: 69 72 53 79 6e 63 29 7b 0a 20 20 69 6e 74 20 6e  irSync){.  int n
5650: 50 61 74 68 20 3d 20 73 74 72 6c 65 6e 28 7a 50  Path = strlen(zP
5660: 61 74 68 29 3b 0a 20 20 69 66 28 20 6e 50 61 74  ath);.  if( nPat
5670: 68 3e 38 20 26 26 20 30 3d 3d 73 74 72 63 6d 70  h>8 && 0==strcmp
5680: 28 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 26 7a 50  ("-journal", &zP
5690: 61 74 68 5b 6e 50 61 74 68 2d 38 5d 29 20 29 7b  ath[nPath-8]) ){
56a0: 0a 20 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67  .    /* Deleting
56b0: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
56c0: 20 54 68 65 20 65 6e 64 20 6f 66 20 61 20 74 72   The end of a tr
56d0: 61 6e 73 61 63 74 69 6f 6e 2e 20 2a 2f 0a 20 20  ansaction. */.  
56e0: 20 20 6a 74 5f 66 69 6c 65 20 2a 70 4d 61 69 6e    jt_file *pMain
56f0: 20 3d 20 6c 6f 63 61 74 65 44 61 74 61 62 61 73   = locateDatabas
5700: 65 48 61 6e 64 6c 65 28 7a 50 61 74 68 29 3b 0a  eHandle(zPath);.
5710: 20 20 20 20 69 66 28 20 70 4d 61 69 6e 20 29 7b      if( pMain ){
5720: 0a 20 20 20 20 20 20 63 6c 6f 73 65 54 72 61 6e  .      closeTran
5730: 73 61 63 74 69 6f 6e 28 70 4d 61 69 6e 29 3b 0a  saction(pMain);.
5740: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74      }.  }..  ret
5750: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  urn sqlite3OsDel
5760: 65 74 65 28 67 2e 70 56 66 73 2c 20 7a 50 61 74  ete(g.pVfs, zPat
5770: 68 2c 20 64 69 72 53 79 6e 63 29 3b 0a 7d 0a 0a  h, dirSync);.}..
5780: 2f 2a 0a 2a 2a 20 54 65 73 74 20 66 6f 72 20 61  /*.** Test for a
5790: 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e  ccess permission
57a0: 73 2e 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  s. Return true i
57b0: 66 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  f the requested 
57c0: 70 65 72 6d 69 73 73 69 6f 6e 0a 2a 2a 20 69 73  permission.** is
57d0: 20 61 76 61 69 6c 61 62 6c 65 2c 20 6f 72 20 66   available, or f
57e0: 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a  alse otherwise..
57f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 74  */.static int jt
5800: 41 63 63 65 73 73 28 0a 20 20 73 71 6c 69 74 65  Access(.  sqlite
5810: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20  3_vfs *pVfs, .  
5820: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
5830: 68 2c 20 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c  h, .  int flags,
5840: 20 0a 20 20 69 6e 74 20 2a 70 52 65 73 4f 75 74   .  int *pResOut
5850: 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  .){.  return sql
5860: 69 74 65 33 4f 73 41 63 63 65 73 73 28 67 2e 70  ite3OsAccess(g.p
5870: 56 66 73 2c 20 7a 50 61 74 68 2c 20 66 6c 61 67  Vfs, zPath, flag
5880: 73 2c 20 70 52 65 73 4f 75 74 29 3b 0a 7d 0a 0a  s, pResOut);.}..
5890: 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 62  /*.** Populate b
58a0: 75 66 66 65 72 20 7a 4f 75 74 20 77 69 74 68 20  uffer zOut with 
58b0: 74 68 65 20 66 75 6c 6c 20 63 61 6e 6f 6e 69 63  the full canonic
58c0: 61 6c 20 70 61 74 68 6e 61 6d 65 20 63 6f 72 72  al pathname corr
58d0: 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 74 6f 20  esponding.** to 
58e0: 74 68 65 20 70 61 74 68 6e 61 6d 65 20 69 6e 20  the pathname in 
58f0: 7a 50 61 74 68 2e 20 7a 4f 75 74 20 69 73 20 67  zPath. zOut is g
5900: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 70 6f 69  uaranteed to poi
5910: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 0a 2a  nt to a buffer.*
5920: 2a 20 6f 66 20 61 74 20 6c 65 61 73 74 20 28 4a  * of at least (J
5930: 54 5f 4d 41 58 5f 50 41 54 48 4e 41 4d 45 2b 31  T_MAX_PATHNAME+1
5940: 29 20 62 79 74 65 73 2e 0a 2a 2f 0a 73 74 61 74  ) bytes..*/.stat
5950: 69 63 20 69 6e 74 20 6a 74 46 75 6c 6c 50 61 74  ic int jtFullPat
5960: 68 6e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  hname(.  sqlite3
5970: 5f 76 66 73 20 2a 70 56 66 73 2c 20 0a 20 20 63  _vfs *pVfs, .  c
5980: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
5990: 2c 20 0a 20 20 69 6e 74 20 6e 4f 75 74 2c 20 0a  , .  int nOut, .
59a0: 20 20 63 68 61 72 20 2a 7a 4f 75 74 0a 29 7b 0a    char *zOut.){.
59b0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
59c0: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 67  OsFullPathname(g
59d0: 2e 70 56 66 73 2c 20 7a 50 61 74 68 2c 20 6e 4f  .pVfs, zPath, nO
59e0: 75 74 2c 20 7a 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a  ut, zOut);.}../*
59f0: 0a 2a 2a 20 4f 70 65 6e 20 74 68 65 20 64 79 6e  .** Open the dyn
5a00: 61 6d 69 63 20 6c 69 62 72 61 72 79 20 6c 6f 63  amic library loc
5a10: 61 74 65 64 20 61 74 20 7a 50 61 74 68 20 61 6e  ated at zPath an
5a20: 64 20 72 65 74 75 72 6e 20 61 20 68 61 6e 64 6c  d return a handl
5a30: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
5a40: 64 20 2a 6a 74 44 6c 4f 70 65 6e 28 73 71 6c 69  d *jtDlOpen(sqli
5a50: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 63  te3_vfs *pVfs, c
5a60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74 68  onst char *zPath
5a70: 29 7b 0a 20 20 72 65 74 75 72 6e 20 67 2e 70 56  ){.  return g.pV
5a80: 66 73 2d 3e 78 44 6c 4f 70 65 6e 28 67 2e 70 56  fs->xDlOpen(g.pV
5a90: 66 73 2c 20 7a 50 61 74 68 29 3b 0a 7d 0a 0a 2f  fs, zPath);.}../
5aa0: 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20 74 68  *.** Populate th
5ab0: 65 20 62 75 66 66 65 72 20 7a 45 72 72 4d 73 67  e buffer zErrMsg
5ac0: 20 28 73 69 7a 65 20 6e 42 79 74 65 20 62 79 74   (size nByte byt
5ad0: 65 73 29 20 77 69 74 68 20 61 20 68 75 6d 61 6e  es) with a human
5ae0: 20 72 65 61 64 61 62 6c 65 0a 2a 2a 20 75 74 66   readable.** utf
5af0: 2d 38 20 73 74 72 69 6e 67 20 64 65 73 63 72 69  -8 string descri
5b00: 62 69 6e 67 20 74 68 65 20 6d 6f 73 74 20 72 65  bing the most re
5b10: 63 65 6e 74 20 65 72 72 6f 72 20 65 6e 63 6f 75  cent error encou
5b20: 6e 74 65 72 65 64 20 61 73 73 6f 63 69 61 74 65  ntered associate
5b30: 64 20 0a 2a 2a 20 77 69 74 68 20 64 79 6e 61 6d  d .** with dynam
5b40: 69 63 20 6c 69 62 72 61 72 69 65 73 2e 0a 2a 2f  ic libraries..*/
5b50: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6a 74 44  .static void jtD
5b60: 6c 45 72 72 6f 72 28 73 71 6c 69 74 65 33 5f 76  lError(sqlite3_v
5b70: 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20 6e 42  fs *pVfs, int nB
5b80: 79 74 65 2c 20 63 68 61 72 20 2a 7a 45 72 72 4d  yte, char *zErrM
5b90: 73 67 29 7b 0a 20 20 67 2e 70 56 66 73 2d 3e 78  sg){.  g.pVfs->x
5ba0: 44 6c 45 72 72 6f 72 28 67 2e 70 56 66 73 2c 20  DlError(g.pVfs, 
5bb0: 6e 42 79 74 65 2c 20 7a 45 72 72 4d 73 67 29 3b  nByte, zErrMsg);
5bc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5bd0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
5be0: 65 20 73 79 6d 62 6f 6c 20 7a 53 79 6d 62 6f 6c  e symbol zSymbol
5bf0: 20 69 6e 20 74 68 65 20 64 79 6e 61 6d 69 63 20   in the dynamic 
5c00: 6c 69 62 72 61 72 79 20 70 48 61 6e 64 6c 65 2e  library pHandle.
5c10: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
5c20: 28 2a 6a 74 44 6c 53 79 6d 28 73 71 6c 69 74 65  (*jtDlSym(sqlite
5c30: 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 76 6f 69  3_vfs *pVfs, voi
5c40: 64 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  d *p, const char
5c50: 20 2a 7a 53 79 6d 29 29 28 76 6f 69 64 29 7b 0a   *zSym))(void){.
5c60: 20 20 72 65 74 75 72 6e 20 67 2e 70 56 66 73 2d    return g.pVfs-
5c70: 3e 78 44 6c 53 79 6d 28 67 2e 70 56 66 73 2c 20  >xDlSym(g.pVfs, 
5c80: 70 2c 20 7a 53 79 6d 29 3b 0a 7d 0a 0a 2f 2a 0a  p, zSym);.}../*.
5c90: 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20 64 79 6e  ** Close the dyn
5ca0: 61 6d 69 63 20 6c 69 62 72 61 72 79 20 68 61 6e  amic library han
5cb0: 64 6c 65 20 70 48 61 6e 64 6c 65 2e 0a 2a 2f 0a  dle pHandle..*/.
5cc0: 73 74 61 74 69 63 20 76 6f 69 64 20 6a 74 44 6c  static void jtDl
5cd0: 43 6c 6f 73 65 28 73 71 6c 69 74 65 33 5f 76 66  Close(sqlite3_vf
5ce0: 73 20 2a 70 56 66 73 2c 20 76 6f 69 64 20 2a 70  s *pVfs, void *p
5cf0: 48 61 6e 64 6c 65 29 7b 0a 20 20 67 2e 70 56 66  Handle){.  g.pVf
5d00: 73 2d 3e 78 44 6c 43 6c 6f 73 65 28 67 2e 70 56  s->xDlClose(g.pV
5d10: 66 73 2c 20 70 48 61 6e 64 6c 65 29 3b 0a 7d 0a  fs, pHandle);.}.
5d20: 0a 2f 2a 0a 2a 2a 20 50 6f 70 75 6c 61 74 65 20  ./*.** Populate 
5d30: 74 68 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74  the buffer point
5d40: 65 64 20 74 6f 20 62 79 20 7a 42 75 66 4f 75 74  ed to by zBufOut
5d50: 20 77 69 74 68 20 6e 42 79 74 65 20 62 79 74 65   with nByte byte
5d60: 73 20 6f 66 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20  s of .** random 
5d70: 64 61 74 61 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  data..*/.static 
5d80: 69 6e 74 20 6a 74 52 61 6e 64 6f 6d 6e 65 73 73  int jtRandomness
5d90: 28 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56  (sqlite3_vfs *pV
5da0: 66 73 2c 20 69 6e 74 20 6e 42 79 74 65 2c 20 63  fs, int nByte, c
5db0: 68 61 72 20 2a 7a 42 75 66 4f 75 74 29 7b 0a 20  har *zBufOut){. 
5dc0: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
5dd0: 73 52 61 6e 64 6f 6d 6e 65 73 73 28 67 2e 70 56  sRandomness(g.pV
5de0: 66 73 2c 20 6e 42 79 74 65 2c 20 7a 42 75 66 4f  fs, nByte, zBufO
5df0: 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6c  ut);.}../*.** Sl
5e00: 65 65 70 20 66 6f 72 20 6e 4d 69 63 72 6f 20 6d  eep for nMicro m
5e10: 69 63 72 6f 73 65 63 6f 6e 64 73 2e 20 52 65 74  icroseconds. Ret
5e20: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
5e30: 66 20 6d 69 63 72 6f 73 65 63 6f 6e 64 73 20 0a  f microseconds .
5e40: 2a 2a 20 61 63 74 75 61 6c 6c 79 20 73 6c 65 70  ** actually slep
5e50: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
5e60: 20 6a 74 53 6c 65 65 70 28 73 71 6c 69 74 65 33   jtSleep(sqlite3
5e70: 5f 76 66 73 20 2a 70 56 66 73 2c 20 69 6e 74 20  _vfs *pVfs, int 
5e80: 6e 4d 69 63 72 6f 29 7b 0a 20 20 72 65 74 75 72  nMicro){.  retur
5e90: 6e 20 73 71 6c 69 74 65 33 4f 73 53 6c 65 65 70  n sqlite3OsSleep
5ea0: 28 67 2e 70 56 66 73 2c 20 6e 4d 69 63 72 6f 29  (g.pVfs, nMicro)
5eb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
5ec0: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 69  n the current ti
5ed0: 6d 65 20 61 73 20 61 20 4a 75 6c 69 61 6e 20 44  me as a Julian D
5ee0: 61 79 20 6e 75 6d 62 65 72 20 69 6e 20 2a 70 54  ay number in *pT
5ef0: 69 6d 65 4f 75 74 2e 0a 2a 2f 0a 73 74 61 74 69  imeOut..*/.stati
5f00: 63 20 69 6e 74 20 6a 74 43 75 72 72 65 6e 74 54  c int jtCurrentT
5f10: 69 6d 65 28 73 71 6c 69 74 65 33 5f 76 66 73 20  ime(sqlite3_vfs 
5f20: 2a 70 56 66 73 2c 20 64 6f 75 62 6c 65 20 2a 70  *pVfs, double *p
5f30: 54 69 6d 65 4f 75 74 29 7b 0a 20 20 72 65 74 75  TimeOut){.  retu
5f40: 72 6e 20 73 71 6c 69 74 65 33 4f 73 43 75 72 72  rn sqlite3OsCurr
5f50: 65 6e 74 54 69 6d 65 28 67 2e 70 56 66 73 2c 20  entTime(g.pVfs, 
5f60: 70 54 69 6d 65 4f 75 74 29 3b 0a 7d 0a 0a 2f 2a  pTimeOut);.}../*
5f70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5f90: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fa0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5fb0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 53 74 61  *********.** Sta
5fc0: 72 74 20 6f 66 20 70 75 62 6c 69 63 20 41 50 49  rt of public API
5fd0: 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 66  ..*/../*.** Conf
5fe0: 69 67 75 72 65 20 74 68 65 20 6a 74 20 56 46 53  igure the jt VFS
5ff0: 20 61 73 20 61 20 77 72 61 70 70 65 72 20 61 72   as a wrapper ar
6000: 6f 75 6e 64 20 74 68 65 20 56 46 53 20 6e 61 6d  ound the VFS nam
6010: 65 64 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ed by parameter 
6020: 0a 2a 2a 20 7a 57 72 61 70 2e 20 49 66 20 74 68  .** zWrap. If th
6030: 65 20 69 73 44 65 66 61 75 6c 74 20 70 61 72 61  e isDefault para
6040: 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 74  meter is true, t
6050: 68 65 6e 20 74 68 65 20 6a 74 20 56 46 53 20 69  hen the jt VFS i
6060: 73 20 69 6e 73 74 61 6c 6c 65 64 0a 2a 2a 20 61  s installed.** a
6070: 73 20 74 68 65 20 6e 65 77 20 64 65 66 61 75 6c  s the new defaul
6080: 74 20 56 46 53 20 66 6f 72 20 53 51 4c 69 74 65  t VFS for SQLite
6090: 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 2e 20 49 66   connections. If
60a0: 20 69 73 44 65 66 61 75 6c 74 20 69 73 20 6e 6f   isDefault is no
60b0: 74 0a 2a 2a 20 74 72 75 65 2c 20 74 68 65 6e 20  t.** true, then 
60c0: 74 68 65 20 6a 74 20 56 46 53 20 69 73 20 69 6e  the jt VFS is in
60d0: 73 74 61 6c 6c 65 64 20 61 73 20 6e 6f 6e 2d 64  stalled as non-d
60e0: 65 66 61 75 6c 74 2e 20 49 6e 20 74 68 69 73 20  efault. In this 
60f0: 63 61 73 65 20 69 74 0a 2a 2a 20 69 73 20 61 76  case it.** is av
6100: 61 69 6c 61 62 6c 65 20 76 69 61 20 69 74 73 20  ailable via its 
6110: 6e 61 6d 65 2c 20 22 6a 74 22 2e 0a 2a 2f 0a 69  name, "jt"..*/.i
6120: 6e 74 20 6a 74 5f 72 65 67 69 73 74 65 72 28 63  nt jt_register(c
6130: 68 61 72 20 2a 7a 57 72 61 70 2c 20 69 6e 74 20  har *zWrap, int 
6140: 69 73 44 65 66 61 75 6c 74 29 7b 0a 20 20 67 2e  isDefault){.  g.
6150: 70 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  pVfs = sqlite3_v
6160: 66 73 5f 66 69 6e 64 28 7a 57 72 61 70 29 3b 0a  fs_find(zWrap);.
6170: 20 20 69 66 28 20 67 2e 70 56 66 73 3d 3d 30 20    if( g.pVfs==0 
6180: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
6190: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
61a0: 20 20 6a 74 5f 76 66 73 2e 73 7a 4f 73 46 69 6c    jt_vfs.szOsFil
61b0: 65 20 3d 20 73 69 7a 65 6f 66 28 6a 74 5f 66 69  e = sizeof(jt_fi
61c0: 6c 65 29 20 2b 20 67 2e 70 56 66 73 2d 3e 73 7a  le) + g.pVfs->sz
61d0: 4f 73 46 69 6c 65 3b 0a 20 20 73 71 6c 69 74 65  OsFile;.  sqlite
61e0: 33 5f 76 66 73 5f 72 65 67 69 73 74 65 72 28 26  3_vfs_register(&
61f0: 6a 74 5f 76 66 73 2c 20 69 73 44 65 66 61 75 6c  jt_vfs, isDefaul
6200: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  t);.  return SQL
6210: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
6220: 20 55 6e 69 6e 73 74 61 6c 6c 20 74 68 65 20 6a   Uninstall the j
6230: 74 20 56 46 53 2c 20 69 66 20 69 74 20 69 73 20  t VFS, if it is 
6240: 69 6e 73 74 61 6c 6c 65 64 2e 0a 2a 2f 0a 76 6f  installed..*/.vo
6250: 69 64 20 6a 74 5f 75 6e 72 65 67 69 73 74 65 72  id jt_unregister
6260: 28 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66  (){.  sqlite3_vf
6270: 73 5f 75 6e 72 65 67 69 73 74 65 72 28 26 6a 74  s_unregister(&jt
6280: 5f 76 66 73 29 3b 0a 7d 0a 0a 23 65 6e 64 69 66  _vfs);.}..#endif
6290: 0a                                               .