/ Hex Artifact Content
Login

Artifact dde0b7447763299ebc4f27a7c3ab25b3b136c69f:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
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 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  ..*/.#ifndef SQL
0340: 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a  ITE_OMIT_DISKIO.
0350: 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65  #include "sqlite
0360: 49 6e 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20  Int.h".#include 
0370: 22 77 61 6c 2e 68 22 0a 0a 2f 2a 0a 2a 2a 2a 2a  "wal.h"../*.****
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 20 4e 4f 54 45 53 20 4f 4e 20 54 48 45 20 44 45   NOTES ON THE DE
03a0: 53 49 47 4e 20 4f 46 20 54 48 45 20 50 41 47 45  SIGN OF THE PAGE
03b0: 52 20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  R **************
03c0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a 0a 2a 2a  **********.**.**
03d0: 20 57 69 74 68 69 6e 20 74 68 69 73 20 63 6f 6d   Within this com
03e0: 6d 65 6e 74 20 62 6c 6f 63 6b 2c 20 61 20 70 61  ment block, a pa
03f0: 67 65 20 69 73 20 64 65 65 6d 65 64 20 74 6f 20  ge is deemed to 
0400: 68 61 76 65 20 62 65 65 6e 20 73 79 6e 63 65 64  have been synced
0410: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
0420: 79 20 61 73 20 73 6f 6f 6e 20 61 73 20 69 74 20  y as soon as it 
0430: 69 73 20 77 72 69 74 74 65 6e 20 77 68 65 6e 20  is written when 
0440: 50 52 41 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f  PRAGMA synchrono
0450: 75 73 3d 4f 46 46 2e 0a 2a 2a 20 4f 74 68 65 72  us=OFF..** Other
0460: 77 69 73 65 2c 20 74 68 65 20 70 61 67 65 20 69  wise, the page i
0470: 73 20 6e 6f 74 20 73 79 6e 63 65 64 20 75 6e 74  s not synced unt
0480: 69 6c 20 74 68 65 20 78 53 79 6e 63 20 6d 65 74  il the xSync met
0490: 68 6f 64 20 6f 66 20 74 68 65 20 56 46 53 0a 2a  hod of the VFS.*
04a0: 2a 20 69 73 20 63 61 6c 6c 65 64 20 73 75 63 63  * is called succ
04b0: 65 73 73 66 75 6c 6c 79 20 6f 6e 20 74 68 65 20  essfully on the 
04c0: 66 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  file containing 
04d0: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  the page..**.** 
04e0: 44 65 66 69 6e 69 74 69 6f 6e 3a 20 20 41 20 70  Definition:  A p
04f0: 61 67 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  age of the datab
0500: 61 73 65 20 66 69 6c 65 20 69 73 20 73 61 69 64  ase file is said
0510: 20 74 6f 20 62 65 20 22 6f 76 65 72 77 72 69 74   to be "overwrit
0520: 65 61 62 6c 65 22 20 69 66 0a 2a 2a 20 6f 6e 65  eable" if.** one
0530: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
0540: 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20 74 72  following are tr
0550: 75 65 20 61 62 6f 75 74 20 74 68 65 20 70 61 67  ue about the pag
0560: 65 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 61  e:.** .**     (a
0570: 29 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20  )  The original 
0580: 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
0590: 61 67 65 20 61 73 20 69 74 20 77 61 73 20 61 74  age as it was at
05a0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
05b0: 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 68  f.**          th
05c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  e transaction ha
05d0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69  s been written i
05e0: 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  nto the rollback
05f0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a 20   journal and.** 
0600: 20 20 20 20 20 20 20 20 20 73 79 6e 63 65 64 2e           synced.
0610: 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20  .** .**     (b) 
0620: 20 54 68 65 20 70 61 67 65 20 77 61 73 20 61 20   The page was a 
0630: 66 72 65 65 6c 69 73 74 20 6c 65 61 66 20 70 61  freelist leaf pa
0640: 67 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  ge at the start 
0650: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0660: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 20 20 20 20 28  on..** .**     (
0670: 63 29 20 20 54 68 65 20 70 61 67 65 20 6e 75 6d  c)  The page num
0680: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
0690: 68 61 6e 20 74 68 65 20 6c 61 72 67 65 73 74 20  han the largest 
06a0: 70 61 67 65 20 74 68 61 74 20 65 78 69 73 74 65  page that existe
06b0: 64 20 69 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20  d in.**         
06c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
06d0: 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74 20  le at the start 
06e0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
06f0: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 31 29 20 41  on..** .** (1) A
0700: 20 70 61 67 65 20 6f 66 20 74 68 65 20 64 61 74   page of the dat
0710: 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 6e 65  abase file is ne
0720: 76 65 72 20 6f 76 65 72 77 72 69 74 74 65 6e 20  ver overwritten 
0730: 75 6e 6c 65 73 73 20 6f 6e 65 20 6f 66 20 74 68  unless one of th
0740: 65 0a 2a 2a 20 20 20 20 20 66 6f 6c 6c 6f 77 69  e.**     followi
0750: 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 20  ng are true:.** 
0760: 0a 2a 2a 20 20 20 20 20 28 61 29 20 54 68 65 20  .**     (a) The 
0770: 70 61 67 65 20 61 6e 64 20 61 6c 6c 20 6f 74 68  page and all oth
0780: 65 72 20 70 61 67 65 73 20 6f 6e 20 74 68 65 20  er pages on the 
0790: 73 61 6d 65 20 73 65 63 74 6f 72 20 61 72 65 20  same sector are 
07a0: 6f 76 65 72 77 72 69 74 65 61 62 6c 65 2e 0a 2a  overwriteable..*
07b0: 2a 20 0a 2a 2a 20 20 20 20 20 28 62 29 20 54 68  * .**     (b) Th
07c0: 65 20 61 74 6f 6d 69 63 20 70 61 67 65 20 77 72  e atomic page wr
07d0: 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
07e0: 20 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6e 64   is enabled, and
07f0: 20 74 68 65 20 65 6e 74 69 72 65 0a 2a 2a 20 20   the entire.**  
0800: 20 20 20 20 20 20 20 74 72 61 6e 73 61 63 74 69         transacti
0810: 6f 6e 20 6f 74 68 65 72 20 74 68 61 6e 20 74 68  on other than th
0820: 65 20 75 70 64 61 74 65 20 6f 66 20 74 68 65 20  e update of the 
0830: 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 65 71 75  transaction sequ
0840: 65 6e 63 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  ence.**         
0850: 6e 75 6d 62 65 72 20 63 6f 6e 73 69 73 74 73 20  number consists 
0860: 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  of a single page
0870: 20 63 68 61 6e 67 65 2e 0a 2a 2a 20 0a 2a 2a 20   change..** .** 
0880: 28 32 29 20 54 68 65 20 63 6f 6e 74 65 6e 74 20  (2) The content 
0890: 6f 66 20 61 20 70 61 67 65 20 77 72 69 74 74 65  of a page writte
08a0: 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62  n into the rollb
08b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 65 78 61 63  ack journal exac
08c0: 74 6c 79 20 6d 61 74 63 68 65 73 0a 2a 2a 20 20  tly matches.**  
08d0: 20 20 20 62 6f 74 68 20 74 68 65 20 63 6f 6e 74     both the cont
08e0: 65 6e 74 20 69 6e 20 74 68 65 20 64 61 74 61 62  ent in the datab
08f0: 61 73 65 20 77 68 65 6e 20 74 68 65 20 72 6f 6c  ase when the rol
0900: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 77 61  lback journal wa
0910: 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 20 20 20  s written.**    
0920: 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74   and the content
0930: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
0940: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
0950: 67 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74  g of the current
0960: 0a 2a 2a 20 20 20 20 20 74 72 61 6e 73 61 63 74  .**     transact
0970: 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 33 29 20  ion..** .** (3) 
0980: 57 72 69 74 65 73 20 74 6f 20 74 68 65 20 64 61  Writes to the da
0990: 74 61 62 61 73 65 20 66 69 6c 65 20 61 72 65 20  tabase file are 
09a0: 61 6e 20 69 6e 74 65 67 65 72 20 6d 75 6c 74 69  an integer multi
09b0: 70 6c 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  ple of the page 
09c0: 73 69 7a 65 0a 2a 2a 20 20 20 20 20 69 6e 20 6c  size.**     in l
09d0: 65 6e 67 74 68 20 61 6e 64 20 61 72 65 20 61 6c  ength and are al
09e0: 69 67 6e 65 64 20 74 6f 20 61 20 70 61 67 65 20  igned to a page 
09f0: 62 6f 75 6e 64 61 72 79 2e 0a 2a 2a 20 0a 2a 2a  boundary..** .**
0a00: 20 28 34 29 20 52 65 61 64 73 20 66 72 6f 6d 20   (4) Reads from 
0a10: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
0a20: 65 20 61 72 65 20 65 69 74 68 65 72 20 61 6c 69  e are either ali
0a30: 67 6e 65 64 20 6f 6e 20 61 20 70 61 67 65 20 62  gned on a page b
0a40: 6f 75 6e 64 61 72 79 20 61 6e 64 0a 2a 2a 20 20  oundary and.**  
0a50: 20 20 20 61 6e 20 69 6e 74 65 67 65 72 20 6d 75     an integer mu
0a60: 6c 74 69 70 6c 65 20 6f 66 20 74 68 65 20 70 61  ltiple of the pa
0a70: 67 65 20 73 69 7a 65 20 69 6e 20 6c 65 6e 67 74  ge size in lengt
0a80: 68 20 6f 72 20 61 72 65 20 74 61 6b 65 6e 20 66  h or are taken f
0a90: 72 6f 6d 20 74 68 65 0a 2a 2a 20 20 20 20 20 66  rom the.**     f
0aa0: 69 72 73 74 20 31 30 30 20 62 79 74 65 73 20 6f  irst 100 bytes o
0ab0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
0ac0: 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 28 35 29 20  ile..** .** (5) 
0ad0: 41 6c 6c 20 77 72 69 74 65 73 20 74 6f 20 74 68  All writes to th
0ae0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0af0: 61 72 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72  are synced prior
0b00: 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   to the rollback
0b10: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
0b20: 62 65 69 6e 67 20 64 65 6c 65 74 65 64 2c 20 74  being deleted, t
0b30: 72 75 6e 63 61 74 65 64 2c 20 6f 72 20 7a 65 72  runcated, or zer
0b40: 6f 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 28 36 29 20  oed..** .** (6) 
0b50: 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
0b60: 6e 61 6c 20 66 69 6c 65 20 69 73 20 75 73 65 64  nal file is used
0b70: 2c 20 74 68 65 6e 20 61 6c 6c 20 77 72 69 74 65  , then all write
0b80: 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
0b90: 65 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 72  e file.**     ar
0ba0: 65 20 73 79 6e 63 65 64 20 70 72 69 6f 72 20 74  e synced prior t
0bb0: 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  o the master jou
0bc0: 72 6e 61 6c 20 62 65 69 6e 67 20 64 65 6c 65 74  rnal being delet
0bd0: 65 64 2e 0a 2a 2a 20 0a 2a 2a 20 44 65 66 69 6e  ed..** .** Defin
0be0: 69 74 69 6f 6e 3a 20 54 77 6f 20 64 61 74 61 62  ition: Two datab
0bf0: 61 73 65 73 20 28 6f 72 20 74 68 65 20 73 61 6d  ases (or the sam
0c00: 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 77  e database at tw
0c10: 6f 20 70 6f 69 6e 74 73 20 69 74 20 74 69 6d 65  o points it time
0c20: 29 0a 2a 2a 20 61 72 65 20 73 61 69 64 20 74 6f  ).** are said to
0c30: 20 62 65 20 22 6c 6f 67 69 63 61 6c 6c 79 20 65   be "logically e
0c40: 71 75 69 76 61 6c 65 6e 74 22 20 69 66 20 74 68  quivalent" if th
0c50: 65 79 20 67 69 76 65 20 74 68 65 20 73 61 6d 65  ey give the same
0c60: 20 61 6e 73 77 65 72 20 74 6f 0a 2a 2a 20 61 6c   answer to.** al
0c70: 6c 20 71 75 65 72 69 65 73 2e 20 20 4e 6f 74 65  l queries.  Note
0c80: 20 69 6e 20 70 61 72 74 69 63 75 6c 61 72 20 74   in particular t
0c90: 68 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  he the content o
0ca0: 66 20 66 72 65 65 6c 69 73 74 20 6c 65 61 66 0a  f freelist leaf.
0cb0: 2a 2a 20 70 61 67 65 73 20 63 61 6e 20 62 65 20  ** pages can be 
0cc0: 63 68 61 6e 67 65 64 20 61 72 62 69 74 61 72 69  changed arbitari
0cd0: 6c 79 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ly without effec
0ce0: 74 69 6e 67 20 74 68 65 20 6c 6f 67 69 63 61 6c  ting the logical
0cf0: 20 65 71 75 69 76 61 6c 65 6e 63 65 0a 2a 2a 20   equivalence.** 
0d00: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  of the database.
0d10: 0a 2a 2a 20 0a 2a 2a 20 28 37 29 20 41 74 20 61  .** .** (7) At a
0d20: 6e 79 20 74 69 6d 65 2c 20 69 66 20 61 6e 79 20  ny time, if any 
0d30: 73 75 62 73 65 74 2c 20 69 6e 63 6c 75 64 69 6e  subset, includin
0d40: 67 20 74 68 65 20 65 6d 70 74 79 20 73 65 74 20  g the empty set 
0d50: 61 6e 64 20 74 68 65 20 74 6f 74 61 6c 20 73 65  and the total se
0d60: 74 2c 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65  t,.**     of the
0d70: 20 75 6e 73 79 6e 63 65 64 20 63 68 61 6e 67 65   unsynced change
0d80: 73 20 74 6f 20 61 20 72 6f 6c 6c 62 61 63 6b 20  s to a rollback 
0d90: 6a 6f 75 72 6e 61 6c 20 61 72 65 20 72 65 6d 6f  journal are remo
0da0: 76 65 64 20 61 6e 64 20 74 68 65 20 0a 2a 2a 20  ved and the .** 
0db0: 20 20 20 20 6a 6f 75 72 6e 61 6c 20 69 73 20 72      journal is r
0dc0: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
0dd0: 72 65 73 75 6c 74 69 6e 67 20 64 61 74 61 62 61  resulting databa
0de0: 73 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20  se file will be 
0df0: 6c 6f 67 69 63 61 6c 0a 2a 2a 20 20 20 20 20 65  logical.**     e
0e00: 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 74 68 65  quivalent to the
0e10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
0e20: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
0e30: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0e40: 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 28 38 29 20 57  on..** .** (8) W
0e50: 68 65 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f  hen a transactio
0e60: 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  n is rolled back
0e70: 2c 20 74 68 65 20 78 54 72 75 6e 63 61 74 65 20  , the xTruncate 
0e80: 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 56 46  method of the VF
0e90: 53 0a 2a 2a 20 20 20 20 20 69 73 20 63 61 6c 6c  S.**     is call
0ea0: 65 64 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68  ed to restore th
0eb0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
0ec0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65  to the same size
0ed0: 20 69 74 20 77 61 73 20 61 74 0a 2a 2a 20 20 20   it was at.**   
0ee0: 20 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20    the beginning 
0ef0: 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  of the transacti
0f00: 6f 6e 2e 20 20 28 49 6e 20 73 6f 6d 65 20 56 46  on.  (In some VF
0f10: 53 65 73 2c 20 74 68 65 20 78 54 72 75 6e 63 61  Ses, the xTrunca
0f20: 74 65 0a 2a 2a 20 20 20 20 20 6d 65 74 68 6f 64  te.**     method
0f30: 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 62 75 74   is a no-op, but
0f40: 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 63   that does not c
0f50: 68 61 6e 67 65 20 74 68 65 20 66 61 63 74 20 74  hange the fact t
0f60: 68 65 20 53 51 4c 69 74 65 20 77 69 6c 6c 0a 2a  he SQLite will.*
0f70: 2a 20 20 20 20 20 69 6e 76 6f 6b 65 20 69 74 2e  *     invoke it.
0f80: 29 0a 2a 2a 20 0a 2a 2a 20 28 39 29 20 57 68 65  ).** .** (9) Whe
0f90: 6e 65 76 65 72 20 74 68 65 20 64 61 74 61 62 61  never the databa
0fa0: 73 65 20 66 69 6c 65 20 69 73 20 6d 6f 64 69 66  se file is modif
0fb0: 69 65 64 2c 20 61 74 20 6c 65 61 73 74 20 6f 6e  ied, at least on
0fc0: 65 20 62 69 74 20 69 6e 20 74 68 65 20 72 61 6e  e bit in the ran
0fd0: 67 65 0a 2a 2a 20 20 20 20 20 6f 66 20 62 79 74  ge.**     of byt
0fe0: 65 73 20 66 72 6f 6d 20 32 34 20 74 68 72 6f 75  es from 24 throu
0ff0: 67 68 20 33 39 20 69 6e 63 6c 75 73 69 76 65 20  gh 39 inclusive 
1000: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 20  will be changed 
1010: 70 72 69 6f 72 20 74 6f 20 72 65 6c 65 61 73 69  prior to releasi
1020: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 45 58  ng.**     the EX
1030: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 0a 2a 2a  CLUSIVE lock..**
1040: 0a 2a 2a 20 28 31 30 29 20 54 68 65 20 70 61 74  .** (10) The pat
1050: 74 65 72 6e 20 6f 66 20 62 69 74 73 20 69 6e 20  tern of bits in 
1060: 62 79 74 65 73 20 32 34 20 74 68 72 6f 75 67 68  bytes 24 through
1070: 20 33 39 20 73 68 61 6c 6c 20 6e 6f 74 20 72 65   39 shall not re
1080: 70 65 61 74 20 69 6e 20 6c 65 73 73 0a 2a 2a 20  peat in less.** 
1090: 20 20 20 20 20 74 68 61 6e 20 6f 6e 65 20 62 69       than one bi
10a0: 6c 6c 69 6f 6e 20 74 72 61 6e 73 61 63 74 69 6f  llion transactio
10b0: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 28 31 31 29 20 41  ns..**.** (11) A
10c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
10d0: 73 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 61 74  s well-formed at
10e0: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 61   the beginning a
10f0: 6e 64 20 61 74 20 74 68 65 20 63 6f 6e 63 6c 75  nd at the conclu
1100: 73 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 6f 66 20  sion.**      of 
1110: 65 76 65 72 79 20 74 72 61 6e 73 61 63 74 69 6f  every transactio
1120: 6e 2e 0a 2a 2a 0a 2a 2a 20 28 31 32 29 20 41 6e  n..**.** (12) An
1130: 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
1140: 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64  is held on the d
1150: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
1160: 6e 20 77 72 69 74 69 6e 67 20 74 6f 0a 2a 2a 20  n writing to.** 
1170: 20 20 20 20 20 74 68 65 20 64 61 74 61 62 61 73       the databas
1180: 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 28 31  e file..**.** (1
1190: 33 29 20 41 20 53 48 41 52 45 44 20 6c 6f 63 6b  3) A SHARED lock
11a0: 20 69 73 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   is held on the 
11b0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
11c0: 69 6c 65 20 72 65 61 64 69 6e 67 20 61 6e 79 0a  ile reading any.
11d0: 2a 2a 20 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  **      content 
11e0: 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61 62  out of the datab
11f0: 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 0a 2f 2a  ase file..*/../*
1200: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
1210: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
1220: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
1230: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
1240: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
1250: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
1260: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
1270: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
1280: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
1290: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
12a0: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
12b0: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
12c0: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
12d0: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
12e0: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
12f0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
1300: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
1310: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
1320: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
1330: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
1340: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
1350: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
1360: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
1370: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
1380: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
1390: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
13a0: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
13b0: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
13c0: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
13d0: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
13e0: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
13f0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
1400: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
1410: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
1420: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
1430: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
1440: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
1450: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
1460: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
1470: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
1480: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
1490: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
14a0: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
14b0: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
14c0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
14d0: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
14e0: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
14f0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
1500: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
1510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
1520: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
1530: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
1540: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
1550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1560: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
1570: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
1580: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
1590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15a0: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
15b0: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
15c0: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
15d0: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
15e0: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
15f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1600: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
1610: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
1620: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
1630: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1640: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
1650: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
1660: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
1670: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
1680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
1690: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
16a0: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
16b0: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
16c0: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
16d0: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
16e0: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
16f0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
1700: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
1710: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
1720: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
1730: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
1740: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1750: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
1760: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
1770: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
1780: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
1790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a0: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
17b0: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
17c0: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
17d0: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
17e0: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
17f0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
1800: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
1810: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
1820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1830: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
1840: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
1850: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
1860: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
1870: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
1880: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
1890: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
18a0: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
18b0: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
18c0: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
18d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e0: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
18f0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
1900: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
1910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1920: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
1930: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
1940: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
1950: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
1960: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
1970: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
1980: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19a0: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
19b0: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
19c0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
19d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
19e0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
19f0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
1a00: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
1a10: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
1a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a30: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
1a40: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
1a50: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
1a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a70: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
1a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1a90: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
1aa0: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
1ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
1ac0: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
1ad0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
1ae0: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
1af0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
1b00: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
1b10: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
1b20: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
1b30: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
1b40: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
1b50: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
1b60: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
1b70: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
1b80: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
1b90: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
1ba0: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
1bb0: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
1bc0: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
1bd0: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
1be0: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1bf0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
1c00: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
1c10: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
1c20: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
1c30: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
1c40: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
1c50: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
1c60: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
1c70: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
1c80: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
1c90: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
1ca0: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
1cb0: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
1cc0: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
1cd0: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
1ce0: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
1cf0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
1d00: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
1d10: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
1d20: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
1d30: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
1d40: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
1d50: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
1d60: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1d70: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
1d80: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
1d90: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
1da0: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
1db0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1dc0: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
1dd0: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
1de0: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
1df0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
1e00: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
1e10: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
1e20: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
1e30: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
1e40: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1e50: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1e60: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1e70: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1e80: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1e90: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1ea0: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1eb0: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1ec0: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1ed0: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1ee0: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
1ef0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
1f00: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1f10: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
1f20: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
1f30: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
1f40: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1f50: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1f60: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1f70: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1f80: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1f90: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1fa0: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1fb0: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1fc0: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1fd0: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1fe0: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
1ff0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
2000: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
2010: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
2020: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
2030: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
2040: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
2050: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
2060: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
2070: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
2080: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
2090: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
20a0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
20b0: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
20c0: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
20d0: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
20e0: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
20f0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
2100: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
2110: 72 20 73 69 7a 65 2e 20 36 34 4b 69 42 2e 20 49  r size. 64KiB. I
2120: 66 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a  f the xSectorsiz
2130: 65 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72  e() method .** r
2140: 65 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c  eturns a value l
2150: 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c  arger than this,
2160: 20 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52   then MAX_SECTOR
2170: 5f 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e  _SIZE is used in
2180: 73 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63  stead..** This c
2190: 6f 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79  ould conceivably
21a0: 20 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f   cause corruptio
21b0: 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f  n following a po
21c0: 77 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a  wer failure on.*
21d0: 2a 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e  * such a system.
21e0: 20 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74   This is current
21f0: 6c 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74  ly an undocument
2200: 65 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65  ed limit..*/.#de
2210: 66 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f  fine MAX_SECTOR_
2220: 53 49 5a 45 20 30 78 31 30 30 30 30 0a 0a 2f 2a  SIZE 0x10000../*
2230: 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65 20  .** An instance 
2240: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
2250: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61 6c   structure is al
2260: 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63 68  located for each
2270: 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65 70   active.** savep
2280: 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d 65  oint and stateme
2290: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  nt transaction i
22a0: 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41 6c  n the system. Al
22b0: 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72 65  l such structure
22c0: 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 20  s.** are stored 
22d0: 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53 61  in the Pager.aSa
22e0: 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 2c  vepoint[] array,
22f0: 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63 61   which is alloca
2300: 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69 7a  ted and.** resiz
2310: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
2320: 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a 2a  Realloc()..**.**
2330: 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69 6e   When a savepoin
2340: 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74 68  t is created, th
2350: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
2360: 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65 6c  .iHdrOffset fiel
2370: 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30  d is.** set to 0
2380: 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 68  . If a journal-h
2390: 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
23a0: 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20 6a   into the main j
23b0: 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a 20  ournal while.** 
23c0: 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69 73  the savepoint is
23d0: 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69 48   active, then iH
23e0: 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
23f0: 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66 73  to the byte offs
2400: 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  et .** immediate
2410: 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  ly following the
2420: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72 65   last journal re
2430: 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e 74  cord written int
2440: 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f  o the main.** jo
2450: 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68 65  urnal before the
2460: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 2e   journal-header.
2470: 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65   This is require
2480: 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f 69  d during savepoi
2490: 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 28  nt.** rollback (
24a0: 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61 63  see pagerPlaybac
24b0: 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a 2a  kSavepoint())..*
24c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
24d0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
24e0: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b 0a  PagerSavepoint;.
24f0: 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76 65  struct PagerSave
2500: 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69 4f  point {.  i64 iO
2510: 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20 20  ffset;          
2520: 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74 69         /* Starti
2530: 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61 69  ng offset in mai
2540: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
2550: 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20 20  64 iHdrOffset;  
2560: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
2570: 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42 69  ee above */.  Bi
2580: 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f 69  tvec *pInSavepoi
2590: 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 65  nt;        /* Se
25a0: 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  t of pages in th
25b0: 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f 0a  is savepoint */.
25c0: 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20 20    Pgno nOrig;   
25d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25e0: 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62 65  * Original numbe
25f0: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66 69  r of pages in fi
2600: 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53 75  le */.  Pgno iSu
2610: 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  bRec;           
2620: 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
2630: 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69 6e   first record in
2640: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
2650: 20 20 75 33 32 20 61 57 61 6c 44 61 74 61 5b 57    u32 aWalData[W
2660: 41 4c 5f 53 41 56 45 50 4f 49 4e 54 5f 4e 44 41  AL_SAVEPOINT_NDA
2670: 54 41 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 57  TA];        /* W
2680: 41 4c 20 73 61 76 65 70 6f 69 6e 74 20 63 6f 6e  AL savepoint con
2690: 74 65 78 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  text */.};../*.*
26a0: 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61  * A open page ca
26b0: 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  che is an instan
26c0: 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ce of the follow
26d0: 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a  ing structure..*
26e0: 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a 0a  *.** errCode.**.
26f0: 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43 6f  **   Pager.errCo
2700: 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  de may be set to
2710: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
2720: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
2730: 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54 45  r.**   or SQLITE
2740: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
2750: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
2760: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
2770: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
2780: 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e     and is return
2790: 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c 74  ed as the result
27a0: 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20   of every major 
27b0: 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20  pager API call. 
27c0: 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54 45   The.**   SQLITE
27d0: 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f 64  _FULL return cod
27e0: 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64 69  e is slightly di
27f0: 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72 73  fferent. It pers
2800: 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c 20  ists only until 
2810: 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73 75  the.**   next su
2820: 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61 63  ccessful rollbac
2830: 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 6f  k is performed o
2840: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
2850: 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53 51  e. Also,.**   SQ
2860: 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e  LITE_FULL does n
2870: 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71  ot affect the sq
2880: 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2890: 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  and sqlite3Pager
28a0: 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41 50  Lookup().**   AP
28b0: 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74 69  Is, they may sti
28c0: 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63 65  ll be used succe
28d0: 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20 64  ssfully..**.** d
28e0: 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53 69  bSizeValid, dbSi
28f0: 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c 20  ze, dbOrigSize, 
2900: 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a 2a  dbFileSize.**.**
2910: 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65 20     Managing the 
2920: 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
2930: 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61 67  base file in pag
2940: 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20 63  es is a little c
2950: 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20 20  omplicated..**  
2960: 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61   The variable Pa
2970: 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74 61  ger.dbSize conta
2980: 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ins the number o
2990: 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68 65  f pages that the
29a0: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 69   database.**   i
29b0: 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 63  mage currently c
29c0: 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65 20  ontains. As the 
29d0: 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 67  database image g
29e0: 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73 20  rows or shrinks 
29f0: 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61 62  this.**   variab
2a00: 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20 54  le is updated. T
2a10: 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67 65  he variable Page
2a20: 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f 6e  r.dbFileSize con
2a30: 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72  tains the number
2a40: 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20 69  .**   of pages i
2a50: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a60: 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62 65  ile. This may be
2a70: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
2a80: 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a 20  Pager.dbSize.** 
2a90: 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73 20    if some pages 
2aa0: 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e 64  have been append
2ab0: 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ed to the databa
2ac0: 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f 74  se image but not
2ad0: 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a 20   yet written.** 
2ae0: 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20 63    out from the c
2af0: 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74 75  ache to the actu
2b00: 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e  al file on disk.
2b10: 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67 65   Or if the image
2b20: 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 74   has been.**   t
2b30: 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20 69  runcated by an i
2b40: 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75 75  ncremental-vacuu
2b50: 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 65  m operation. The
2b60: 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69 7a   Pager.dbOrigSiz
2b70: 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20 20  e variable.**   
2b80: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d  contains the num
2b90: 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
2ba0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2bb0: 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ge when the curr
2bc0: 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61 63  ent.**   transac
2bd0: 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64 2e  tion was opened.
2be0: 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   The contents of
2bf0: 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74 68   all three of th
2c00: 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69 73  ese variables is
2c10: 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72 61  .**   only guara
2c20: 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72 72  nteed to be corr
2c30: 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c 65  ect if the boole
2c40: 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 56  an Pager.dbSizeV
2c50: 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a 2a  alid is true..**
2c60: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64 65  .**   TODO: Unde
2c70: 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f 6e  r what condition
2c80: 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69 64  s is dbSizeValid
2c90: 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a 2a   set? Cleared?.*
2ca0: 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e 74  *.** changeCount
2cb0: 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Done.**.**   Thi
2cc0: 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61 62  s boolean variab
2cd0: 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d 61  le is used to ma
2ce0: 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
2cf0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
2d00: 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79 74  .**   (the 4-byt
2d10: 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20 61  e header field a
2d20: 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32 34  t byte offset 24
2d30: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
2d40: 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20 20   file) is .**   
2d50: 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72 65  not updated more
2d60: 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63 65   often than nece
2d70: 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  ssary. .**.**   
2d80: 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72 75  It is set to tru
2d90: 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e 67  e when the chang
2da0: 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2db0: 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69 63  is updated, whic
2dc0: 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c 79  h .**   can only
2dd0: 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65 78   happen if an ex
2de0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73 20  clusive lock is 
2df0: 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61  held on the data
2e00: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
2e10: 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28 73  It is cleared (s
2e20: 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68 65  et to false) whe
2e30: 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73 69  never an exclusi
2e40: 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20 20  ve lock is .**  
2e50: 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f 6e   relinquished on
2e60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2e70: 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61 20  le. Each time a 
2e80: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
2e90: 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20 54  ommitted,.**   T
2ea0: 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  he changeCountDo
2eb0: 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70 65  ne flag is inspe
2ec0: 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20 74  cted. If it is t
2ed0: 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f 66  rue, the work of
2ee0: 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20 74  .**   updating t
2ef0: 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  he change-counte
2f00: 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f 72  r is omitted for
2f10: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
2f20: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  nsaction..**.** 
2f30: 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73 6d    This mechanism
2f40: 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65 6e   means that when
2f50: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c   running in excl
2f60: 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63 6f  usive mode, a co
2f70: 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 6e  nnection .**   n
2f80: 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65 20  eed only update 
2f90: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
2fa0: 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68 65  er once, for the
2fb0: 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74 69   first transacti
2fc0: 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74 65  on.**   committe
2fd0: 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69 66  d..**.** dbModif
2fe0: 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  ied.**.**   The 
2ff0: 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67 20  dbModified flag 
3000: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3010: 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  a database page 
3020: 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20 20  is dirtied..**  
3030: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 61   It is cleared a
3040: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61 63  t the end of eac
3050: 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a  h transaction..*
3060: 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73 65  *.**   It is use
3070: 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e  d when committin
3080: 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20 65  g or otherwise e
3090: 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74  nding a transact
30a0: 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68 65  ion. If.**   the
30b0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
30c0: 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 6c   is clear then l
30d0: 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f 20  ess work has to 
30e0: 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20 6a  be done..**.** j
30f0: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a 2a  ournalStarted.**
3100: 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67 20  .**   This flag 
3110: 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72 20  is set whenever 
3120: 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  the the main jou
3130: 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 20 61  rnal is opened a
3140: 6e 64 0a 2a 2a 20 20 20 69 6e 69 74 69 61 6c 69  nd.**   initiali
3150: 7a 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20  zed.**.**   The 
3160: 70 6f 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c  point of this fl
3170: 61 67 20 69 73 20 74 68 61 74 20 69 74 20 6d 75  ag is that it mu
3180: 73 74 20 62 65 20 73 65 74 20 61 66 74 65 72 20  st be set after 
3190: 74 68 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20  the .**   first 
31a0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
31b0: 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  n a journal file
31c0: 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64   has been synced
31d0: 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41   to disk..**   A
31e0: 66 74 65 72 20 74 68 69 73 20 68 61 73 20 68 61  fter this has ha
31f0: 70 70 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65  ppened, new page
3200: 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68  s appended to th
3210: 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20  e database .**  
3220: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65   do not need the
3230: 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
3240: 20 66 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68   flag set, as th
3250: 65 79 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a  ey do not need.*
3260: 2a 20 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20  *   to wait for 
3270: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62  a journal sync b
3280: 65 66 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62  efore they can b
3290: 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
32a0: 0a 2a 2a 20 20 20 74 68 65 20 64 61 74 61 62 61  .**   the databa
32b0: 73 65 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e  se file (see fun
32c0: 63 74 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74  ction pager_writ
32d0: 65 28 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73  e())..**   .** s
32e0: 65 74 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20  etMaster.**.**  
32f0: 20 54 68 69 73 20 76 61 72 69 61 62 6c 65 20 69   This variable i
3300: 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65  s used to ensure
3310: 20 74 68 61 74 20 74 68 65 20 6d 61 73 74 65 72   that the master
3320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
3330: 6d 65 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29  me.**   (if any)
3340: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
3350: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
3360: 6c 20 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a  l file once..**.
3370: 2a 2a 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74  **   When commit
3380: 74 69 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69  ting a transacti
3390: 6f 6e 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a  on, the master j
33a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
33b0: 20 28 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d   (if any).**   m
33c0: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ay be written in
33d0: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
33e0: 69 6c 65 20 77 68 69 6c 65 20 74 68 65 20 70 61  ile while the pa
33f0: 67 65 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a  ger is still in.
3400: 2a 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52  **   PAGER_RESER
3410: 56 45 44 20 73 74 61 74 65 20 28 73 65 65 20 43  VED state (see C
3420: 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
3430: 66 6f 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e  for the action).
3440: 20 49 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74   It.**   then at
3450: 74 65 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64  tempts to upgrad
3460: 65 20 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76  e to an exclusiv
3470: 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20  e lock. If this 
3480: 61 74 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69  attempt.**   fai
3490: 6c 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  ls, then SQLITE_
34a0: 42 55 53 59 20 6d 61 79 20 62 65 20 72 65 74 75  BUSY may be retu
34b0: 72 6e 65 64 20 74 6f 20 74 68 65 20 75 73 65 72  rned to the user
34c0: 20 61 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a   and the user.**
34d0: 20 20 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74     may attempt t
34e0: 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61  o commit the tra
34f0: 6e 73 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c  nsaction again l
3500: 61 74 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a  ater (calling.**
3510: 20 20 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e     CommitPhaseOn
3520: 65 28 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73  e() again). This
3530: 20 66 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f   flag is used to
3540: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65   ensure that the
3550: 20 0a 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f   .**   master jo
3560: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e  urnal name is on
3570: 6c 79 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ly written to th
3580: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
3590: 68 65 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69  he first.**   ti
35a0: 6d 65 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  me CommitPhaseOn
35b0: 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  e() is called..*
35c0: 2a 0a 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a  *.** doNotSync.*
35d0: 2a 0a 2a 2a 20 20 20 57 68 65 6e 20 65 6e 61 62  *.**   When enab
35e0: 6c 65 64 2c 20 63 61 63 68 65 20 73 70 69 6c 6c  led, cache spill
35f0: 73 20 61 72 65 20 70 72 6f 68 69 62 69 74 65 64  s are prohibited
3600: 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
3610: 20 66 69 6c 65 20 63 61 6e 6e 6f 74 0a 2a 2a 20   file cannot.** 
3620: 20 20 62 65 20 73 79 6e 63 65 64 2e 20 20 54 68    be synced.  Th
3630: 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73  is variable is s
3640: 65 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62  et and cleared b
3650: 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  y sqlite3PagerWr
3660: 69 74 65 28 29 20 0a 2a 2a 20 20 20 69 6e 20 6f  ite() .**   in o
3670: 72 64 65 72 20 74 6f 20 70 72 65 76 65 6e 74 20  rder to prevent 
3680: 61 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 66  a journal sync f
3690: 72 6f 6d 20 68 61 70 70 65 6e 69 6e 67 20 69 6e  rom happening in
36a0: 20 62 65 74 77 65 65 6e 20 74 68 65 0a 2a 2a 20   between the.** 
36b0: 20 20 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 6f 66    journalling of
36c0: 20 74 77 6f 20 70 61 67 65 73 20 6f 6e 20 74 68   two pages on th
36d0: 65 20 73 61 6d 65 20 73 65 63 74 6f 72 2e 0a 2a  e same sector..*
36e0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
36f0: 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d  .**   TODO: It m
3700: 69 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74  ight be easier t
3710: 6f 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61  o set this varia
3720: 62 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72  ble in writeJour
3730: 6e 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e  nalHdr().**   an
3740: 64 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  d writeMasterJou
3750: 72 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61  rnal() only. Cha
3760: 6e 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20  nge its meaning 
3770: 74 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74  to "unsynced dat
3780: 61 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20  a.**   has been 
3790: 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
37a0: 6f 75 72 6e 61 6c 22 2e 0a 2a 2a 0a 2a 2a 20 73  ournal"..**.** s
37b0: 75 62 6a 49 6e 4d 65 6d 6f 72 79 0a 2a 2a 0a 2a  ubjInMemory.**.*
37c0: 2a 20 20 20 54 68 69 73 20 69 73 20 61 20 62 6f  *   This is a bo
37d0: 6f 6c 65 61 6e 20 76 61 72 69 61 62 6c 65 2e 20  olean variable. 
37e0: 49 66 20 74 72 75 65 2c 20 74 68 65 6e 20 61 6e  If true, then an
37f0: 79 20 72 65 71 75 69 72 65 64 20 73 75 62 2d 6a  y required sub-j
3800: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 69 73 20 6f  ournal.**   is o
3810: 70 65 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d  pened as an in-m
3820: 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
3830: 6c 65 2e 20 49 66 20 66 61 6c 73 65 2c 20 74 68  le. If false, th
3840: 65 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a 20  en in-memory.** 
3850: 20 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 61    sub-journals a
3860: 72 65 20 6f 6e 6c 79 20 75 73 65 64 20 66 6f 72  re only used for
3870: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72   in-memory pager
3880: 20 66 69 6c 65 73 2e 0a 2a 2f 0a 73 74 72 75 63   files..*/.struc
3890: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
38a0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
38b0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
38c0: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
38d0: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
38e0: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
38f0: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
3900: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
3910: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
3920: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
3930: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
3940: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
3950: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
3960: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
3970: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
3980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3990: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
39a0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
39b0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
39c0: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
39d0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
39e0: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
39f0: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
3a00: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
3a10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
3a20: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
3a30: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
3a40: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
3a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3a60: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
3a70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
3a80: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
3a90: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
3aa0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
3ab0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
3ac0: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
3ad0: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
3ae0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
3af0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
3b00: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
3b10: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
3b20: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
3b30: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
3b40: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
3b50: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
3b60: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
3b70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3b80: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
3b90: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
3ba0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
3bb0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
3bc0: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
3bd0: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
3be0: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
3bf0: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
3c00: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
3c10: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
3c20: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
3c30: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
3c40: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
3c50: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
3c60: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
3c70: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
3c80: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
3c90: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
3ca0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
3cb0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
3cc0: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
3cd0: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
3ce0: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
3cf0: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
3d00: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
3d10: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
3d20: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
3d30: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
3d40: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
3d50: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
3d60: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
3d70: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
3d80: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
3d90: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
3da0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
3db0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
3dc0: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
3dd0: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
3de0: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
3df0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
3e00: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
3e10: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
3e20: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
3e30: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
3e40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e50: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
3e60: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
3e70: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
3e80: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3e90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
3ea0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
3eb0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
3ec0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
3ed0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
3ee0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
3ef0: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
3f00: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
3f10: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
3f20: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
3f30: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
3f40: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
3f50: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
3f60: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
3f70: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3f80: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
3f90: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
3fa0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
3fb0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
3fc0: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
3fd0: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3fe0: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3ff0: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
4000: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
4010: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
4020: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
4030: 72 72 65 63 74 20 2a 2f 0a 20 20 75 38 20 73 75  rrect */.  u8 su
4040: 62 6a 49 6e 4d 65 6d 6f 72 79 3b 20 20 20 20 20  bjInMemory;     
4050: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
4060: 6f 20 75 73 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  o use in-memory 
4070: 73 75 62 2d 6a 6f 75 72 6e 61 6c 73 20 2a 2f 0a  sub-journals */.
4080: 20 20 50 67 6e 6f 20 64 62 53 69 7a 65 3b 20 20    Pgno dbSize;  
4090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
40a0: 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
40b0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
40c0: 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 4f 72 69   */.  Pgno dbOri
40d0: 67 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  gSize;          
40e0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
40f0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  re the current t
4100: 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20  ransaction */.  
4110: 50 67 6e 6f 20 64 62 46 69 6c 65 53 69 7a 65 3b  Pgno dbFileSize;
4120: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4130: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
4140: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
4150: 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72  ile */.  int err
4160: 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Code;           
4170: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
4180: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
4190: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20  errors */.  int 
41a0: 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
41b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 73          /* Pages
41c0: 20 6a 6f 75 72 6e 61 6c 6c 65 64 20 73 69 6e 63   journalled sinc
41d0: 65 20 6c 61 73 74 20 6a 2d 68 65 61 64 65 72 20  e last j-header 
41e0: 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 75 33 32  written */.  u32
41f0: 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20 20 20   cksumInit;     
4200: 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 73           /* Quas
4210: 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61  i-random value a
4220: 64 64 65 64 20 74 6f 20 65 76 65 72 79 20 63 68  dded to every ch
4230: 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 75 33 32 20  ecksum */.  u32 
4240: 6e 53 75 62 52 65 63 3b 20 20 20 20 20 20 20 20  nSubRec;        
4250: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
4260: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 77 72 69  r of records wri
4270: 74 74 65 6e 20 74 6f 20 73 75 62 2d 6a 6f 75 72  tten to sub-jour
4280: 6e 61 6c 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  nal */.  Bitvec 
4290: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
42a0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
42b0: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
42c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
42d0: 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
42e0: 66 69 6c 65 20 2a 66 64 3b 20 20 20 20 20 20 20  file *fd;       
42f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
4300: 72 69 70 74 6f 72 20 66 6f 72 20 64 61 74 61 62  riptor for datab
4310: 61 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ase */.  sqlite3
4320: 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20  _file *jfd;     
4330: 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73       /* File des
4340: 63 72 69 70 74 6f 72 20 66 6f 72 20 6d 61 69 6e  criptor for main
4350: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71   journal */.  sq
4360: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 6a 66 64  lite3_file *sjfd
4370: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c  ;         /* Fil
4380: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
4390: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
43a0: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
43b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
43c0: 20 43 75 72 72 65 6e 74 20 77 72 69 74 65 20 6f   Current write o
43d0: 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75  ffset in the jou
43e0: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69  rnal file */.  i
43f0: 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20  64 journalHdr;  
4400: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79             /* By
4410: 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65  te offset to pre
4420: 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65  vious journal he
4430: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  ader */.  i64 jo
4440: 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20  urnalSizeLimit; 
4450: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6c 69        /* Size li
4460: 6d 69 74 20 66 6f 72 20 70 65 72 73 69 73 74 65  mit for persiste
4470: 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  nt journal files
4480: 20 2a 2f 0a 20 20 50 61 67 65 72 53 61 76 65 70   */.  PagerSavep
4490: 6f 69 6e 74 20 2a 61 53 61 76 65 70 6f 69 6e 74  oint *aSavepoint
44a0: 3b 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 63  ; /* Array of ac
44b0: 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20  tive savepoints 
44c0: 2a 2f 0a 20 20 69 6e 74 20 6e 53 61 76 65 70 6f  */.  int nSavepo
44d0: 69 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  int;            
44e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c   /* Number of el
44f0: 65 6d 65 6e 74 73 20 69 6e 20 61 53 61 76 65 70  ements in aSavep
4500: 6f 69 6e 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72  oint[] */.  char
4510: 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b   dbFileVers[16];
4520: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67          /* Chang
4530: 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61  es whenever data
4540: 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
4550: 73 20 2a 2f 0a 20 20 75 33 32 20 73 65 63 74 6f  s */.  u32 secto
4560: 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  rSize;          
4570: 20 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65     /* Assumed se
4580: 63 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67  ctor size during
4590: 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
45a0: 75 31 36 20 6e 45 78 74 72 61 3b 20 20 20 20 20  u16 nExtra;     
45b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
45c0: 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74  dd this many byt
45d0: 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65  es to each in-me
45e0: 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69  mory page */.  i
45f0: 31 36 20 6e 52 65 73 65 72 76 65 3b 20 20 20 20  16 nReserve;    
4600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4610: 6d 62 65 72 20 6f 66 20 75 6e 75 73 65 64 20 62  mber of unused b
4620: 79 74 65 73 20 61 74 20 65 6e 64 20 6f 66 20 65  ytes at end of e
4630: 61 63 68 20 70 61 67 65 20 2a 2f 0a 20 20 75 33  ach page */.  u3
4640: 32 20 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20  2 vfsFlags;     
4650: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61            /* Fla
4660: 67 73 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76  gs for sqlite3_v
4670: 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20  fs.xOpen() */.  
4680: 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20  int pageSize;   
4690: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
46a0: 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
46b0: 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67  n a page */.  Pg
46c0: 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20  no mxPgno;      
46d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78            /* Max
46e0: 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a  imum allowed siz
46f0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
4700: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
4710: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
4720: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4730: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4740: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
4750: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
4760: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4770: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4780: 20 20 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e    int (*xBusyHan
4790: 64 6c 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a  dler)(void*); /*
47a0: 20 46 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c   Function to cal
47b0: 6c 20 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20  l when busy */. 
47c0: 20 76 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64   void *pBusyHand
47d0: 6c 65 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20  lerArg;      /* 
47e0: 43 6f 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74  Context argument
47f0: 20 66 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65   for xBusyHandle
4800: 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  r */.#ifdef SQLI
4810: 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48  TE_TEST.  int nH
4820: 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20  it, nMiss;      
4830: 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68        /* Cache h
4840: 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20  its and missing 
4850: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20  */.  int nRead, 
4860: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
4870: 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70 61 67   /* Database pag
4880: 65 73 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20  es read/written 
4890: 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64  */.#endif.  void
48a0: 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62   (*xReiniter)(Db
48b0: 50 61 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20  Page*); /* Call 
48c0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65  this routine whe
48d0: 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65  n reloading page
48e0: 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  s */.#ifdef SQLI
48f0: 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76  TE_HAS_CODEC.  v
4900: 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76  oid *(*xCodec)(v
4910: 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c  oid*,void*,Pgno,
4920: 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65  int); /* Routine
4930: 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67   for en/decoding
4940: 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20   data */.  void 
4950: 28 2a 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67  (*xCodecSizeChng
4960: 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29  )(void*,int,int)
4970: 3b 20 2f 2a 20 4e 6f 74 69 66 79 20 6f 66 20 70  ; /* Notify of p
4980: 61 67 65 20 73 69 7a 65 20 63 68 61 6e 67 65 73  age size changes
4990: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
49a0: 64 65 63 46 72 65 65 29 28 76 6f 69 64 2a 29 3b  decFree)(void*);
49b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
49c0: 44 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  Destructor for t
49d0: 68 65 20 63 6f 64 65 63 20 2a 2f 0a 20 20 76 6f  he codec */.  vo
49e0: 69 64 20 2a 70 43 6f 64 65 63 3b 20 20 20 20 20  id *pCodec;     
49f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4a00: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
4a10: 43 6f 64 65 63 2e 2e 2e 20 6d 65 74 68 6f 64 73  Codec... methods
4a20: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
4a30: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
4a40: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
4a50: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
4a60: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
4a70: 70 20 75 73 65 20 2a 2f 0a 20 20 50 43 61 63 68  p use */.  PCach
4a80: 65 20 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20  e *pPCache;     
4a90: 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65         /* Pointe
4aa0: 72 20 74 6f 20 70 61 67 65 20 63 61 63 68 65 20  r to page cache 
4ab0: 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
4ac0: 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
4ad0: 6b 75 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74  kup;    /* Point
4ae0: 65 72 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e  er to list of on
4af0: 67 6f 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f  going backup pro
4b00: 63 65 73 73 65 73 20 2a 2f 0a 23 69 66 6e 64 65  cesses */.#ifnde
4b10: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41  f SQLITE_OMIT_WA
4b20: 4c 0a 20 20 57 61 6c 20 2a 70 57 61 6c 3b 20 20  L.  Wal *pWal;  
4b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b40: 2f 2a 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c  /* Write-ahead l
4b50: 6f 67 20 75 73 65 64 20 62 79 20 22 6a 6f 75 72  og used by "jour
4b60: 6e 61 6c 5f 6d 6f 64 65 3d 77 61 6c 22 20 2a 2f  nal_mode=wal" */
4b70: 0a 23 65 6e 64 69 66 0a 7d 3b 0a 0a 2f 2a 0a 2a  .#endif.};../*.*
4b80: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4b90: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
4ba0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
4bb0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
4bc0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
4bd0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
4be0: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
4bf0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
4c00: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
4c10: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
4c20: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
4c30: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4c40: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
4c50: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
4c60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
4c70: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
4c80: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
4c90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4ca0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
4cb0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
4cc0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4cd0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
4ce0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4cf0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
4d00: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4d10: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
4d20: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
4d30: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
4d40: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
4d50: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
4d60: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
4d70: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
4d80: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
4d90: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
4da0: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
4db0: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
4dc0: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
4dd0: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
4de0: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
4df0: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
4e00: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
4e10: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
4e20: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
4e30: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
4e40: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
4e50: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
4e60: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
4e70: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
4e80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
4e90: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
4ea0: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
4eb0: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
4ec0: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
4ed0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
4ee0: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
4ef0: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
4f00: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
4f10: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
4f20: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
4f30: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
4f40: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
4f50: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
4f60: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
4f70: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
4f80: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
4f90: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
4fa0: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
4fb0: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
4fc0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
4fd0: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
4fe0: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
4ff0: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
5000: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
5010: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
5020: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
5030: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
5040: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
5050: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
5060: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
5070: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
5080: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
5090: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
50a0: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
50b0: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
50c0: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
50d0: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
50e0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
50f0: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
5100: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
5110: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
5120: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
5130: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
5140: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
5150: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
5160: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
5170: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
5180: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
5190: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
51a0: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
51b0: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
51c0: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
51d0: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
51e0: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
51f0: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
5200: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
5210: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
5220: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
5230: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
5240: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
5250: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
5260: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
5270: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
5280: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
5290: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
52a0: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
52b0: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
52c0: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
52d0: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
52e0: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
52f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
5300: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
5310: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
5320: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
5330: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
5340: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
5350: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
5360: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
5370: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
5380: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
5390: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
53a0: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
53b0: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
53c0: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
53d0: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
53e0: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
53f0: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
5400: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
5410: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
5420: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5430: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
5440: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
5450: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
5460: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
5470: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
5480: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
5490: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
54a0: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
54b0: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
54c0: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
54d0: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
54e0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
54f0: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
5500: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
5510: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
5520: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
5530: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
5540: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
5550: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
5560: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
5570: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
5580: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
5590: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
55a0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
55b0: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
55c0: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
55d0: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
55e0: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
55f0: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
5600: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
5610: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
5620: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73  **   assert( ass
5630: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
5640: 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74  pPager) );.*/.st
5650: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
5660: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
5670: 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f  r *pPager){..  /
5680: 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69 73  * A temp-file is
5690: 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45 52   always in PAGER
56a0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50 41  _EXCLUSIVE or PA
56b0: 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65  GER_SYNCED state
56c0: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
56d0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
56e0: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  =0 || pPager->st
56f0: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
5700: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  SIVE );..  /* Th
5710: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
5720: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
5730: 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66 69   set for temp-fi
5740: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
5750: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
5760: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
5770: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
5780: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
5790: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
57a0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
57b0: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
57c0: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
57d0: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
57e0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
57f0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
5800: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
5810: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
5820: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
5830: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
5840: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
5850: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
5860: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
5870: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
5880: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
5890: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
58a0: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
58b0: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
58c0: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
58d0: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
58e0: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
58f0: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
5900: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
5910: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
5920: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
5930: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
5940: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  g->pgno;.  Pager
5950: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
5960: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b  pPager;.  int i;
5970: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
5980: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
5990: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65  ; i++){.    Page
59a0: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
59b0: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
59c0: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
59d0: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
59e0: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
59f0: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
5a00: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
5a10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
5a20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5a30: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5a40: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
5a50: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
5a60: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
5a70: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
5a80: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
5a90: 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b  nal(PgHdr *pPg){
5aa0: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
5ab0: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d  3BitvecTest(pPg-
5ac0: 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  >pPager->pInJour
5ad0: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
5ae0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
5af0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5b00: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
5b10: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
5b20: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
5b30: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
5b40: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
5b50: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
5b60: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
5b70: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
5b80: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
5b90: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
5ba0: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
5bb0: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
5bc0: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
5bd0: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
5be0: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
5bf0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
5c00: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
5c10: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
5c20: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
5c30: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
5c40: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
5c50: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
5c60: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
5c70: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5c80: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
5c90: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
5ca0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5cb0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
5cc0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
5cd0: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
5ce0: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
5cf0: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
5d00: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
5d10: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
5d20: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
5d30: 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  )../*.** Write a
5d40: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
5d50: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
5d60: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
5d70: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5d80: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
5d90: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
5da0: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
5db0: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
5dc0: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
5dd0: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
5de0: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
5df0: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
5e00: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
5e10: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
5e20: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5e30: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
5e40: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
5e50: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
5e60: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
5e70: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
5e80: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
5e90: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
5ea0: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
5eb0: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
5ec0: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
5ed0: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
5ee0: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
5ef0: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
5f00: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
5f10: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
5f20: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
5f30: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
5f40: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
5f50: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
5f60: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
5f70: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
5f80: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
5f90: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
5fa0: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
5fb0: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
5fc0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
5fd0: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
5fe0: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
5ff0: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
6000: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
6010: 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b   !isOpen(pFd) ){
6020: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6030: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
6040: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
6050: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
6060: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
6070: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
6080: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
6090: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
60a0: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
60b0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
60c0: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
60d0: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
60e0: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
60f0: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
6100: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
6110: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
6120: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
6130: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
6140: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
6150: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
6160: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
6170: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
6180: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
6190: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
61a0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
61b0: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
61c0: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
61d0: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
61e0: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
61f0: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
6200: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
6210: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
6220: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
6230: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
6240: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
6250: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
6260: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
6270: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
6280: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
6290: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
62a0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
62b0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
62c0: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
62d0: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
62e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
62f0: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
6300: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
6310: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
6320: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
6330: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6340: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
6350: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
6360: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
6370: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
6380: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
6390: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
63a0: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
63b0: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
63c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
63d0: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
63e0: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
63f0: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
6400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6410: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
6420: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
6430: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
6440: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
6450: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
6460: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
6470: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
6480: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
6490: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
64a0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
64b0: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
64c0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
64d0: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
64e0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
64f0: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
6500: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
6510: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
6520: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
6530: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
6540: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
6550: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
6560: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
6570: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
6580: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
6590: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
65a0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
65b0: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
65c0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
65d0: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
65e0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
65f0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
6600: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
6610: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
6620: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
6630: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
6640: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
6650: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
6660: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
6670: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
6680: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
6690: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
66a0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
66b0: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
66c0: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
66d0: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
66e0: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
66f0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
6700: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
6710: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6720: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
6730: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
6740: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
6750: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
6760: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
6770: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
6780: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
6790: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
67a0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
67b0: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
67c0: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
67d0: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
67e0: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
67f0: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
6800: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
6810: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
6820: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
6830: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
6840: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
6850: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
6860: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
6870: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
6880: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
6890: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
68a0: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
68b0: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
68c0: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
68d0: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
68e0: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
68f0: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
6900: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
6910: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
6920: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
6930: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
6940: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
6950: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
6960: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
6970: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
6980: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
6990: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
69a0: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
69b0: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
69c0: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
69d0: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
69e0: 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  e.      || (pPg-
69f0: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
6a00: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
6a10: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
6a20: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
6a30: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
6a40: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
6a50: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
6a60: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
6a70: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
6a80: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
6a90: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
6aa0: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
6ab0: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
6ac0: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
6ad0: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
6ae0: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
6af0: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
6b00: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
6b10: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
6b20: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
6b30: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
6b40: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
6b50: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
6b60: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
6b70: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
6b80: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
6b90: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
6ba0: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
6bb0: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
6bc0: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
6bd0: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
6be0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
6bf0: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
6c00: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
6c10: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
6c20: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
6c30: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
6c40: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
6c50: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
6c60: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
6c70: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
6c80: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
6c90: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
6ca0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
6cb0: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
6cc0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
6cd0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
6ce0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
6cf0: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
6d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
6d10: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
6d20: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
6d30: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
6d40: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
6d50: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
6d60: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
6d70: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
6d80: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
6d90: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
6da0: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
6db0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6dc0: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
6dd0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
6de0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
6df0: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
6e00: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
6e10: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
6e20: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
6e30: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
6e40: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
6e50: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
6e60: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
6e70: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
6e80: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
6e90: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
6ea0: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
6eb0: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
6ec0: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
6ed0: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
6ee0: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
6ef0: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
6f00: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
6f10: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
6f20: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
6f30: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
6f40: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
6f50: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
6f60: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
6f70: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
6f80: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
6f90: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
6fa0: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
6fb0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
6fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6fd0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
6fe0: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
6ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7000: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
7010: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
7020: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
7030: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
7040: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
7050: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
7060: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
7070: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
7080: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
7090: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
70a0: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
70b0: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
70c0: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
70d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
70e0: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
70f0: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
7100: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
7110: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
7120: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
7130: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
7140: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
7150: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
7160: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
7170: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
7180: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
7190: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
71a0: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
71b0: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
71c0: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
71d0: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
71e0: 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  er .   || SQLITE
71f0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
7200: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
7210: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
7220: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
7230: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7240: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
7250: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
7260: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
7270: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7280: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
7290: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
72a0: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
72b0: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
72c0: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
72d0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
72e0: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
72f0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
7300: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
7310: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
7320: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
7330: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
7340: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
7350: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
7360: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
7370: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
7380: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
7390: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
73a0: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
73b0: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
73c0: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
73d0: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
73e0: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
73f0: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
7400: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
7410: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
7420: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
7430: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
7440: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
7450: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
7460: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
7470: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
7480: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
7490: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
74a0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
74b0: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
74c0: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
74d0: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
74e0: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
74f0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
7500: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
7510: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
7520: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
7530: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
7540: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
7550: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
7560: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
7570: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
7580: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
7590: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
75a0: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
75b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
75d0: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
7600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7610: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
7620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7630: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
7640: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
7650: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
7660: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
7670: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
7680: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7690: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
76a0: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
76b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
76c0: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
76d0: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
76e0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
76f0: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
7700: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
7710: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
7720: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
7730: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
7740: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
7750: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
7760: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
7770: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
7780: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
7790: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
77a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
77b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
77c0: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
77d0: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
77e0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
77f0: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
7800: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
7810: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
7820: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
7830: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
7840: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
7850: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
7860: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
7870: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
7880: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
7890: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
78a0: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
78b0: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
78c0: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
78d0: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
78e0: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
78f0: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
7900: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
7910: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
7920: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
7930: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
7940: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
7950: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
7960: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
7970: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
7980: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
7990: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
79a0: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
79b0: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
79c0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
79d0: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
79e0: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
79f0: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
7a00: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
7a10: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
7a20: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
7a30: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
7a40: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
7a50: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
7a60: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
7a70: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
7a80: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
7a90: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
7aa0: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
7ab0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
7ac0: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
7ad0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
7ae0: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
7af0: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
7b00: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
7b10: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
7b20: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
7b30: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
7b40: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
7b50: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
7b60: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
7b70: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7b80: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
7b90: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
7ba0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
7bb0: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
7bc0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7bd0: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
7be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7bf0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
7c00: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
7c10: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
7c20: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
7c30: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
7c40: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
7c50: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
7c60: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
7c70: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
7c80: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
7c90: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
7ca0: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
7cb0: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
7cc0: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
7cd0: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
7ce0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
7cf0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
7d00: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
7d10: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
7d20: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
7d30: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
7d40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
7d50: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
7d60: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
7d70: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
7d80: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
7d90: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
7da0: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
7db0: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
7dc0: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
7dd0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
7de0: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
7df0: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
7e00: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
7e10: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
7e20: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
7e30: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
7e40: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
7e50: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
7e60: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
7e70: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
7e80: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
7e90: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
7ea0: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
7eb0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
7ec0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
7ed0: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
7ee0: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
7ef0: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
7f00: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
7f10: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
7f20: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
7f30: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
7f40: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
7f50: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
7f60: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
7f70: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
7f80: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
7f90: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
7fa0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
7fb0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
7fc0: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
7fd0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
7fe0: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
7ff0: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
8000: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
8010: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
8020: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
8030: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8040: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
8050: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
8060: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
8070: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
8080: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
8090: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
80a0: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
80b0: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
80c0: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
80d0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
80e0: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
80f0: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
8100: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
8110: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8120: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
8130: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
8140: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
8150: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
8160: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
8170: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
8180: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
8190: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
81a0: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
81b0: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
81c0: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
81d0: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
81e0: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
81f0: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
8200: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
8210: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
8220: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
8230: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
8240: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
8250: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
8260: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
8270: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
8280: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
8290: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
82a0: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
82b0: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
82c0: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
82d0: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
82e0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
82f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8300: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
8310: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
8320: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
8330: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
8340: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
8350: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
8360: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
8370: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8380: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
8390: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
83a0: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
83b0: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
83c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
83d0: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
83e0: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
83f0: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
8400: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8420: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
8430: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
8440: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
8450: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
8460: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
8470: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
8480: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
8490: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
84a0: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
84b0: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
84c0: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
84d0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
84e0: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
84f0: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
8500: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
8510: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
8520: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
8530: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
8540: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
8550: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
8560: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
8570: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
8580: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
8590: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
85a0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
85b0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
85c0: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
85d0: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
85e0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
85f0: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
8600: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
8610: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
8620: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
8630: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
8640: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8650: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
8660: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 0a  ffset(pPager);..
8670: 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74 65    /* .  ** Write
8680: 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64 20   the nRec Field 
8690: 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  - the number of 
86a0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68 61  page records tha
86b0: 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20 20  t follow this.  
86c0: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ** journal heade
86d0: 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65 72  r. Normally, zer
86e0: 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  o is written to 
86f0: 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74 68  this value at th
8700: 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41 66  is time..  ** Af
8710: 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73 20  ter the records 
8720: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
8730: 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74 68   journal (and th
8740: 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65 64  e journal synced
8750: 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66 75  , .  ** if in fu
8760: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20 74  ll-sync mode), t
8770: 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72 77  he zero is overw
8780: 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65 20  ritten with the 
8790: 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a 2a  true number.  **
87a0: 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65 65   of records (see
87b0: 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29 2e   syncJournal()).
87c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61 73  .  **.  ** A fas
87d0: 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65 20  ter alternative 
87e0: 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46 46  is to write 0xFF
87f0: 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e 52  FFFFFF to the nR
8800: 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a 20  ec field. When. 
8810: 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65 20   ** reading the 
8820: 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61 6c  journal this val
8830: 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65 20  ue tells SQLite 
8840: 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20 74  to assume that t
8850: 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66 20  he.  ** rest of 
8860: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8870: 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64 20   contains valid 
8880: 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54 68  page records. Th
8890: 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20 20  is assumption.  
88a0: 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73 2c  ** is dangerous,
88b0: 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72 65   as if a failure
88c0: 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 73 74   occurred whilst
88d0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
88e0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
88f0: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
8900: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
8910: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
8920: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
8930: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
8940: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
8950: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
8960: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
8970: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
8980: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
8990: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
89a0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
89b0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
89c0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
89d0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
89e0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
89f0: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
8a00: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
8a10: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
8a20: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
8a30: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
8a40: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
8a50: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
8a60: 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
8a70: 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
8a80: 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20 69 66  ->noSync );.  if
8a90: 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  ( (pPager->noSyn
8aa0: 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a  c) || (pPager->j
8ab0: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
8ac0: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45  R_JOURNALMODE_ME
8ad0: 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73 71 6c  MORY).   || (sql
8ae0: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
8af0: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
8b00: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
8b10: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
8b20: 29 20 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  ) .  ){.    memc
8b30: 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75  py(zHeader, aJou
8b40: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
8b50: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
8b60: 29 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  );.    put32bits
8b70: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
8b80: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d  (aJournalMagic)]
8b90: 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20  , 0xffffffff);. 
8ba0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 73   }else{.    mems
8bb0: 65 74 28 7a 48 65 61 64 65 72 2c 20 30 2c 20 73  et(zHeader, 0, s
8bc0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
8bd0: 67 69 63 29 2b 34 29 3b 0a 20 20 7d 0a 0a 20 20  gic)+4);.  }..  
8be0: 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68  /* The random ch
8bf0: 65 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c  eck-hash initial
8c00: 69 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74  iser */ .  sqlit
8c10: 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69  e3_randomness(si
8c20: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73  zeof(pPager->cks
8c30: 75 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72  umInit), &pPager
8c40: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
8c50: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
8c60: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
8c70: 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61  alMagic)+4], pPa
8c80: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
8c90: 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61  .  /* The initia
8ca0: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
8cb0: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
8cc0: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
8cd0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d  JournalMagic)+8]
8ce0: 2c 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67  , pPager->dbOrig
8cf0: 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Size);.  /* The 
8d00: 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  assumed sector s
8d10: 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  ize for this pro
8d20: 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62  cess */.  put32b
8d30: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
8d40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
8d50: 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e  c)+12], pPager->
8d60: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20  sectorSize);..  
8d70: 2f 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  /* The page size
8d80: 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28   */.  put32bits(
8d90: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
8da0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31  aJournalMagic)+1
8db0: 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  6], pPager->page
8dc0: 53 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69  Size);..  /* Ini
8dd0: 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61  tializing the ta
8de0: 69 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72  il of the buffer
8df0: 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
8e00: 79 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20  y.  Everything. 
8e10: 20 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69   ** works find i
8e20: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
8e30: 6d 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74  memset() is omit
8e40: 74 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61  ted.  But initia
8e50: 6c 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  lizing.  ** the 
8e60: 6d 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20  memory prevents 
8e70: 76 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f  valgrind from co
8e80: 6d 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65  mplaining, so we
8e90: 20 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a   are willing to.
8ea0: 20 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65    ** take the pe
8eb0: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20  rformance hit.. 
8ec0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48   */.  memset(&zH
8ed0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
8ee0: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c  urnalMagic)+20],
8ef0: 20 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65   0,.         nHe
8f00: 61 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f  ader-(sizeof(aJo
8f10: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29  urnalMagic)+20))
8f20: 3b 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72  ;..  /* In theor
8f30: 79 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65  y, it is only ne
8f40: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
8f50: 20 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68   the 28 bytes th
8f60: 61 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75  at the .  ** jou
8f70: 72 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73  rnal header cons
8f80: 75 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72  umes to the jour
8f90: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54  nal file here. T
8fa0: 68 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68  hen increment th
8fb0: 65 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f  e .  ** Pager.jo
8fc0: 75 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c  urnalOff variabl
8fd0: 65 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  e by JOURNAL_HDR
8fe0: 5f 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20  _SZ so that the 
8ff0: 6e 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72  next .  ** recor
9000: 64 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  d is written to 
9010: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65  the following se
9020: 63 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20  ctor (leaving a 
9030: 67 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a  gap in the file.
9040: 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62    ** that will b
9050: 65 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c  e implicitly fil
9060: 6c 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53  led in by the OS
9070: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77  )..  **.  ** How
9080: 65 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e  ever it has been
9090: 20 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74   discovered that
90a0: 20 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   on some systems
90b0: 20 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61   this pattern ca
90c0: 6e 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69  n .  ** be signi
90d0: 66 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20  ficantly slower 
90e0: 74 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c  than contiguousl
90f0: 79 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74  y writing data t
9100: 6f 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a  o the file,.  **
9110: 20 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65   even if that me
9120: 61 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77  ans explicitly w
9130: 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74  riting data to t
9140: 68 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a  he block of .  *
9150: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
9160: 5a 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68  Z - 28) bytes th
9170: 61 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75  at will not be u
9180: 73 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20  sed. So that is 
9190: 77 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e  what.  ** is don
91a0: 65 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  e. .  **.  ** Th
91b0: 65 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72  e loop is requir
91c0: 65 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20  ed here in case 
91d0: 74 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20  the sector-size 
91e0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74  is larger than t
91f0: 68 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73  he .  ** databas
9200: 65 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e  e page size. Sin
9210: 63 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62  ce the zHeader b
9220: 75 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61  uffer is only Pa
9230: 67 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a  ger.pageSize.  *
9240: 2a 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  * bytes in size,
9250: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63   more than one c
9260: 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73  all to sqlite3Os
9270: 57 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72  Write() may be r
9280: 65 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20  equired.  ** to 
9290: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74  populate the ent
92a0: 69 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ire journal head
92b0: 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20  er sector..  */ 
92c0: 0a 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b  .  for(nWrite=0;
92d0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26   rc==SQLITE_OK&&
92e0: 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48  nWrite<JOURNAL_H
92f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e  DR_SZ(pPager); n
9300: 57 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b  Write+=nHeader){
9310: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
9320: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
9330: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
9340: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e  r->journalHdr, n
9350: 48 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20  Header)).    rc 
9360: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
9370: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48  (pPager->jfd, zH
9380: 65 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20  eader, nHeader, 
9390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
93a0: 66 66 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  ff);.    assert(
93b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
93c0: 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a  Hdr <= pPager->j
93d0: 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20  ournalOff );.   
93e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
93f0: 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b 0a  Off += nHeader;.
9400: 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
9410: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a  ;.}../*.** The j
9420: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
9430: 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68   be open when th
9440: 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  is is called. A 
9450: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
9460: 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f  ile.** (JOURNAL_
9470: 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73  HDR_SZ bytes) is
9480: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 63   read from the c
9490: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20  urrent location 
94a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
94b0: 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72 72  * file. The curr
94c0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  ent location in 
94d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
94e0: 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a 20   is given by.** 
94f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9500: 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ff. See comments
9510: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
9520: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
9530: 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63 72  ) for.** a descr
9540: 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a 6f  iption of the jo
9550: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
9560: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
9570: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
9580: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
9590: 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20  pNRec is set to 
95a0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a  the number of.**
95b0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f   page records fo
95c0: 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61  llowing this hea
95d0: 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a 65  der and *pDbSize
95e0: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 73   is set to the s
95f0: 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  ize of the.** da
9600: 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74 68  tabase before th
9610: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65  e transaction be
9620: 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41  gan, in pages. A
9630: 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  lso, pPager->cks
9640: 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74  umInit.** is set
9650: 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65   to the value re
9660: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
9670: 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49  nal header. SQLI
9680: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
9690: 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73  d.** in this cas
96a0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
96b0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
96c0: 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20 62  ile appears to b
96d0: 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c  e corrupted, SQL
96e0: 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72  ITE_DONE is.** r
96f0: 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e 52  eturned and *pNR
9700: 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65 20  ec and *PDbSize 
9710: 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20 20  are undefined.  
9720: 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  If JOURNAL_HDR_S
9730: 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f  Z bytes.** canno
9740: 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  t be read from t
9750: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9760: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
9770: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
9780: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75  atic int readJou
9790: 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72  rnalHdr(.  Pager
97a0: 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20   *pPager,       
97b0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
97c0: 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74   object */.  int
97d0: 20 69 73 48 6f 74 2c 0a 20 20 69 36 34 20 6a 6f   isHot,.  i64 jo
97e0: 75 72 6e 61 6c 53 69 7a 65 2c 20 20 20 20 20 20  urnalSize,      
97f0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
9800: 66 20 74 68 65 20 6f 70 65 6e 20 6a 6f 75 72 6e  f the open journ
9810: 61 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73  al file in bytes
9820: 20 2a 2f 0a 20 20 75 33 32 20 2a 70 4e 52 65 63   */.  u32 *pNRec
9830: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9840: 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65     /* OUT: Value
9850: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6e   read from the n
9860: 52 65 63 20 66 69 65 6c 64 20 2a 2f 0a 20 20 75  Rec field */.  u
9870: 33 32 20 2a 70 44 62 53 69 7a 65 20 20 20 20 20  32 *pDbSize     
9880: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
9890: 55 54 3a 20 56 61 6c 75 65 20 6f 66 20 6f 72 69  UT: Value of ori
98a0: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 73  ginal database s
98b0: 69 7a 65 20 66 69 65 6c 64 20 2a 2f 0a 29 7b 0a  ize field */.){.
98c0: 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
98d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
98e0: 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
98f0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
9900: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 20 20   aMagic[8];     
9910: 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68  /* A buffer to h
9920: 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65  old the magic he
9930: 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 69 48  ader */.  i64 iH
9940: 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20  drOff;          
9950: 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65 74         /* Offset
9960: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   of journal head
9970: 65 72 20 62 65 69 6e 67 20 72 65 61 64 20 2a 2f  er being read */
9980: 0a 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ..  assert( isOp
9990: 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
99a0: 29 3b 20 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e  );      /* Journ
99b0: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
99c0: 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20 2f 2a 20 41  open. */..  /* A
99d0: 64 76 61 6e 63 65 20 50 61 67 65 72 2e 6a 6f 75  dvance Pager.jou
99e0: 72 6e 61 6c 4f 66 66 20 74 6f 20 74 68 65 20 73  rnalOff to the s
99f0: 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78 74  tart of the next
9a00: 20 73 65 63 74 6f 72 2e 20 49 66 20 74 68 65 0a   sector. If the.
9a10: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
9a20: 65 20 69 73 20 74 6f 6f 20 73 6d 61 6c 6c 20 66  e is too small f
9a30: 6f 72 20 74 68 65 72 65 20 74 6f 20 62 65 20 61  or there to be a
9a40: 20 68 65 61 64 65 72 20 73 74 6f 72 65 64 20 61   header stored a
9a50: 74 20 74 68 69 73 0a 20 20 2a 2a 20 70 6f 69 6e  t this.  ** poin
9a60: 74 2c 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  t, return SQLITE
9a70: 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a 20 20 70 50  _DONE..  */.  pP
9a80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9a90: 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66   = journalHdrOff
9aa0: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  set(pPager);.  i
9ab0: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
9ac0: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
9ad0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
9ae0: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
9af0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
9b00: 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 69 48 64 72  DONE;.  }.  iHdr
9b10: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Off = pPager->jo
9b20: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
9b30: 52 65 61 64 20 69 6e 20 74 68 65 20 66 69 72 73  Read in the firs
9b40: 74 20 38 20 62 79 74 65 73 20 6f 66 20 74 68 65  t 8 bytes of the
9b50: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
9b60: 20 49 66 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   If they do not 
9b70: 6d 61 74 63 68 0a 20 20 2a 2a 20 74 68 65 20 20  match.  ** the  
9b80: 6d 61 67 69 63 20 73 74 72 69 6e 67 20 66 6f 75  magic string fou
9b90: 6e 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20  nd at the start 
9ba0: 6f 66 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  of each journal 
9bb0: 68 65 61 64 65 72 2c 20 72 65 74 75 72 6e 0a 20  header, return. 
9bc0: 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e   ** SQLITE_DONE.
9bd0: 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
9be0: 6f 63 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61  occurs, return a
9bf0: 6e 20 65 72 72 6f 72 20 63 6f 64 65 2e 20 4f 74  n error code. Ot
9c00: 68 65 72 77 69 73 65 2c 0a 20 20 2a 2a 20 70 72  herwise,.  ** pr
9c10: 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  oceed..  */.  if
9c20: 28 20 69 73 48 6f 74 20 7c 7c 20 69 48 64 72 4f  ( isHot || iHdrO
9c30: 66 66 21 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ff!=pPager->jour
9c40: 6e 61 6c 48 64 72 20 29 7b 0a 20 20 20 20 72 63  nalHdr ){.    rc
9c50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
9c60: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
9c70: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
9c80: 67 69 63 29 2c 20 69 48 64 72 4f 66 66 29 3b 0a  gic), iHdrOff);.
9c90: 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
9ca0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
9cb0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6d 65 6d     }.    if( mem
9cc0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
9cd0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
9ce0: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
9cf0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
9d00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
9d10: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
9d20: 74 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20  the first three 
9d30: 33 32 2d 62 69 74 20 66 69 65 6c 64 73 20 6f 66  32-bit fields of
9d40: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
9d50: 64 65 72 3a 20 54 68 65 20 6e 52 65 63 0a 20 20  der: The nRec.  
9d60: 2a 2a 20 66 69 65 6c 64 2c 20 74 68 65 20 63 68  ** field, the ch
9d70: 65 63 6b 73 75 6d 2d 69 6e 69 74 69 61 6c 69 7a  ecksum-initializ
9d80: 65 72 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  er and the datab
9d90: 61 73 65 20 73 69 7a 65 20 61 74 20 74 68 65 20  ase size at the 
9da0: 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
9db0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 52  e transaction. R
9dc0: 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
9dd0: 6f 64 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ode if anything 
9de0: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 20 20 2a 2f  goes wrong..  */
9df0: 0a 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b  .  if( SQLITE_OK
9e00: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
9e10: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9e20: 69 48 64 72 4f 66 66 2b 38 2c 20 70 4e 52 65 63  iHdrOff+8, pNRec
9e30: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
9e40: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
9e50: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9e60: 2c 20 69 48 64 72 4f 66 66 2b 31 32 2c 20 26 70  , iHdrOff+12, &p
9e70: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9e80: 29 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  )).   || SQLITE_
9e90: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
9ea0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
9eb0: 2c 20 69 48 64 72 4f 66 66 2b 31 36 2c 20 70 44  , iHdrOff+16, pD
9ec0: 62 53 69 7a 65 29 29 0a 20 20 29 7b 0a 20 20 20  bSize)).  ){.   
9ed0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
9ee0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
9ef0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a  ournalOff==0 ){.
9f00: 20 20 20 20 75 33 32 20 69 50 61 67 65 53 69 7a      u32 iPageSiz
9f10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
9f20: 20 2f 2a 20 50 61 67 65 2d 73 69 7a 65 20 66 69   /* Page-size fi
9f30: 65 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68  eld of journal h
9f40: 65 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  eader */.    u32
9f50: 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 20 20 20   iSectorSize;   
9f60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
9f70: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f  tor-size field o
9f80: 66 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  f journal header
9f90: 20 2a 2f 0a 20 20 20 20 75 31 36 20 69 50 61 67   */.    u16 iPag
9fa0: 65 53 69 7a 65 31 36 3b 20 20 20 20 20 20 20 20  eSize16;        
9fb0: 20 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20       /* Copy of 
9fc0: 69 50 61 67 65 53 69 7a 65 20 69 6e 20 31 36 2d  iPageSize in 16-
9fd0: 62 69 74 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  bit variable */.
9fe0: 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65  .    /* Read the
9ff0: 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73   page-size and s
a000: 65 63 74 6f 72 2d 73 69 7a 65 20 6a 6f 75 72 6e  ector-size journ
a010: 61 6c 20 68 65 61 64 65 72 20 66 69 65 6c 64 73  al header fields
a020: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 53 51 4c  . */.    if( SQL
a030: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
a040: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
a050: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 30  >jfd, iHdrOff+20
a060: 2c 20 26 69 53 65 63 74 6f 72 53 69 7a 65 29 29  , &iSectorSize))
a070: 0a 20 20 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f  .     || SQLITE_
a080: 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32  OK!=(rc = read32
a090: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a0a0: 2c 20 69 48 64 72 4f 66 66 2b 32 34 2c 20 26 69  , iHdrOff+24, &i
a0b0: 50 61 67 65 53 69 7a 65 29 29 0a 20 20 20 20 29  PageSize)).    )
a0c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
a0d0: 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
a0e0: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
a0f0: 76 61 6c 75 65 73 20 72 65 61 64 20 66 72 6f 6d  values read from
a100: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
a110: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 66  nd sector-size f
a120: 69 65 6c 64 73 0a 20 20 20 20 2a 2a 20 61 72 65  ields.    ** are
a130: 20 77 69 74 68 69 6e 20 72 61 6e 67 65 2e 20 54   within range. T
a140: 6f 20 62 65 20 27 69 6e 20 72 61 6e 67 65 27 2c  o be 'in range',
a150: 20 62 6f 74 68 20 76 61 6c 75 65 73 20 6e 65 65   both values nee
a160: 64 20 74 6f 20 62 65 20 61 20 70 6f 77 65 72 0a  d to be a power.
a170: 20 20 20 20 2a 2a 20 6f 66 20 74 77 6f 20 67 72      ** of two gr
a180: 65 61 74 65 72 20 74 68 61 6e 20 6f 72 20 65 71  eater than or eq
a190: 75 61 6c 20 74 6f 20 35 31 32 20 6f 72 20 33 32  ual to 512 or 32
a1a0: 2c 20 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65  , and not greate
a1b0: 72 20 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20  r than their .  
a1c0: 20 20 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20    ** respective 
a1d0: 63 6f 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78  compile time max
a1e0: 69 6d 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20  imum limits..   
a1f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67   */.    if( iPag
a200: 65 53 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20  eSize<512       
a210: 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53             || iS
a220: 65 63 74 6f 72 53 69 7a 65 3c 33 32 0a 20 20 20  ectorSize<32.   
a230: 20 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53    || iPageSize>S
a240: 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
a250: 49 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69  IZE || iSectorSi
a260: 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49  ze>MAX_SECTOR_SI
a270: 5a 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61  ZE.     || ((iPa
a280: 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53  geSize-1)&iPageS
a290: 69 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69  ize)!=0   || ((i
a2a0: 53 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53  SectorSize-1)&iS
a2b0: 65 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20  ectorSize)!=0 . 
a2c0: 20 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49     ){.      /* I
a2d0: 66 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65  f the either the
a2e0: 20 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65   page-size or se
a2f0: 63 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65  ctor-size in the
a300: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
a310: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76  is .      ** inv
a320: 61 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70  alid, then the p
a330: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
a340: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  e the journal-he
a350: 61 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a  ader must have .
a360: 20 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64        ** crashed
a370: 20 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64   before the head
a380: 65 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49  er was synced. I
a390: 6e 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70  n this case stop
a3a0: 20 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20   reading .      
a3b0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
a3c0: 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20  ile here..      
a3d0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
a3e0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
a3f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74   }..    /* Updat
a400: 65 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  e the page-size 
a410: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c  to match the val
a420: 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  ue read from the
a430: 20 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a   journal. .    *
a440: 2a 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65  * Use a testcase
a450: 28 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65  () macro to make
a460: 20 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f   sure that mallo
a470: 63 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e  c failure within
a480: 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65   .    ** PagerSe
a490: 74 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74  tPagesize() is t
a4a0: 65 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20  ested..    */.  
a4b0: 20 20 69 50 61 67 65 53 69 7a 65 31 36 20 3d 20    iPageSize16 = 
a4c0: 28 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a  (u16)iPageSize;.
a4d0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
a4e0: 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
a4f0: 28 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53  (pPager, &iPageS
a500: 69 7a 65 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20  ize16, -1);.    
a510: 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
a520: 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61  LITE_OK );.    a
a530: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
a540: 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a  E_OK || iPageSiz
a550: 65 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65 53  e16==(u16)iPageS
a560: 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55  ize );..    /* U
a570: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
a580: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
a590: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
a5a0: 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a   used by .    **
a5b0: 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61   the process tha
a5c0: 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a  t created this j
a5d0: 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20  ournal. If this 
a5e0: 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20  journal was.    
a5f0: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
a600: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
a610: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
a620: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
a630: 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63     ** is being c
a640: 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69  alled from withi
a650: 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  n pager_playback
a660: 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61  (). The local va
a670: 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61  lue.    ** of Pa
a680: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69  ger.sectorSize i
a690: 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68  s restored at th
a6a0: 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f  e end of that ro
a6b0: 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  utine..    */.  
a6c0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
a6d0: 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69  Size = iSectorSi
a6e0: 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65  ze;.  }..  pPage
a6f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
a700: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
a710: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
a720: 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
a730: 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69  Write the suppli
a740: 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ed master journa
a750: 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20  l name into the 
a760: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
a770: 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72   pager.** pPager
a780: 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20   at the current 
a790: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61  location. The ma
a7a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
a7b0: 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61  e must be the la
a7c0: 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74  st.** thing writ
a7d0: 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c  ten to a journal
a7e0: 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61   file. If the pa
a7f0: 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73  ger is in full-s
a800: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a  ync mode, the.**
a810: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
a820: 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61  scriptor is adva
a830: 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74  nced to the next
a840: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
a850: 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68   before.** anyth
a860: 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20  ing is written. 
a870: 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a  The format is:.*
a880: 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  *.**   + 4 bytes
a890: 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e  : PAGER_MJ_PGNO.
a8a0: 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a  .**   + N bytes:
a8b0: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
a8c0: 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d  filename in utf-
a8d0: 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  8..**   + 4 byte
a8e0: 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20  s: N (length of 
a8f0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
a900: 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f  ame in bytes, no
a910: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
a920: 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
a930: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
a940: 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
a950: 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20  **   + 8 bytes: 
a960: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
a970: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a980: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
a990: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
a9a0: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
a9b0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
a9c0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77   journal name, w
a9d0: 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69  here each byte i
a9e0: 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
a9f0: 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20   a signed 8-bit 
aa00: 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49  integer..**.** I
aa10: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
aa20: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
aa30: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
aa40: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
aa50: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
aa60: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
aa70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
aa80: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
aa90: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
aaa0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
aab0: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
aac0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aad0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
aae0: 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
aaf0: 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20  nt nMaster;     
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72  /* Length of str
ab20: 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20  ing zMaster */. 
ab30: 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20   i64 iHdrOff;   
ab40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab50: 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68    /* Offset of h
ab60: 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c  eader in journal
ab70: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a   file */.  i64 j
ab80: 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20  rnlSize;        
ab90: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
aba0: 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66  ize of journal f
abb0: 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20  ile on disk */. 
abc0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20   u32 cksum = 0; 
abd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abe0: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66    /* Checksum of
abf0: 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20   string zMaster 
ac00: 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74  */..  if( !zMast
ac10: 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65  er || pPager->se
ac20: 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70 50  tMaster.   || pP
ac30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
ac40: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
ac50: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20  MODE_MEMORY .   
ac60: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
ac70: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ac80: 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20  URNALMODE_OFF . 
ac90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
aca0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
acb0: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
acc0: 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28  r = 1;.  assert(
acd0: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
ace0: 6a 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  jfd) );.  assert
acf0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
ad00: 6c 48 64 72 20 3c 3d 20 70 50 61 67 65 72 2d 3e  lHdr <= pPager->
ad10: 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 0a 20  journalOff );.. 
ad20: 20 2f 2a 20 43 61 6c 63 75 6c 61 74 65 20 74 68   /* Calculate th
ad30: 65 20 6c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  e length in byte
ad40: 73 20 61 6e 64 20 74 68 65 20 63 68 65 63 6b 73  s and the checks
ad50: 75 6d 20 6f 66 20 7a 4d 61 73 74 65 72 20 2a 2f  um of zMaster */
ad60: 0a 20 20 66 6f 72 28 6e 4d 61 73 74 65 72 3d 30  .  for(nMaster=0
ad70: 3b 20 7a 4d 61 73 74 65 72 5b 6e 4d 61 73 74 65  ; zMaster[nMaste
ad80: 72 5d 3b 20 6e 4d 61 73 74 65 72 2b 2b 29 7b 0a  r]; nMaster++){.
ad90: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61      cksum += zMa
ada0: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 0a 20  ster[nMaster];. 
adb0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66   }..  /* If in f
adc0: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61  ull-sync mode, a
add0: 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65  dvance to the ne
ade0: 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62  xt disk sector b
adf0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20  efore writing.  
ae00: 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** the master jo
ae10: 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73  urnal name. This
ae20: 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20   is in case the 
ae30: 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72  previous page wr
ae40: 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68  itten to.  ** th
ae50: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c  e journal has al
ae60: 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65  ready been synce
ae70: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
ae80: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
ae90: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
aea0: 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e  urnalOff = journ
aeb0: 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50 61 67  alHdrOffset(pPag
aec0: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 48 64 72 4f  er);.  }.  iHdrO
aed0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ff = pPager->jou
aee0: 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20 57  rnalOff;..  /* W
aef0: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
af00: 6a 6f 75 72 6e 61 6c 20 64 61 74 61 20 74 6f 20  journal data to 
af10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
af20: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 0a  ournal file. If.
af30: 20 20 2a 2a 20 61 6e 20 65 72 72 6f 72 20 6f 63    ** an error oc
af40: 63 75 72 73 2c 20 72 65 74 75 72 6e 20 74 68 65  curs, return the
af50: 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74   error code to t
af60: 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 2a 2f 0a  he caller..  */.
af70: 20 20 69 66 28 20 28 30 20 21 3d 20 28 72 63 20    if( (0 != (rc 
af80: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
af90: 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f  ager->jfd, iHdrO
afa0: 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
afb0: 4f 28 70 50 61 67 65 72 29 29 29 29 0a 20 20 20  O(pPager)))).   
afc0: 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73  || (0 != (rc = s
afd0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
afe0: 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
aff0: 65 72 2c 20 6e 4d 61 73 74 65 72 2c 20 69 48 64  er, nMaster, iHd
b000: 72 4f 66 66 2b 34 29 29 29 0a 20 20 20 7c 7c 20  rOff+4))).   || 
b010: 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74  (0 != (rc = writ
b020: 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
b030: 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  jfd, iHdrOff+4+n
b040: 4d 61 73 74 65 72 2c 20 6e 4d 61 73 74 65 72 29  Master, nMaster)
b050: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
b060: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
b070: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
b080: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b  drOff+4+nMaster+
b090: 34 2c 20 63 6b 73 75 6d 29 29 29 0a 20 20 20 7c  4, cksum))).   |
b0a0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71  | (0 != (rc = sq
b0b0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
b0c0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
b0d0: 61 6c 4d 61 67 69 63 2c 20 38 2c 20 69 48 64 72  alMagic, 8, iHdr
b0e0: 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2b 38 29  Off+4+nMaster+8)
b0f0: 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75  )).  ){.    retu
b100: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
b110: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b120: 2b 3d 20 28 6e 4d 61 73 74 65 72 2b 32 30 29 3b  += (nMaster+20);
b130: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
b140: 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
b150: 6f 53 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20  oSync;..  /* If 
b160: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
b170: 70 65 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61  peristent-journa
b180: 6c 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65  l mode, then the
b190: 20 70 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20   physical .  ** 
b1a0: 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79  journal-file may
b1b0: 20 65 78 74 65 6e 64 20 70 61 73 74 20 74 68 65   extend past the
b1c0: 20 65 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74   end of the mast
b1d0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a  er-journal name.
b1e0: 20 20 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73    ** and 8 bytes
b1f0: 20 6f 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a   of magic data j
b200: 75 73 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74  ust written to t
b210: 68 65 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  he file. This is
b220: 20 0a 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73   .  ** dangerous
b230: 20 62 65 63 61 75 73 65 20 74 68 65 20 63 6f 64   because the cod
b240: 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  e to rollback a 
b250: 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  hot-journal file
b260: 0a 20 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62  .  ** will not b
b270: 65 20 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74  e able to find t
b280: 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  he master-journa
b290: 6c 20 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d  l name to determ
b2a0: 69 6e 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65  ine .  ** whethe
b2b0: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
b2c0: 72 6e 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20  rnal is hot. .  
b2d0: 2a 2a 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20  **.  ** Easiest 
b2e0: 74 68 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74  thing to do in t
b2f0: 68 69 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20  his scenario is 
b300: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  to truncate the 
b310: 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
b320: 6c 65 20 74 6f 20 74 68 65 20 72 65 71 75 69 72  le to the requir
b330: 65 64 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20  ed size..  */ . 
b340: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
b350: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
b360: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
b370: 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
b380: 0a 20 20 20 26 26 20 6a 72 6e 6c 53 69 7a 65 3e  .   && jrnlSize>
b390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b3a0: 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
b3b0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
b3c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b3d0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b3e0: 66 66 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ff);.  }.  retur
b3f0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  n rc;.}../*.** F
b400: 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
b410: 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76  e hash table giv
b420: 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62  en its page numb
b430: 65 72 2e 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  er. Return.** a 
b440: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
b450: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 74  age or NULL if t
b460: 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
b470: 65 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 6c 72  e is not .** alr
b480: 65 61 64 79 20 69 6e 20 6d 65 6d 6f 72 79 2e 0a  eady in memory..
b490: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
b4a0: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
b4b0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
b4c0: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
b4d0: 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20 20 20   *p;            
b4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b4f0: 52 65 74 75 72 6e 20 76 61 6c 75 65 20 2a 2f 0a  Return value */.
b500: 0a 20 20 2f 2a 20 49 74 20 69 73 20 6e 6f 74 20  .  /* It is not 
b510: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 61 20 63  possible for a c
b520: 61 6c 6c 20 74 6f 20 50 63 61 63 68 65 46 65 74  all to PcacheFet
b530: 63 68 28 29 20 77 69 74 68 20 63 72 65 61 74 65  ch() with create
b540: 46 6c 61 67 3d 3d 30 20 74 6f 0a 20 20 2a 2a 20  Flag==0 to.  ** 
b550: 66 61 69 6c 2c 20 73 69 6e 63 65 20 6e 6f 20 61  fail, since no a
b560: 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
b570: 74 65 20 64 79 6e 61 6d 69 63 20 6d 65 6d 6f 72  te dynamic memor
b580: 79 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 2e 0a  y will be made..
b590: 20 20 2a 2f 0a 20 20 28 76 6f 69 64 29 73 71 6c    */.  (void)sql
b5a0: 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
b5b0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
b5c0: 20 70 67 6e 6f 2c 20 30 2c 20 26 70 29 3b 0a 20   pgno, 0, &p);. 
b5d0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
b5e0: 0a 2a 2a 20 55 6e 6c 65 73 73 20 74 68 65 20 70  .** Unless the p
b5f0: 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
b600: 2d 73 74 61 74 65 2c 20 64 69 73 63 61 72 64 20  -state, discard 
b610: 61 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61  all in-memory pa
b620: 67 65 73 2e 20 49 66 0a 2a 2a 20 74 68 65 20 70  ges. If.** the p
b630: 61 67 65 72 20 69 73 20 69 6e 20 65 72 72 6f 72  ager is in error
b640: 2d 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 69  -state, then thi
b650: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
b660: 70 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 57  p..**.** TODO: W
b670: 68 79 20 63 61 6e 20 77 65 20 6e 6f 74 20 72 65  hy can we not re
b680: 73 65 74 20 74 68 65 20 70 61 67 65 72 20 77 68  set the pager wh
b690: 69 6c 65 20 69 6e 20 65 72 72 6f 72 20 73 74 61  ile in error sta
b6a0: 74 65 3f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  te?.*/.static vo
b6b0: 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28 50  id pager_reset(P
b6c0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
b6d0: 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 3d 3d   if( SQLITE_OK==
b6e0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b6f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61  ){.    sqlite3Ba
b700: 63 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67  ckupRestart(pPag
b710: 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20  er->pBackup);.  
b720: 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
b730: 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 50 43  lear(pPager->pPC
b740: 61 63 68 65 29 3b 0a 20 20 20 20 70 50 61 67 65  ache);.    pPage
b750: 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d  r->dbSizeValid =
b760: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
b770: 20 46 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74   Free all struct
b780: 75 72 65 73 20 69 6e 20 74 68 65 20 50 61 67 65  ures in the Page
b790: 72 2e 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61  r.aSavepoint[] a
b7a0: 72 72 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74  rray and set bot
b7b0: 68 0a 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65  h.** Pager.aSave
b7c0: 70 6f 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e  point and Pager.
b7d0: 6e 53 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65  nSavepoint to ze
b7e0: 72 6f 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75  ro. Close the su
b7f0: 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20  b-journal.** if 
b800: 69 74 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  it is open and t
b810: 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
b820: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
b830: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
b840: 64 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65  d releaseAllSave
b850: 70 6f 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50  points(Pager *pP
b860: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b  ager){.  int ii;
b870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b880: 2a 20 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c  * Iterator for l
b890: 6f 6f 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50  ooping through P
b8a0: 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
b8b0: 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69  */.  for(ii=0; i
b8c0: 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
b8d0: 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
b8e0: 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
b8f0: 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53  stroy(pPager->aS
b900: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e  avepoint[ii].pIn
b910: 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a  Savepoint);.  }.
b920: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
b930: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
b940: 73 71 6c 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72  sqlite3IsMemJour
b950: 6e 61 6c 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  nal(pPager->sjfd
b960: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
b970: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
b980: 73 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  sjfd);.  }.  sql
b990: 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
b9a0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  ->aSavepoint);. 
b9b0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
b9c0: 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  int = 0;.  pPage
b9d0: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20  r->nSavepoint = 
b9e0: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 75  0;.  pPager->nSu
b9f0: 62 52 65 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  bRec = 0;.}../*.
ba00: 2a 2a 20 53 65 74 20 74 68 65 20 62 69 74 20 6e  ** Set the bit n
ba10: 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 74 68  umber pgno in th
ba20: 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
ba30: 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 0a 2a  .pInSavepoint .*
ba40: 2a 20 62 69 74 76 65 63 73 20 6f 66 20 61 6c 6c  * bitvecs of all
ba50: 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
ba60: 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
ba70: 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
ba80: 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 4e 4f  .** or SQLITE_NO
ba90: 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c 6f 63 20  MEM if a malloc 
baa0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2e 0a  failure occurs..
bab0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 64  */.static int ad
bac0: 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69 74 76  dToSavepointBitv
bad0: 65 63 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ecs(Pager *pPage
bae0: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
baf0: 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
bb00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
bb10: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
bb20: 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
bb30: 4f 4b 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  OK;       /* Res
bb40: 75 6c 74 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 66  ult code */..  f
bb50: 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67  or(ii=0; ii<pPag
bb60: 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20  er->nSavepoint; 
bb70: 69 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65 72  ii++){.    Pager
bb80: 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20 26  Savepoint *p = &
bb90: 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
bba0: 6e 74 5b 69 69 5d 3b 0a 20 20 20 20 69 66 28 20  nt[ii];.    if( 
bbb0: 70 67 6e 6f 3c 3d 70 2d 3e 6e 4f 72 69 67 20 29  pgno<=p->nOrig )
bbc0: 7b 0a 20 20 20 20 20 20 72 63 20 7c 3d 20 73 71  {.      rc |= sq
bbd0: 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
bbe0: 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c 20  ->pInSavepoint, 
bbf0: 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 74 65 73  pgno);.      tes
bc00: 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c 49 54  tcase( rc==SQLIT
bc10: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20  E_NOMEM );.     
bc20: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
bc30: 49 54 45 5f 4f 4b 20 7c 7c 20 72 63 3d 3d 53 51  ITE_OK || rc==SQ
bc40: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
bc50: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
bc60: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
bc70: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 69  turn true if thi
bc80: 73 20 70 61 67 65 72 20 75 73 65 73 20 61 20 77  s pager uses a w
bc90: 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 20 69  rite-ahead log i
bca0: 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20 75 73  nstead of the us
bcb0: 75 61 6c 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  ual.** rollback 
bcc0: 6a 6f 75 72 6e 61 6c 2e 20 4f 74 68 65 72 77 69  journal. Otherwi
bcd0: 73 65 20 66 61 6c 73 65 2e 0a 2a 2f 0a 23 69 66  se false..*/.#if
bce0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
bcf0: 5f 57 41 4c 0a 73 74 61 74 69 63 20 69 6e 74 20  _WAL.static int 
bd00: 70 61 67 65 72 55 73 65 57 61 6c 28 50 61 67 65  pagerUseWal(Page
bd10: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
bd20: 74 75 72 6e 20 28 70 50 61 67 65 72 2d 3e 70 57  turn (pPager->pW
bd30: 61 6c 21 3d 30 29 3b 0a 7d 0a 23 65 6c 73 65 0a  al!=0);.}.#else.
bd40: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 55 73  # define pagerUs
bd50: 65 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69  eWal(x) 0.# defi
bd60: 6e 65 20 70 61 67 65 72 52 6f 6c 6c 62 61 63 6b  ne pagerRollback
bd70: 57 61 6c 28 78 29 20 30 0a 23 20 64 65 66 69 6e  Wal(x) 0.# defin
bd80: 65 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73  e pagerWalFrames
bd90: 28 76 2c 77 2c 78 2c 79 2c 7a 29 20 30 0a 23 20  (v,w,x,y,z) 0.# 
bda0: 64 65 66 69 6e 65 20 70 61 67 65 72 4f 70 65 6e  define pagerOpen
bdb0: 57 61 6c 49 66 50 72 65 73 65 6e 74 28 7a 29 20  WalIfPresent(z) 
bdc0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 20 64 65 66 69  SQLITE_OK.# defi
bdd0: 6e 65 20 70 61 67 65 72 42 65 67 69 6e 52 65 61  ne pagerBeginRea
bde0: 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 7a 29 20  dTransaction(z) 
bdf0: 53 51 4c 49 54 45 5f 4f 4b 0a 23 65 6e 64 69 66  SQLITE_OK.#endif
be00: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
be10: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
be20: 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  . This function 
be30: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
be40: 65 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e  e pager.** is in
be50: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
be60: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
be70: 67 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ger is currently
be80: 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c   in error state,
be90: 20 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   discard the con
bea0: 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65  tents of .** the
beb0: 20 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74   cache and reset
bec0: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
bed0: 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74  ture internal st
bee0: 61 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ate. If there is
bef0: 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72  .** an open jour
bf00: 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74  nal-file, then t
bf10: 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73  he next time a s
bf20: 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62  hared-lock is ob
bf30: 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65  tained.** on the
bf40: 20 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20   pager file (by 
bf50: 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65  this or any othe
bf60: 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77  r process), it w
bf70: 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65  ill be.** treate
bf80: 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
bf90: 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61  al and rolled ba
bfa0: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
bfb0: 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28  id pager_unlock(
bfc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bfd0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
bfe0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
bff0: 20 20 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c      int rc = SQL
c000: 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
c010: 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
c020: 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79  */..    /* Alway
c030: 73 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72  s close the jour
c040: 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72  nal file when dr
c050: 6f 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62  opping the datab
c060: 61 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a  ase lock..    **
c070: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74   Otherwise, anot
c080: 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77  her connection w
c090: 69 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65  ith journal_mode
c0a0: 3d 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20  =delete might.  
c0b0: 20 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20    ** delete the 
c0c0: 66 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e  file out from un
c0d0: 64 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20  der us..    */. 
c0e0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
c0f0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
c100: 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
c110: 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
c120: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
c130: 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75    pPager->pInJou
c140: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65  rnal = 0;.    re
c150: 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e  leaseAllSavepoin
c160: 74 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  ts(pPager);..   
c170: 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
c180: 69 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d  is unlocked, som
c190: 65 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74  ebody else might
c1a0: 20 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a   change it. The.
c1b0: 20 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74      ** values st
c1c0: 6f 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62  ored in Pager.db
c1d0: 53 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20  Size etc. might 
c1e0: 62 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69  become invalid i
c1f0: 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61  f.    ** this ha
c200: 70 70 65 6e 73 2e 20 20 4f 6e 65 20 63 61 6e 20  ppens.  One can 
c210: 61 72 67 75 65 20 74 68 61 74 20 74 68 69 73 20  argue that this 
c220: 64 6f 65 73 6e 27 74 20 6e 65 65 64 20 74 6f 20  doesn't need to 
c230: 62 65 20 63 6c 65 61 72 65 64 0a 20 20 20 20 2a  be cleared.    *
c240: 2a 20 75 6e 74 69 6c 20 74 68 65 20 63 68 61 6e  * until the chan
c250: 67 65 2d 63 6f 75 6e 74 65 72 20 63 68 65 63 6b  ge-counter check
c260: 20 66 61 69 6c 73 20 69 6e 20 50 61 67 65 72 53   fails in PagerS
c270: 68 61 72 65 64 4c 6f 63 6b 28 29 2e 0a 20 20 20  haredLock()..   
c280: 20 2a 2a 20 43 6c 65 61 72 69 6e 67 20 74 68 65   ** Clearing the
c290: 20 70 61 67 65 20 73 69 7a 65 20 63 61 63 68 65   page size cache
c2a0: 20 68 65 72 65 20 69 73 20 62 65 69 6e 67 20 63   here is being c
c2b0: 6f 6e 73 65 72 76 61 74 69 76 65 2e 0a 20 20 20  onservative..   
c2c0: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
c2d0: 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
c2e0: 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55  ..    if( pagerU
c2f0: 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b  seWal(pPager) ){
c300: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61  .      sqlite3Wa
c310: 6c 45 6e 64 52 65 61 64 54 72 61 6e 73 61 63 74  lEndReadTransact
c320: 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
c330: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
c340: 20 20 20 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63      rc = osUnloc
c350: 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  k(pPager->fd, NO
c360: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 7d 0a 20 20  _LOCK);.    }.  
c370: 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
c380: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
c390: 65 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  e = rc;.    }.  
c3a0: 20 20 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f    IOTRACE(("UNLO
c3b0: 43 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  CK %p\n", pPager
c3c0: 29 29 0a 0a 20 20 20 20 2f 2a 20 49 66 20 50 61  ))..    /* If Pa
c3d0: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
c3e0: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
c3f0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
c400: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
c410: 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f    ** trusted. No
c420: 77 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  w that the pager
c430: 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65   file is unlocke
c440: 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  d, the contents 
c450: 6f 66 20 74 68 65 0a 20 20 20 20 2a 2a 20 63 61  of the.    ** ca
c460: 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
c470: 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72 72  rded and the err
c480: 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20 63  or code safely c
c490: 6c 65 61 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leared..    */. 
c4a0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
c4b0: 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  rrCode ){.      
c4c0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
c4d0: 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  K ){.        pPa
c4e0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
c4f0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
c500: 7d 0a 20 20 20 20 20 20 70 61 67 65 72 5f 72 65  }.      pager_re
c510: 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
c520: 20 7d 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   }..    pPager->
c530: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
c540: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
c550: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
c560: 4e 4c 4f 43 4b 3b 0a 20 20 20 20 70 50 61 67 65  NLOCK;.    pPage
c570: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
c580: 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  0;.  }.}../*.** 
c590: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68  This function sh
c5a0: 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77  ould be called w
c5b0: 68 65 6e 20 61 6e 20 49 4f 45 52 52 2c 20 43 4f  hen an IOERR, CO
c5c0: 52 52 55 50 54 20 6f 72 20 46 55 4c 4c 20 65 72  RRUPT or FULL er
c5d0: 72 6f 72 0a 2a 2a 20 6d 61 79 20 68 61 76 65 20  ror.** may have 
c5e0: 6f 63 63 75 72 72 65 64 2e 20 54 68 65 20 66 69  occurred. The fi
c5f0: 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20  rst argument is 
c600: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
c610: 20 70 61 67 65 72 20 0a 2a 2a 20 73 74 72 75 63   pager .** struc
c620: 74 75 72 65 2c 20 74 68 65 20 73 65 63 6f 6e 64  ture, the second
c630: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
c640: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
c650: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
c660: 0a 2a 2a 20 41 50 49 20 66 75 6e 63 74 69 6f 6e  .** API function
c670: 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  . The value retu
c680: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
c690: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
c6a0: 75 6d 65 6e 74 20 0a 2a 2a 20 74 6f 20 74 68 69  ument .** to thi
c6b0: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a  s function. .**.
c6c0: 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e 64  ** If the second
c6d0: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51 4c   argument is SQL
c6e0: 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54  ITE_IOERR, SQLIT
c6f0: 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53 51  E_CORRUPT, or SQ
c700: 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65  LITE_FULL.** the
c710: 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20 70   error becomes p
c720: 65 72 73 69 73 74 65 6e 74 2e 20 55 6e 74 69 6c  ersistent. Until
c730: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 20 65   the persisten e
c740: 72 72 6f 72 20 69 73 20 63 6c 65 61 72 65 64 2c  rror is cleared,
c750: 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e 74 20 41  .** subsequent A
c760: 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74 68 69 73  PI calls on this
c770: 20 50 61 67 65 72 20 77 69 6c 6c 20 69 6d 6d 65   Pager will imme
c780: 64 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74  diately return t
c790: 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65 72 72 6f  he same .** erro
c7a0: 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  r code..**.** A 
c7b0: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
c7c0: 20 69 6e 64 69 63 61 74 65 73 20 74 68 61 74 20   indicates that 
c7d0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
c7e0: 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
c7f0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 74 72  .** cannot be tr
c800: 75 73 74 65 64 2e 20 54 68 69 73 20 73 74 61 74  usted. This stat
c810: 65 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65 64  e can be cleared
c820: 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c 79 20 64   by completely d
c830: 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a 20 74 68  iscarding .** th
c840: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
c850: 65 20 70 61 67 65 72 2d 63 61 63 68 65 2e 20 49  e pager-cache. I
c860: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
c870: 77 61 73 20 61 63 74 69 76 65 20 77 68 65 6e 0a  was active when.
c880: 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  ** the persisten
c890: 74 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  t error occurred
c8a0: 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c 6c 62  , then the rollb
c8b0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20  ack journal may 
c8c0: 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20 72 65  need.** to be re
c8d0: 70 6c 61 79 65 64 20 74 6f 20 72 65 73 74 6f 72  played to restor
c8e0: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  e the contents o
c8f0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
c900: 69 6c 65 20 28 61 73 20 69 66 0a 2a 2a 20 69 74  ile (as if.** it
c910: 20 77 65 72 65 20 61 20 68 6f 74 2d 6a 6f 75 72   were a hot-jour
c920: 6e 61 6c 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nal)..*/.static 
c930: 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28  int pager_error(
c940: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
c950: 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63  nt rc){.  int rc
c960: 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20  2 = rc & 0xff;. 
c970: 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
c980: 49 54 45 5f 4f 4b 20 7c 7c 20 21 4d 45 4d 44 42  ITE_OK || !MEMDB
c990: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 0a 20 20   );.  assert(.  
c9a0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
c9b0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c  Code==SQLITE_FUL
c9c0: 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61 67  L ||.       pPag
c9d0: 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c  er->errCode==SQL
c9e0: 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20  ITE_OK ||.      
c9f0: 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64   (pPager->errCod
ca00: 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49 54  e & 0xff)==SQLIT
ca10: 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69  E_IOERR.  );.  i
ca20: 66 28 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46  f( rc2==SQLITE_F
ca30: 55 4c 4c 20 7c 7c 20 72 63 32 3d 3d 53 51 4c 49  ULL || rc2==SQLI
ca40: 54 45 5f 49 4f 45 52 52 20 29 7b 0a 20 20 20 20  TE_IOERR ){.    
ca50: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
ca60: 3d 20 72 63 3b 0a 20 20 7d 0a 20 20 72 65 74 75  = rc;.  }.  retu
ca70: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
ca80: 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61  Execute a rollba
ca90: 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74  ck if a transact
caa0: 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e  ion is active an
cab0: 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a  d unlock the .**
cac0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
cad0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
cae0: 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
caf0: 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
cb00: 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  r state, do not 
cb10: 61 74 74 65 6d 70 74 20 0a 2a 2a 20 74 68 65 20  attempt .** the 
cb20: 72 6f 6c 6c 62 61 63 6b 20 61 74 20 74 68 69 73  rollback at this
cb30: 20 74 69 6d 65 2e 20 49 6e 73 74 65 61 64 2c 20   time. Instead, 
cb40: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 69  pager_unlock() i
cb50: 73 20 63 61 6c 6c 65 64 2e 20 54 68 65 0a 2a 2a  s called. The.**
cb60: 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75   call to pager_u
cb70: 6e 6c 6f 63 6b 28 29 20 77 69 6c 6c 20 64 69 73  nlock() will dis
cb80: 63 61 72 64 20 61 6c 6c 20 69 6e 2d 6d 65 6d 6f  card all in-memo
cb90: 72 79 20 70 61 67 65 73 2c 20 75 6e 6c 6f 63 6b  ry pages, unlock
cba0: 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
cbb0: 20 66 69 6c 65 20 61 6e 64 20 63 6c 65 61 72 20   file and clear 
cbc0: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
cbd0: 20 49 66 20 74 68 69 73 20 6d 65 61 6e 73 20 74   If this means t
cbe0: 68 61 74 0a 2a 2a 20 74 68 65 72 65 20 69 73 20  hat.** there is 
cbf0: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 6c 65  a hot-journal le
cc00: 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73  ft in the file-s
cc10: 79 73 74 65 6d 2c 20 74 68 65 20 6e 65 78 74 20  ystem, the next 
cc20: 63 6f 6e 6e 65 63 74 69 6f 6e 0a 2a 2a 20 74 6f  connection.** to
cc30: 20 6f 62 74 61 69 6e 20 61 20 73 68 61 72 65 64   obtain a shared
cc40: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 70 61 67   lock on the pag
cc50: 65 72 20 28 77 68 69 63 68 20 6d 61 79 20 62 65  er (which may be
cc60: 20 74 68 69 73 20 6f 6e 65 29 20 77 69 6c 6c 0a   this one) will.
cc70: 2a 2a 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ** roll it back.
cc80: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
cc90: 67 65 72 20 68 61 73 20 6e 6f 74 20 61 6c 72 65  ger has not alre
cca0: 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65 20  ady entered the 
ccb0: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 62 75 74  error state, but
ccc0: 20 61 6e 20 49 4f 20 6f 72 0a 2a 2a 20 6d 61 6c   an IO or.** mal
ccd0: 6c 6f 63 20 65 72 72 6f 72 20 6f 63 63 75 72 73  loc error occurs
cce0: 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61   during a rollba
ccf0: 63 6b 2c 20 74 68 65 6e 20 74 68 69 73 20 77 69  ck, then this wi
cd00: 6c 6c 20 69 74 73 65 6c 66 20 63 61 75 73 65 20  ll itself cause 
cd10: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 74 6f  .** the pager to
cd20: 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
cd30: 20 73 74 61 74 65 2e 20 57 68 69 63 68 20 77 69   state. Which wi
cd40: 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 62 79  ll be cleared by
cd50: 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   the.** call to 
cd60: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 2c 20  pager_unlock(), 
cd70: 61 73 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  as described abo
cd80: 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ve..*/.static vo
cd90: 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e  id pagerUnlockAn
cda0: 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  dRollback(Pager 
cdb0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
cdc0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
cdd0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
cde0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
cdf0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
ce00: 20 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e 42     sqlite3BeginB
ce10: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ce20: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
ce30: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
ce40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 6e 64 42  .    sqlite3EndB
ce50: 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20  enignMalloc();. 
ce60: 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63   }.  pager_unloc
ce70: 6b 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a  k(pPager);.}../*
ce80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
ce90: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
cea0: 69 6f 6e 2e 20 41 20 74 72 61 6e 73 61 63 74 69  ion. A transacti
ceb0: 6f 6e 20 69 73 20 75 73 75 61 6c 6c 79 20 65 6e  on is usually en
cec0: 64 65 64 20 62 79 20 0a 2a 2a 20 65 69 74 68 65  ded by .** eithe
ced0: 72 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20  r a COMMIT or a 
cee0: 52 4f 4c 4c 42 41 43 4b 20 6f 70 65 72 61 74 69  ROLLBACK operati
cef0: 6f 6e 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65  on. This routine
cf00: 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 0a   may be called .
cf10: 2a 2a 20 61 66 74 65 72 20 72 6f 6c 6c 62 61 63  ** after rollbac
cf20: 6b 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  k of a hot-journ
cf30: 61 6c 2c 20 6f 72 20 69 66 20 61 6e 20 65 72 72  al, or if an err
cf40: 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
cf50: 6f 70 65 6e 69 6e 67 0a 2a 2a 20 74 68 65 20 6a  opening.** the j
cf60: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
cf70: 72 69 74 69 6e 67 20 74 68 65 20 76 65 72 79 20  riting the very 
cf80: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
cf90: 61 64 65 72 20 6f 66 20 61 0a 2a 2a 20 64 61 74  ader of a.** dat
cfa0: 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
cfb0: 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68 65  n..** .** If the
cfc0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
cfd0: 45 52 5f 53 48 41 52 45 44 20 6f 72 20 50 41 47  ER_SHARED or PAG
cfe0: 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
cff0: 77 68 65 6e 20 74 68 69 73 0a 2a 2a 20 72 6f 75  when this.** rou
d000: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
d010: 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 20 28 72  it is a no-op (r
d020: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
d030: 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69  )..**.** Otherwi
d040: 73 65 2c 20 61 6e 79 20 61 63 74 69 76 65 20 73  se, any active s
d050: 61 76 65 70 6f 69 6e 74 73 20 61 72 65 20 72 65  avepoints are re
d060: 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  leased..**.** If
d070: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
d080: 65 20 69 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20  e is open, then 
d090: 69 74 20 69 73 20 22 66 69 6e 61 6c 69 7a 65 64  it is "finalized
d0a0: 22 2e 20 4f 6e 63 65 20 61 20 6a 6f 75 72 6e 61  ". Once a journa
d0b0: 6c 20 0a 2a 2a 20 66 69 6c 65 20 68 61 73 20 62  l .** file has b
d0c0: 65 65 6e 20 66 69 6e 61 6c 69 7a 65 64 20 69 74  een finalized it
d0d0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
d0e0: 20 74 6f 20 75 73 65 20 69 74 20 74 6f 20 72 6f   to use it to ro
d0f0: 6c 6c 20 62 61 63 6b 20 61 20 0a 2a 2a 20 74 72  ll back a .** tr
d100: 61 6e 73 61 63 74 69 6f 6e 2e 20 4e 6f 72 20 77  ansaction. Nor w
d110: 69 6c 6c 20 69 74 20 62 65 20 63 6f 6e 73 69 64  ill it be consid
d120: 65 72 65 64 20 74 6f 20 62 65 20 61 20 68 6f 74  ered to be a hot
d130: 2d 6a 6f 75 72 6e 61 6c 20 62 79 20 74 68 69 73  -journal by this
d140: 0a 2a 2a 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  .** or any other
d150: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
d160: 74 69 6f 6e 2e 20 45 78 61 63 74 6c 79 20 68 6f  tion. Exactly ho
d170: 77 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66  w a journal is f
d180: 69 6e 61 6c 69 7a 65 64 0a 2a 2a 20 64 65 70 65  inalized.** depe
d190: 6e 64 73 20 6f 6e 20 77 68 65 74 68 65 72 20 6f  nds on whether o
d1a0: 72 20 6e 6f 74 20 74 68 65 20 70 61 67 65 72 20  r not the pager 
d1b0: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
d1c0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6e 64  clusive mode and
d1d0: 0a 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20  .** the current 
d1e0: 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 28 50 61  journal-mode (Pa
d1f0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
d200: 76 61 6c 75 65 29 2c 20 61 73 20 66 6f 6c 6c 6f  value), as follo
d210: 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  ws:.**.**   jour
d220: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 0a  nalMode==MEMORY.
d230: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
d240: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
d250: 73 20 73 69 6d 70 6c 79 20 63 6c 6f 73 65 64 2e  s simply closed.
d260: 20 54 68 69 73 20 64 65 73 74 72 6f 79 73 20 61   This destroys a
d270: 6e 20 0a 2a 2a 20 20 20 20 20 69 6e 2d 6d 65 6d  n .**     in-mem
d280: 6f 72 79 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ory journal..**.
d290: 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65  **   journalMode
d2a0: 3d 3d 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20  ==TRUNCATE.**   
d2b0: 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    Journal file i
d2c0: 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 7a  s truncated to z
d2d0: 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
d2e0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e  e..**.**   journ
d2f0: 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53 54 0a  alMode==PERSIST.
d300: 2a 2a 20 20 20 20 20 54 68 65 20 66 69 72 73 74  **     The first
d310: 20 32 38 20 62 79 74 65 73 20 6f 66 20 74 68 65   28 bytes of the
d320: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 72   journal file ar
d330: 65 20 7a 65 72 6f 65 64 2e 20 54 68 69 73 20 69  e zeroed. This i
d340: 6e 76 61 6c 69 64 61 74 65 73 0a 2a 2a 20 20 20  nvalidates.**   
d350: 20 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72    the first jour
d360: 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
d370: 65 20 66 69 6c 65 2c 20 61 6e 64 20 68 65 6e 63  e file, and henc
d380: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
d390: 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65  rnal.**     file
d3a0: 2e 20 41 6e 20 69 6e 76 61 6c 69 64 20 6a 6f 75  . An invalid jou
d3b0: 72 6e 61 6c 20 66 69 6c 65 20 63 61 6e 6e 6f 74  rnal file cannot
d3c0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
d3d0: 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61 6c  .**.**   journal
d3e0: 4d 6f 64 65 3d 3d 44 45 4c 45 54 45 0a 2a 2a 20  Mode==DELETE.** 
d3f0: 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
d400: 66 69 6c 65 20 69 73 20 63 6c 6f 73 65 64 20 61  file is closed a
d410: 6e 64 20 64 65 6c 65 74 65 64 20 75 73 69 6e 67  nd deleted using
d420: 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
d430: 28 29 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 49 66  ()..**.**     If
d440: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
d450: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
d460: 76 65 20 6d 6f 64 65 2c 20 74 68 69 73 20 6d 65  ve mode, this me
d470: 74 68 6f 64 20 6f 66 20 66 69 6e 61 6c 69 7a 69  thod of finalizi
d480: 6e 67 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f  ng.**     the jo
d490: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
d4a0: 76 65 72 20 75 73 65 64 2e 20 49 6e 73 74 65 61  ver used. Instea
d4b0: 64 2c 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61  d, if the journa
d4c0: 6c 4d 6f 64 65 20 69 73 0a 2a 2a 20 20 20 20 20  lMode is.**     
d4d0: 44 45 4c 45 54 45 20 61 6e 64 20 74 68 65 20 70  DELETE and the p
d4e0: 61 67 65 72 20 69 73 20 69 6e 20 65 78 63 6c 75  ager is in exclu
d4f0: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 20 6d  sive mode, the m
d500: 65 74 68 6f 64 20 64 65 73 63 72 69 62 65 64 20  ethod described 
d510: 75 6e 64 65 72 0a 2a 2a 20 20 20 20 20 6a 6f 75  under.**     jou
d520: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52 53 49 53  rnalMode==PERSIS
d530: 54 20 69 73 20 75 73 65 64 20 69 6e 73 74 65 61  T is used instea
d540: 64 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 74  d..**.** After t
d550: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 66 69  he journal is fi
d560: 6e 61 6c 69 7a 65 64 2c 20 69 66 20 72 75 6e 6e  nalized, if runn
d570: 69 6e 67 20 69 6e 20 6e 6f 6e 2d 65 78 63 6c 75  ing in non-exclu
d580: 73 69 76 65 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sive mode, the.*
d590: 2a 20 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f  * pager moves to
d5a0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
d5b0: 61 74 65 20 28 61 6e 64 20 64 6f 77 6e 67 72 61  ate (and downgra
d5c0: 64 65 73 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  des the lock on 
d5d0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
d5e0: 66 69 6c 65 20 61 63 63 6f 72 64 69 6e 67 6c 79  file accordingly
d5f0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
d600: 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67  pager is running
d610: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f   in exclusive mo
d620: 64 65 20 61 6e 64 20 69 73 20 69 6e 20 50 41 47  de and is in PAG
d630: 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65 2c  ER_SYNCED state,
d640: 0a 2a 2a 20 69 74 20 6d 6f 76 65 73 20 74 6f 20  .** it moves to 
d650: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 2e  PAGER_EXCLUSIVE.
d660: 20 4e 6f 20 6c 6f 63 6b 73 20 61 72 65 20 64 6f   No locks are do
d670: 77 6e 67 72 61 64 65 64 20 77 68 65 6e 20 72 75  wngraded when ru
d680: 6e 6e 69 6e 67 20 69 6e 0a 2a 2a 20 65 78 63 6c  nning in.** excl
d690: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a  usive mode..**.*
d6a0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
d6b0: 65 74 75 72 6e 65 64 20 69 66 20 6e 6f 20 65 72  eturned if no er
d6c0: 72 6f 72 20 6f 63 63 75 72 73 2e 20 49 66 20 61  ror occurs. If a
d6d0: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
d6e0: 75 72 69 6e 67 0a 2a 2a 20 61 6e 79 20 6f 66 20  uring.** any of 
d6f0: 74 68 65 20 49 4f 20 6f 70 65 72 61 74 69 6f 6e  the IO operation
d700: 73 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74 68  s to finalize th
d710: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
d720: 72 20 75 6e 6c 6f 63 6b 20 74 68 65 0a 2a 2a 20  r unlock the.** 
d730: 64 61 74 61 62 61 73 65 20 74 68 65 6e 20 74 68  database then th
d740: 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  e IO error code 
d750: 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  is returned to t
d760: 68 65 20 75 73 65 72 2e 20 49 66 20 74 68 65 20  he user. If the 
d770: 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 74 6f  .** operation to
d780: 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
d790: 75 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73  urnal file fails
d7a0: 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 64 65 20  , then the code 
d7b0: 73 74 69 6c 6c 0a 2a 2a 20 74 72 69 65 73 20 74  still.** tries t
d7c0: 6f 20 75 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  o unlock the dat
d7d0: 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 6e 6f  abase file if no
d7e0: 74 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  t in exclusive m
d7f0: 6f 64 65 2e 20 49 66 20 74 68 65 0a 2a 2a 20 75  ode. If the.** u
d800: 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e 20  nlock operation 
d810: 66 61 69 6c 73 20 61 73 20 77 65 6c 6c 2c 20 74  fails as well, t
d820: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 65 72  hen the first er
d830: 72 6f 72 20 63 6f 64 65 20 72 65 6c 61 74 65 64  ror code related
d840: 0a 2a 2a 20 74 6f 20 74 68 65 20 66 69 72 73 74  .** to the first
d850: 20 65 72 72 6f 72 20 65 6e 63 6f 75 6e 74 65 72   error encounter
d860: 65 64 20 28 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ed (the journal 
d870: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 6e 65  finalization one
d880: 29 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64  ) is.** returned
d890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d8a0: 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
d8b0: 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61  ction(Pager *pPa
d8c0: 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74  ger, int hasMast
d8d0: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
d8e0: 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
d8f0: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
d900: 6f 6d 20 6a 6f 75 72 6e 61 6c 20 66 69 6e 61 6c  om journal final
d910: 69 7a 61 74 69 6f 6e 20 6f 70 65 72 61 74 69 6f  ization operatio
d920: 6e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 20 3d  n */.  int rc2 =
d930: 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
d940: 2f 2a 20 45 72 72 6f 72 20 63 6f 64 65 20 66 72  /* Error code fr
d950: 6f 6d 20 64 62 20 66 69 6c 65 20 75 6e 6c 6f 63  om db file unloc
d960: 6b 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 0a  k operation */..
d970: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
d980: 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
d990: 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
d9a0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
d9b0: 20 20 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65    releaseAllSave
d9c0: 70 6f 69 6e 74 73 28 70 50 61 67 65 72 29 3b 0a  points(pPager);.
d9d0: 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65  .  assert( isOpe
d9e0: 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c  n(pPager->jfd) |
d9f0: 7c 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  | pPager->pInJou
da00: 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28  rnal==0 );.  if(
da10: 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
da20: 6a 66 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65  jfd) ){.    asse
da30: 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
da40: 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20 20  (pPager) );..   
da50: 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
da60: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a   journal file. *
da70: 2f 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  /.    if( sqlite
da80: 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50  3IsMemJournal(pP
da90: 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
daa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
dab0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
dac0: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
dad0: 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 20  DE_MEMORY );.   
dae0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
daf0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
db00: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
db10: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
db20: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
db30: 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 29 7b  MODE_TRUNCATE ){
db40: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
db50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
db60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
db70: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
db80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
db90: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
dba0: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
dbb0: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  jfd, 0);.      }
dbc0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
dbd0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
dbe0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
dbf0: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
dc00: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
dc10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
dc20: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
dc30: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
dc40: 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
dc50: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26  exclusiveMode &&
dc60: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
dc70: 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode!=PAGER_JOUR
dc80: 4e 41 4c 4d 4f 44 45 5f 57 41 4c 29 0a 20 20 20  NALMODE_WAL).   
dc90: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a   ){.      rc = z
dca0: 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eroJournalHdr(pP
dcb0: 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29  ager, hasMaster)
dcc0: 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
dcd0: 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
dce0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
dcf0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
dd00: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
dd10: 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
dd20: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
dd30: 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68    /* This branch
dd40: 20 6d 61 79 20 62 65 20 65 78 65 63 75 74 65 64   may be executed
dd50: 20 77 69 74 68 20 50 61 67 65 72 2e 6a 6f 75 72   with Pager.jour
dd60: 6e 61 6c 4d 6f 64 65 3d 3d 4d 45 4d 4f 52 59 20  nalMode==MEMORY 
dd70: 69 66 0a 20 20 20 20 20 20 2a 2a 20 61 20 68 6f  if.      ** a ho
dd80: 74 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6a 75  t-journal was ju
dd90: 73 74 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  st rolled back. 
dda0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
ddb0: 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
ddc0: 2a 20 66 69 6c 65 20 73 68 6f 75 6c 64 20 62 65  * file should be
ddd0: 20 63 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65   closed and dele
dde0: 74 65 64 2e 20 49 66 20 74 68 69 73 20 63 6f 6e  ted. If this con
ddf0: 6e 65 63 74 69 6f 6e 20 77 72 69 74 65 73 20 74  nection writes t
de00: 6f 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64  o.      ** the d
de10: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
de20: 20 77 69 6c 6c 20 64 6f 20 73 6f 20 75 73 69 6e   will do so usin
de30: 67 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  g an in-memory j
de40: 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 20 20 2a  ournal. .      *
de50: 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  /.      assert( 
de60: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
de70: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
de80: 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 0a 20  ALMODE_DELETE . 
de90: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 50 61            || pPa
dea0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
deb0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
dec0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 20  ODE_MEMORY .    
ded0: 20 20 20 20 20 20 20 7c 7c 20 70 50 61 67 65 72         || pPager
dee0: 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
def0: 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
df00: 5f 57 41 4c 20 0a 20 20 20 20 20 20 29 3b 0a 20  _WAL .      );. 
df10: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
df20: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
df30: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  ;.      if( !pPa
df40: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
df50: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
df60: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
df70: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
df80: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
df90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dfa0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
dfb0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 73  HECK_PAGES.    s
dfc0: 71 6c 69 74 65 33 50 63 61 63 68 65 49 74 65 72  qlite3PcacheIter
dfd0: 61 74 65 44 69 72 74 79 28 70 50 61 67 65 72 2d  ateDirty(pPager-
dfe0: 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65 72 5f  >pPCache, pager_
dff0: 73 65 74 5f 70 61 67 65 68 61 73 68 29 3b 0a 23  set_pagehash);.#
e000: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 73 71 6c 69  endif.  }.  sqli
e010: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
e020: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
e030: 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  nal);.  pPager->
e040: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
e050: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d    pPager->nRec =
e060: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61   0;.  sqlite3Pca
e070: 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67  cheCleanAll(pPag
e080: 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20  er->pPCache);.. 
e090: 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c   if( pagerUseWal
e0a0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
e0b0: 72 63 32 20 3d 20 73 71 6c 69 74 65 33 57 61 6c  rc2 = sqlite3Wal
e0c0: 45 6e 64 57 72 69 74 65 54 72 61 6e 73 61 63 74  EndWriteTransact
e0d0: 69 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ion(pPager->pWal
e0e0: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 72  );.    assert( r
e0f0: 63 32 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  c2==SQLITE_OK );
e100: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
e110: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
e120: 44 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  D;..    /* If th
e130: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 61 73  e connection was
e140: 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65   in locking_mode
e150: 3d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 20  =exclusive mode 
e160: 62 75 74 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72  but is no longer
e170: 2c 0a 20 20 20 20 2a 2a 20 64 72 6f 70 20 74 68  ,.    ** drop th
e180: 65 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  e EXCLUSIVE lock
e190: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
e1a0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
e1b0: 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
e1c0: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
e1d0: 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
e1e0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
e1f0: 67 65 72 2d 3e 70 57 61 6c 2c 20 30 29 20 29 7b  ger->pWal, 0) ){
e200: 0a 20 20 20 20 20 20 72 63 32 20 3d 20 6f 73 55  .      rc2 = osU
e210: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
e220: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
e230: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
e240: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
e250: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
e260: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
e270: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
e280: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
e290: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
e2a0: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70  ER_SHARED;.    p
e2b0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
e2c0: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 65  ntDone = 0;.  }e
e2d0: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
e2e0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
e2f0: 43 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65  CED ){.    pPage
e300: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
e310: 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
e320: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
e330: 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
e340: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
e350: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
e360: 69 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 2f 2a  ified = 0;..  /*
e370: 20 54 4f 44 4f 3a 20 49 73 20 74 68 69 73 20 6f   TODO: Is this o
e380: 70 74 69 6d 61 6c 3f 20 57 68 79 20 69 73 20 74  ptimal? Why is t
e390: 68 65 20 64 62 20 73 69 7a 65 20 69 6e 76 61 6c  he db size inval
e3a0: 69 64 61 74 65 64 20 68 65 72 65 20 0a 20 20 2a  idated here .  *
e3b0: 2a 20 77 68 65 6e 20 74 68 65 20 64 61 74 61 62  * when the datab
e3c0: 61 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  ase file is not 
e3d0: 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f 0a 20 20 70  unlocked? */.  p
e3e0: 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
e3f0: 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
e400: 50 63 61 63 68 65 54 72 75 6e 63 61 74 65 28 70  PcacheTruncate(p
e410: 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
e420: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b  pPager->dbSize);
e430: 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b  .  if( !MEMDB ){
e440: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
e450: 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20  izeValid = 0;.  
e460: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  }..  return (rc=
e470: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
e480: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72  c);.}../*.** Par
e490: 61 6d 65 74 65 72 20 61 44 61 74 61 20 6d 75 73  ameter aData mus
e4a0: 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66  t point to a buf
e4b0: 66 65 72 20 6f 66 20 70 50 61 67 65 72 2d 3e 70  fer of pPager->p
e4c0: 61 67 65 53 69 7a 65 20 62 79 74 65 73 0a 2a 2a  ageSize bytes.**
e4d0: 20 6f 66 20 64 61 74 61 2e 20 43 6f 6d 70 75 74   of data. Comput
e4e0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63  e and return a c
e4f0: 68 65 63 6b 73 75 6d 20 62 61 73 65 64 20 6f 6e  hecksum based on
e500: 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  t the contents o
e510: 66 20 74 68 65 20 0a 2a 2a 20 70 61 67 65 20 6f  f the .** page o
e520: 66 20 64 61 74 61 20 61 6e 64 20 74 68 65 20 63  f data and the c
e530: 75 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20  urrent value of 
e540: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
e550: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  t..**.** This is
e560: 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63   not a real chec
e570: 6b 73 75 6d 2e 20 49 74 20 69 73 20 72 65 61 6c  ksum. It is real
e580: 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20  ly just the sum 
e590: 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f  of the .** rando
e5a0: 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20  m initial value 
e5b0: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
e5c0: 69 74 29 20 61 6e 64 20 65 76 65 72 79 20 32 30  it) and every 20
e5d0: 30 74 68 20 62 79 74 65 0a 2a 2a 20 6f 66 20 74  0th byte.** of t
e5e0: 68 65 20 70 61 67 65 20 64 61 74 61 2c 20 73 74  he page data, st
e5f0: 61 72 74 69 6e 67 20 77 69 74 68 20 62 79 74 65  arting with byte
e600: 20 6f 66 66 73 65 74 20 28 70 50 61 67 65 72 2d   offset (pPager-
e610: 3e 70 61 67 65 53 69 7a 65 25 32 30 30 29 2e 0a  >pageSize%200)..
e620: 2a 2a 20 45 61 63 68 20 62 79 74 65 20 69 73 20  ** Each byte is 
e630: 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 61  interpreted as a
e640: 6e 20 38 2d 62 69 74 20 75 6e 73 69 67 6e 65 64  n 8-bit unsigned
e650: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
e660: 43 68 61 6e 67 69 6e 67 20 74 68 65 20 66 6f 72  Changing the for
e670: 6d 75 6c 61 20 75 73 65 64 20 74 6f 20 63 6f 6d  mula used to com
e680: 70 75 74 65 20 74 68 69 73 20 63 68 65 63 6b 73  pute this checks
e690: 75 6d 20 72 65 73 75 6c 74 73 20 69 6e 20 61 6e  um results in an
e6a0: 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74 69 62 6c 65  .** incompatible
e6b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
e6c0: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6a  rmat..**.** If j
e6d0: 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74 69 6f  ournal corruptio
e6e0: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
e6f0: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
e700: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
e710: 20 0a 2a 2a 20 73 63 65 6e 61 72 69 6f 20 69 73   .** scenario is
e720: 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
e730: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
e740: 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
e750: 20 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20 49 74   changed. .** It
e760: 20 69 73 20 6d 75 63 68 20 6c 65 73 73 20 6c 69   is much less li
e770: 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
e780: 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
e790: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
e7a0: 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
e7b0: 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
e7c0: 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
e7d0: 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
e7e0: 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
e7f0: 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
e800: 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
e810: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
e820: 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
e830: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  n..*/.static u32
e840: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67   pager_cksum(Pag
e850: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
e860: 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20 20  t u8 *aData){.  
e870: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
e880: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 20 20  er->cksumInit;  
e890: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
e8a0: 75 6d 20 76 61 6c 75 65 20 74 6f 20 72 65 74 75  um value to retu
e8b0: 72 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 20 3d 20  rn */.  int i = 
e8c0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e8d0: 2d 32 30 30 3b 20 20 20 20 20 20 20 20 20 20 2f  -200;          /
e8e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
e8f0: 2f 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  /.  while( i>0 )
e900: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
e910: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
e920: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
e930: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
e940: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
e950: 65 20 70 61 67 65 20 66 72 6f 6d 20 65 69 74 68  e page from eith
e960: 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  er the journal f
e970: 69 6c 65 20 28 69 66 20 69 73 4d 61 69 6e 4a 72  ile (if isMainJr
e980: 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a 20 66 72 6f  nl==1) or.** fro
e990: 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  m the sub-journa
e9a0: 6c 20 28 69 66 20 69 73 4d 61 69 6e 4a 72 6e 6c  l (if isMainJrnl
e9b0: 3d 3d 30 29 20 61 6e 64 20 70 6c 61 79 62 61 63  ==0) and playbac
e9c0: 6b 20 74 68 61 74 20 70 61 67 65 2e 0a 2a 2a 20  k that page..** 
e9d0: 54 68 65 20 70 61 67 65 20 62 65 67 69 6e 73 20  The page begins 
e9e0: 61 74 20 6f 66 66 73 65 74 20 2a 70 4f 66 66 73  at offset *pOffs
e9f0: 65 74 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  et into the file
ea00: 2e 20 54 68 65 20 2a 70 4f 66 66 73 65 74 0a 2a  . The *pOffset.*
ea10: 2a 20 76 61 6c 75 65 20 69 73 20 69 6e 63 72 65  * value is incre
ea20: 61 73 65 64 20 74 6f 20 74 68 65 20 73 74 61 72  ased to the star
ea30: 74 20 6f 66 20 74 68 65 20 6e 65 78 74 20 70 61  t of the next pa
ea40: 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ge in the journa
ea50: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 4d  l..**.** The isM
ea60: 61 69 6e 4a 72 6e 6c 20 66 6c 61 67 20 69 73 20  ainJrnl flag is 
ea70: 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20  true if this is 
ea80: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
ea90: 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 0a 2a 2a  k journal and.**
eaa0: 20 66 61 6c 73 65 20 66 6f 72 20 74 68 65 20 73   false for the s
eab0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
eac0: 2e 20 20 54 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  .  The main roll
ead0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 75 73 65  back journal use
eae0: 73 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 73 20 2d  s.** checksums -
eaf0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
eb00: 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 2e  ournal does not.
eb10: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
eb20: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68 65  ge number of the
eb30: 20 70 61 67 65 20 72 65 63 6f 72 64 20 72 65 61   page record rea
eb40: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
eb50: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
eb60: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
eb70: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
eb80: 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69  ue of Pager.dbSi
eb90: 7a 65 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63  ze, then playbac
eba0: 6b 20 69 73 0a 2a 2a 20 73 6b 69 70 70 65 64 20  k is.** skipped 
ebb0: 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  and SQLITE_OK is
ebc0: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
ebd0: 20 49 66 20 70 44 6f 6e 65 20 69 73 20 6e 6f 74   If pDone is not
ebe0: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 69 74 20 69   NULL, then it i
ebf0: 73 20 61 20 72 65 63 6f 72 64 20 6f 66 20 70 61  s a record of pa
ec00: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 61 6c  ges that have al
ec10: 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 70 6c  ready.** been pl
ec20: 61 79 65 64 20 62 61 63 6b 2e 20 20 49 66 20 74  ayed back.  If t
ec30: 68 65 20 70 61 67 65 20 61 74 20 2a 70 4f 66 66  he page at *pOff
ec40: 73 65 74 20 68 61 73 20 61 6c 72 65 61 64 79 20  set has already 
ec50: 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b  been played back
ec60: 0a 2a 2a 20 28 69 66 20 74 68 65 20 63 6f 72 72  .** (if the corr
ec70: 65 73 70 6f 6e 64 69 6e 67 20 70 44 6f 6e 65 20  esponding pDone 
ec80: 62 69 74 20 69 73 20 73 65 74 29 20 74 68 65 6e  bit is set) then
ec90: 20 73 6b 69 70 20 74 68 65 20 70 6c 61 79 62 61   skip the playba
eca0: 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ck..** Make sure
ecb0: 20 74 68 65 20 70 44 6f 6e 65 20 62 69 74 20 63   the pDone bit c
ecc0: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20  orresponding to 
ecd0: 74 68 65 20 2a 70 4f 66 66 73 65 74 20 70 61 67  the *pOffset pag
ece0: 65 20 69 73 20 73 65 74 0a 2a 2a 20 70 72 69 6f  e is set.** prio
ecf0: 72 20 74 6f 20 72 65 74 75 72 6e 69 6e 67 2e 0a  r to returning..
ed00: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
ed10: 65 20 72 65 63 6f 72 64 20 69 73 20 73 75 63 63  e record is succ
ed20: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
ed30: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
ed40: 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 61 6e 64  rnal file.** and
ed50: 20 70 6c 61 79 65 64 20 62 61 63 6b 2c 20 74 68   played back, th
ed60: 65 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  en SQLITE_OK is 
ed70: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
ed80: 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 0a  IO error occurs.
ed90: 2a 2a 20 77 68 69 6c 65 20 72 65 61 64 69 6e 67  ** while reading
eda0: 20 74 68 65 20 72 65 63 6f 72 64 20 66 72 6f 6d   the record from
edb0: 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e   the (sub-)journ
edc0: 61 6c 20 66 69 6c 65 20 6f 72 20 77 68 69 6c 65  al file or while
edd0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 6f 20 74   writing.** to t
ede0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
edf0: 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72  , then the IO er
ee00: 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
ee10: 72 6e 65 64 2e 20 49 66 20 64 61 74 61 0a 2a 2a  rned. If data.**
ee20: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
ee30: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
ee40: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
ee50: 65 20 62 75 74 20 61 70 70 65 61 72 73 20 74 6f  e but appears to
ee60: 20 62 65 0a 2a 2a 20 63 6f 72 72 75 70 74 65 64   be.** corrupted
ee70: 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73  , SQLITE_DONE is
ee80: 20 72 65 74 75 72 6e 65 64 2e 20 44 61 74 61 20   returned. Data 
ee90: 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 63 6f  is considered co
eea0: 72 72 75 70 74 65 64 20 69 6e 0a 2a 2a 20 74 77  rrupted in.** tw
eeb0: 6f 20 63 69 72 63 75 6d 73 74 61 6e 63 65 73 3a  o circumstances:
eec0: 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20 49 66 20 74  .** .**   * If t
eed0: 68 65 20 72 65 63 6f 72 64 20 70 61 67 65 2d 6e  he record page-n
eee0: 75 6d 62 65 72 20 69 73 20 69 6c 6c 65 67 61 6c  umber is illegal
eef0: 20 28 30 20 6f 72 20 50 41 47 45 52 5f 4d 4a 5f   (0 or PAGER_MJ_
ef00: 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a 20 20 20 2a  PGNO), or.**   *
ef10: 20 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 69   If the record i
ef20: 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62  s being rolled b
ef30: 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
ef40: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a  n journal file.*
ef50: 2a 20 20 20 20 20 61 6e 64 20 74 68 65 20 63 68  *     and the ch
ef60: 65 63 6b 73 75 6d 20 66 69 65 6c 64 20 64 6f 65  ecksum field doe
ef70: 73 20 6e 6f 74 20 6d 61 74 63 68 20 74 68 65 20  s not match the 
ef80: 72 65 63 6f 72 64 20 63 6f 6e 74 65 6e 74 2e 0a  record content..
ef90: 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65 72 20 6f 66  **.** Neither of
efa0: 20 74 68 65 73 65 20 74 77 6f 20 73 63 65 6e 61   these two scena
efb0: 72 69 6f 73 20 61 72 65 20 70 6f 73 73 69 62 6c  rios are possibl
efc0: 65 20 64 75 72 69 6e 67 20 61 20 73 61 76 65 70  e during a savep
efd0: 6f 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  oint rollback..*
efe0: 2a 0a 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20  *.** If this is 
eff0: 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c  a savepoint roll
f000: 62 61 63 6b 2c 20 74 68 65 6e 20 6d 65 6d 6f 72  back, then memor
f010: 79 20 6d 61 79 20 68 61 76 65 20 74 6f 20 62 65  y may have to be
f020: 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20   dynamically.** 
f030: 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 68 69  allocated by thi
f040: 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 20 74  s function. If t
f050: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 20  his is the case 
f060: 61 6e 64 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f  and an allocatio
f070: 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 53 51 4c 49  n fails,.** SQLI
f080: 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75  TE_NOMEM is retu
f090: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
f0a0: 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61  int pager_playba
f0b0: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50  ck_one_page(.  P
f0c0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20  ager *pPager,   
f0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f0e0: 54 68 65 20 70 61 67 65 72 20 62 65 69 6e 67 20  The pager being 
f0f0: 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20  played back */. 
f100: 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
f110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f120: 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
f130: 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
f140: 2f 0a 20 20 42 69 74 76 65 63 20 2a 70 44 6f 6e  /.  Bitvec *pDon
f150: 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
f160: 20 20 2f 2a 20 42 69 74 76 65 63 20 6f 66 20 70    /* Bitvec of p
f170: 61 67 65 73 20 61 6c 72 65 61 64 79 20 70 6c 61  ages already pla
f180: 79 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 6e  yed back */.  in
f190: 74 20 69 73 4d 61 69 6e 4a 72 6e 6c 2c 20 20 20  t isMainJrnl,   
f1a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 31              /* 1
f1b0: 20 2d 3e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c   -> main journal
f1c0: 2e 20 30 20 2d 3e 20 73 75 62 2d 6a 6f 75 72 6e  . 0 -> sub-journ
f1d0: 61 6c 2e 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53  al. */.  int isS
f1e0: 61 76 65 70 6e 74 20 20 20 20 20 20 20 20 20 20  avepnt          
f1f0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66         /* True f
f200: 6f 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72  or a savepoint r
f210: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 29 7b 0a 20 20  ollback */.){.  
f220: 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
f230: 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20 20  *pPg;           
f240: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 78          /* An ex
f250: 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20 74  isting page in t
f260: 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67  he cache */.  Pg
f270: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
f280: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f290: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f  he page number o
f2a0: 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75 72  f a page in jour
f2b0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
f2c0: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
f2d0: 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 73         /* Checks
f2e0: 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e 69  um used for sani
f2f0: 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20  ty checking */. 
f300: 20 63 68 61 72 20 2a 61 44 61 74 61 3b 20 20 20   char *aData;   
f310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
f320: 2a 20 54 65 6d 70 6f 72 61 72 79 20 73 74 6f 72  * Temporary stor
f330: 61 67 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  age for the page
f340: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
f350: 6c 65 20 2a 6a 66 64 3b 20 20 20 20 20 20 20 20  le *jfd;        
f360: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
f370: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
f380: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
f390: 2a 2f 0a 20 20 69 6e 74 20 69 73 53 79 6e 63 65  */.  int isSynce
f3a0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
f3b0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6a 6f     /* True if jo
f3c0: 75 72 6e 61 6c 20 70 61 67 65 20 69 73 20 73 79  urnal page is sy
f3d0: 6e 63 65 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nced */..  asser
f3e0: 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
f3f0: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
f400: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
f410: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
f420: 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
f430: 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
f440: 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
f450: 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
f460: 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
f470: 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
f480: 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
f490: 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
f4a0: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
f4b0: 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
f4c0: 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
f4d0: 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
f4e0: 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
f4f0: 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 70 50 61  /..  aData = pPa
f500: 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
f510: 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61 20    assert( aData 
f520: 29 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 65  );         /* Te
f530: 6d 70 20 73 74 6f 72 61 67 65 20 6d 75 73 74 20  mp storage must 
f540: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
f550: 6e 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20  n allocated */. 
f560: 20 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73   assert( pagerUs
f570: 65 57 61 6c 28 70 50 61 67 65 72 29 3d 3d 30 20  eWal(pPager)==0 
f580: 7c 7c 20 28 21 69 73 4d 61 69 6e 4a 72 6e 6c 20  || (!isMainJrnl 
f590: 26 26 20 69 73 53 61 76 65 70 6e 74 29 20 29 3b  && isSavepnt) );
f5a0: 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20  ..  /* Read the 
f5b0: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
f5c0: 70 61 67 65 20 64 61 74 61 20 66 72 6f 6d 20 74  page data from t
f5d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75  he journal or su
f5e0: 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  b-journal.  ** f
f5f0: 69 6c 65 2e 20 52 65 74 75 72 6e 20 61 6e 20 65  ile. Return an e
f600: 72 72 6f 72 20 63 6f 64 65 20 74 6f 20 74 68 65  rror code to the
f610: 20 63 61 6c 6c 65 72 20 69 66 20 61 6e 20 49 4f   caller if an IO
f620: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 20   error occurs.. 
f630: 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69 73 4d 61   */.  jfd = isMa
f640: 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67 65 72 2d  inJrnl ? pPager-
f650: 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
f660: 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  jfd;.  rc = read
f670: 33 32 62 69 74 73 28 6a 66 64 2c 20 2a 70 4f 66  32bits(jfd, *pOf
f680: 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20  fset, &pgno);.  
f690: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f6a0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
f6b0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
f6c0: 65 61 64 28 6a 66 64 2c 20 28 75 38 2a 29 61 44  ead(jfd, (u8*)aD
f6d0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
f6e0: 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74  eSize, (*pOffset
f6f0: 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  )+4);.  if( rc!=
f700: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
f710: 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65  rn rc;.  *pOffse
f720: 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  t += pPager->pag
f730: 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61  eSize + 4 + isMa
f740: 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20  inJrnl*4;..  /* 
f750: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
f760: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
f770: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
f780: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
f790: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
f7a0: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
f7b0: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
f7c0: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
f7d0: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
f7e0: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
f7f0: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
f800: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
f810: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
f820: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
f830: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
f840: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
f850: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
f860: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
f870: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
f880: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
f890: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
f8a0: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61  pPager) ){.    a
f8b0: 73 73 65 72 74 28 20 21 69 73 53 61 76 65 70 6e  ssert( !isSavepn
f8c0: 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  t );.    return 
f8d0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
f8e0: 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e  .  if( pgno>(Pgn
f8f0: 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  o)pPager->dbSize
f900: 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65   || sqlite3Bitve
f910: 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e  cTest(pDone, pgn
f920: 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  o) ){.    return
f930: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
f940: 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c    if( isMainJrnl
f950: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61   ){.    rc = rea
f960: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70  d32bits(jfd, (*p
f970: 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75  Offset)-4, &cksu
f980: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
f990: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
f9a0: 69 66 28 20 21 69 73 53 61 76 65 70 6e 74 20 26  if( !isSavepnt &
f9b0: 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50  & pager_cksum(pP
f9c0: 61 67 65 72 2c 20 28 75 38 2a 29 61 44 61 74 61  ager, (u8*)aData
f9d0: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
f9e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f9f0: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
fa00: 0a 20 20 69 66 28 20 70 44 6f 6e 65 20 26 26 20  .  if( pDone && 
fa10: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74  (rc = sqlite3Bit
fa20: 76 65 63 53 65 74 28 70 44 6f 6e 65 2c 20 70 67  vecSet(pDone, pg
fa30: 6e 6f 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  no))!=SQLITE_OK 
fa40: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
fa50: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
fa60: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
fa70: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c  PAGER_RESERVED |
fa80: 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  | pPager->state>
fa90: 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
faa0: 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
fab0: 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53   pager is in RES
fac0: 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
fad0: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
fae0: 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20  a copy of this. 
faf0: 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20   ** page in the 
fb00: 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20  pager cache. In 
fb10: 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75  this case just u
fb20: 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20  pdate the pager 
fb30: 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20  cache,.  ** not 
fb40: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
fb50: 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c  e. The page is l
fb60: 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79  eft marked dirty
fb70: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20   in this case.. 
fb80: 20 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65   **.  ** An exce
fb90: 70 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f  ption to the abo
fba0: 76 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20  ve rule: If the 
fbb0: 64 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e  database is in n
fbc0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a  o-sync mode.  **
fbd0: 20 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d   and a page is m
fbe0: 6f 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69  oved during an i
fbf0: 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75  ncremental vacuu
fc00: 6d 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  m then the page 
fc10: 6d 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20  may.  ** not be 
fc20: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
fc30: 68 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20  he. Later: if a 
fc40: 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65  malloc() or IO e
fc50: 72 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a  rror occurs.  **
fc60: 20 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61   during a Movepa
fc70: 67 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20  ge() call, then 
fc80: 74 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74  the page may not
fc90: 20 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65   be in the cache
fca0: 0a 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f  .  ** either. So
fcb0: 20 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64   the condition d
fcc0: 65 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20  escribed in the 
fcd0: 61 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20  above paragraph 
fce0: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65  is not.  ** asse
fcf0: 72 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  rt()able..  **. 
fd00: 20 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53   ** If in EXCLUS
fd10: 49 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20  IVE state, then 
fd20: 77 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61  we update the pa
fd30: 67 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20  ger cache if it 
fd40: 65 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20  exists.  ** and 
fd50: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54  the main file. T
fd60: 68 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20  he page is then 
fd70: 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79  marked not dirty
fd80: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b  ..  **.  ** Tick
fd90: 65 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73  et #1171:  The s
fda0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
fdb0: 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70   might contain p
fdc0: 61 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74  age content that
fdd0: 20 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65   is.  ** differe
fde0: 6e 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  nt from the page
fdf0: 20 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20   content at the 
fe00: 73 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61  start of the tra
fe10: 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54  nsaction..  ** T
fe20: 68 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20  his occurs when 
fe30: 61 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65  a page is change
fe40: 64 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73  d prior to the s
fe50: 74 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d  tart of a statem
fe60: 65 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68  ent.  ** then ch
fe70: 61 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68  anged again with
fe80: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
fe90: 2e 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20  .  When rolling 
fea0: 62 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a  back such a.  **
feb0: 20 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75   statement we mu
fec0: 73 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  st not write to 
fed0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
fee0: 61 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20  abase unless we 
fef0: 6b 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65  know.  ** for ce
ff00: 72 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69  rtain that origi
ff10: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
ff20: 73 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74  s are synced int
ff30: 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  o the main rollb
ff40: 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
ff50: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20  .  Otherwise, a 
ff60: 70 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74  power loss might
ff70: 20 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20   leave modified 
ff80: 64 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a  data in the.  **
ff90: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
ffa0: 69 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20  ithout an entry 
ffb0: 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  in the rollback 
ffc0: 6a 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e  journal that can
ffd0: 0a 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68  .  ** restore th
ffe0: 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74  e database to it
fff0: 73 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e  s original form.
10000 20 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73    Two conditions
10010 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65   must be.  ** me
10020 74 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  t before writing
10030 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
10040 20 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20   files. (1) the 
10050 64 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65  database must be
10060 0a 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28  .  ** locked.  (
10070 32 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  2) we know that 
10080 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
10090 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c  e content is ful
100a0 6c 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69  ly synced.  ** i
100b0 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  n the main journ
100c0 61 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73  al either becaus
100d0 65 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  e the page is no
100e0 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c  t in cache or el
100f0 73 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65  se.  ** the page
10100 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65   is marked as ne
10110 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a  edSync==0..  **.
10120 20 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a    ** 2008-04-14:
10130 20 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e    When attemptin
10140 67 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f  g to vacuum a co
10150 72 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66  rrupt database f
10160 69 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20  ile, it.  ** is 
10170 70 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c  possible to fail
10180 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20   a statement on 
10190 61 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20  a database that 
101a0 64 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69  does not yet exi
101b0 73 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20  st..  ** Do not 
101c0 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65  attempt to write
101d0 20 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c   if database fil
101e0 65 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e  e has never been
101f0 20 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20   opened..  */.  
10200 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
10210 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 70  pPager) ){.    p
10220 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
10230 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
10240 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
10250 70 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 61 73 73  pgno);.  }.  ass
10260 65 72 74 28 20 70 50 67 20 7c 7c 20 21 4d 45 4d  ert( pPg || !MEM
10270 44 42 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  DB );.  PAGERTRA
10280 43 45 28 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE(("PLAYBACK %d
10290 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
102a0 38 78 29 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  8x) %s\n",.     
102b0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
102c0 61 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67  ager), pgno, pag
102d0 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61 67  er_datahash(pPag
102e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75  er->pageSize, (u
102f0 38 2a 29 61 44 61 74 61 29 2c 0a 20 20 20 20 20  8*)aData),.     
10300 20 20 20 20 20 20 28 69 73 4d 61 69 6e 4a 72 6e        (isMainJrn
10310 6c 3f 22 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 22  l?"main-journal"
10320 3a 22 73 75 62 2d 6a 6f 75 72 6e 61 6c 22 29 0a  :"sub-journal").
10330 20 20 29 29 3b 0a 20 20 69 66 28 20 69 73 4d 61    ));.  if( isMa
10340 69 6e 4a 72 6e 6c 20 29 7b 0a 20 20 20 20 69 73  inJrnl ){.    is
10350 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
10360 3e 6e 6f 53 79 6e 63 20 7c 7c 20 28 2a 70 4f 66  >noSync || (*pOf
10370 66 73 65 74 20 3c 3d 20 70 50 61 67 65 72 2d 3e  fset <= pPager->
10380 6a 6f 75 72 6e 61 6c 48 64 72 29 3b 0a 20 20 7d  journalHdr);.  }
10390 65 6c 73 65 7b 0a 20 20 20 20 69 73 53 79 6e 63  else{.    isSync
103a0 65 64 20 3d 20 28 70 50 67 3d 3d 30 20 7c 7c 20  ed = (pPg==0 || 
103b0 30 3d 3d 28 70 50 67 2d 3e 66 6c 61 67 73 20 26  0==(pPg->flags &
103c0 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
103d0 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 28 70  ));.  }.  if( (p
103e0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
103f0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 29 0a 20  GER_EXCLUSIVE). 
10400 20 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67    && isOpen(pPag
10410 65 72 2d 3e 66 64 29 0a 20 20 20 26 26 20 69 73  er->fd).   && is
10420 53 79 6e 63 65 64 0a 20 20 29 7b 0a 20 20 20 20  Synced.  ){.    
10430 69 36 34 20 6f 66 73 74 20 3d 20 28 70 67 6e 6f  i64 ofst = (pgno
10440 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
10450 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 74  >pageSize;.    t
10460 65 73 74 63 61 73 65 28 20 21 69 73 53 61 76 65  estcase( !isSave
10470 70 6e 74 20 26 26 20 70 50 67 21 3d 30 20 26 26  pnt && pPg!=0 &&
10480 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
10490 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 21 3d 30  DR_NEED_SYNC)!=0
104a0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
104b0 21 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61  !pagerUseWal(pPa
104c0 67 65 72 29 20 29 3b 0a 20 20 20 20 72 63 20 3d  ger) );.    rc =
104d0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
104e0 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 75 38 2a  pPager->fd, (u8*
104f0 29 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e  )aData, pPager->
10500 70 61 67 65 53 69 7a 65 2c 20 6f 66 73 74 29 3b  pageSize, ofst);
10510 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50  .    if( pgno>pP
10520 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
10530 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10540 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70  ->dbFileSize = p
10550 67 6e 6f 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  gno;.    }.    i
10560 66 28 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  f( pPager->pBack
10570 75 70 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  up ){.      CODE
10580 43 31 28 70 50 61 67 65 72 2c 20 61 44 61 74 61  C1(pPager, aData
10590 2c 20 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51  , pgno, 3, rc=SQ
105a0 4c 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20  LITE_NOMEM);.   
105b0 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70     sqlite3Backup
105c0 55 70 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70  Update(pPager->p
105d0 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c 20 28 75  Backup, pgno, (u
105e0 38 2a 29 61 44 61 74 61 29 3b 0a 20 20 20 20 20  8*)aData);.     
105f0 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20   CODEC2(pPager, 
10600 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 37 2c 20  aData, pgno, 7, 
10610 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c  rc=SQLITE_NOMEM,
10620 20 61 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20   aData);.    }. 
10630 20 7d 65 6c 73 65 20 69 66 28 20 21 69 73 4d 61   }else if( !isMa
10640 69 6e 4a 72 6e 6c 20 26 26 20 70 50 67 3d 3d 30  inJrnl && pPg==0
10650 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
10660 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
10670 20 6f 66 20 61 20 73 61 76 65 70 6f 69 6e 74 20   of a savepoint 
10680 61 6e 64 20 64 61 74 61 20 77 61 73 20 6e 6f 74  and data was not
10690 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
106a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
106b0 61 6e 64 20 74 68 65 20 70 61 67 65 20 69 73 20  and the page is 
106c0 6e 6f 74 20 69 6e 2d 6d 65 6d 6f 72 79 2c 20 74  not in-memory, t
106d0 68 65 72 65 20 69 73 20 61 20 70 6f 74 65 6e 74  here is a potent
106e0 69 61 6c 0a 20 20 20 20 2a 2a 20 70 72 6f 62 6c  ial.    ** probl
106f0 65 6d 2e 20 57 68 65 6e 20 74 68 65 20 70 61 67  em. When the pag
10700 65 20 69 73 20 6e 65 78 74 20 66 65 74 63 68 65  e is next fetche
10710 64 20 62 79 20 74 68 65 20 62 2d 74 72 65 65 20  d by the b-tree 
10720 6c 61 79 65 72 2c 20 69 74 20 0a 20 20 20 20 2a  layer, it .    *
10730 2a 20 77 69 6c 6c 20 62 65 20 72 65 61 64 20 66  * will be read f
10740 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
10750 20 66 69 6c 65 2c 20 77 68 69 63 68 20 6d 61 79   file, which may
10760 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62 65 20 0a   or may not be .
10770 20 20 20 20 2a 2a 20 63 75 72 72 65 6e 74 2e 20      ** current. 
10780 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
10790 68 65 72 65 20 61 72 65 20 61 20 63 6f 75 70 6c  here are a coupl
107a0 65 20 6f 66 20 64 69 66 66 65 72 65 6e 74 20 77  e of different w
107b0 61 79 73 20 74 68 69 73 20 63 61 6e 20 68 61 70  ays this can hap
107c0 70 65 6e 2e 20 41 6c 6c 20 61 72 65 20 71 75 69  pen. All are qui
107d0 74 65 0a 20 20 20 20 2a 2a 20 6f 62 73 63 75 72  te.    ** obscur
107e0 65 2e 20 57 68 65 6e 20 72 75 6e 6e 69 6e 67 20  e. When running 
107f0 69 6e 20 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d  in synchronous m
10800 6f 64 65 2c 20 74 68 69 73 20 63 61 6e 20 6f 6e  ode, this can on
10810 6c 79 20 68 61 70 70 65 6e 20 0a 20 20 20 20 2a  ly happen .    *
10820 2a 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  * if the page is
10830 20 6f 6e 20 74 68 65 20 66 72 65 65 2d 6c 69 73   on the free-lis
10840 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
10850 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
10860 6e 2c 20 74 68 65 6e 0a 20 20 20 20 2a 2a 20 70  n, then.    ** p
10870 6f 70 75 6c 61 74 65 64 2c 20 74 68 65 6e 20 6d  opulated, then m
10880 6f 76 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  oved using sqlit
10890 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
108a0 29 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  )..    **.    **
108b0 20 54 68 65 20 73 6f 6c 75 74 69 6f 6e 20 69 73   The solution is
108c0 20 74 6f 20 61 64 64 20 61 6e 20 69 6e 2d 6d 65   to add an in-me
108d0 6d 6f 72 79 20 70 61 67 65 20 74 6f 20 74 68 65  mory page to the
108e0 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 69 6e   cache containin
108f0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  g.    ** the dat
10900 61 20 6a 75 73 74 20 72 65 61 64 20 66 72 6f 6d  a just read from
10910 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
10920 2e 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  . Mark the page 
10930 61 73 20 64 69 72 74 79 20 0a 20 20 20 20 2a 2a  as dirty .    **
10940 20 61 6e 64 20 69 66 20 74 68 65 20 70 61 67 65   and if the page
10950 72 20 72 65 71 75 69 72 65 73 20 61 20 6a 6f 75  r requires a jou
10960 72 6e 61 6c 2d 73 79 6e 63 2c 20 74 68 65 6e 20  rnal-sync, then 
10970 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  mark the page as
10980 20 0a 20 20 20 20 2a 2a 20 72 65 71 75 69 72 69   .    ** requiri
10990 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 2d 73 79 6e  ng a journal-syn
109a0 63 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  c before it is w
109b0 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ritten..    */. 
109c0 20 20 20 61 73 73 65 72 74 28 20 69 73 53 61 76     assert( isSav
109d0 65 70 6e 74 20 29 3b 0a 20 20 20 20 69 66 28 20  epnt );.    if( 
109e0 28 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67  (rc = sqlite3Pag
109f0 65 72 41 63 71 75 69 72 65 28 70 50 61 67 65 72  erAcquire(pPager
10a00 2c 20 70 67 6e 6f 2c 20 26 70 50 67 2c 20 31 29  , pgno, &pPg, 1)
10a10 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
10a20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
10a30 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
10a40 66 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f  flags &= ~PGHDR_
10a50 4e 45 45 44 5f 52 45 41 44 3b 0a 20 20 20 20 73  NEED_READ;.    s
10a60 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65  qlite3PcacheMake
10a70 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 7d 0a  Dirty(pPg);.  }.
10a80 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
10a90 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
10aa0 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
10ab0 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
10ac0 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
10ad0 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
10ae0 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
10af0 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
10b00 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
10b10 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
10b20 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
10b30 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
10b40 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
10b50 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
10b60 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
10b70 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
10b80 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
10b90 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
10ba0 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
10bb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
10bc0 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
10bd0 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
10be0 0a 20 20 20 20 70 44 61 74 61 20 3d 20 70 50 67  .    pData = pPg
10bf0 2d 3e 70 44 61 74 61 3b 0a 20 20 20 20 6d 65 6d  ->pData;.    mem
10c00 63 70 79 28 70 44 61 74 61 2c 20 28 75 38 2a 29  cpy(pData, (u8*)
10c10 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
10c20 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 70 50  ageSize);.    pP
10c30 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28  ager->xReiniter(
10c40 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 69 73  pPg);.    if( is
10c50 4d 61 69 6e 4a 72 6e 6c 20 26 26 20 28 21 69 73  MainJrnl && (!is
10c60 53 61 76 65 70 6e 74 20 7c 7c 20 2a 70 4f 66 66  Savepnt || *pOff
10c70 73 65 74 3c 3d 70 50 61 67 65 72 2d 3e 6a 6f 75  set<=pPager->jou
10c80 72 6e 61 6c 48 64 72 29 20 29 7b 0a 20 20 20 20  rnalHdr) ){.    
10c90 20 20 2f 2a 20 49 66 20 74 68 65 20 63 6f 6e 74    /* If the cont
10ca0 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67  ents of this pag
10cb0 65 20 77 65 72 65 20 6a 75 73 74 20 72 65 73 74  e were just rest
10cc0 6f 72 65 64 20 66 72 6f 6d 20 74 68 65 20 6d 61  ored from the ma
10cd0 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  in .      ** jou
10ce0 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20  rnal file, then 
10cf0 69 74 73 20 63 6f 6e 74 65 6e 74 20 6d 75 73 74  its content must
10d00 20 62 65 20 61 73 20 74 68 65 79 20 77 65 72 65   be as they were
10d10 20 77 68 65 6e 20 74 68 65 20 0a 20 20 20 20 20   when the .     
10d20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
10d30 77 61 73 20 66 69 72 73 74 20 6f 70 65 6e 65 64  was first opened
10d40 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  . In this case w
10d50 65 20 63 61 6e 20 6d 61 72 6b 20 74 68 65 20 70  e can mark the p
10d60 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 61 73 20  age.      ** as 
10d70 63 6c 65 61 6e 2c 20 73 69 6e 63 65 20 74 68 65  clean, since the
10d80 72 65 20 77 69 6c 6c 20 62 65 20 6e 6f 20 6e 65  re will be no ne
10d90 65 64 20 74 6f 20 77 72 69 74 65 20 69 74 20 6f  ed to write it o
10da0 75 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ut to the.      
10db0 2a 2a 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  ** database..   
10dc0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
10dd0 68 65 72 65 20 69 73 20 6f 6e 65 20 65 78 63 65  here is one exce
10de0 70 74 69 6f 6e 20 74 6f 20 74 68 69 73 20 72 75  ption to this ru
10df0 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  le. If the page 
10e00 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 0a  is being rolled.
10e10 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 20 61 73        ** back as
10e20 20 70 61 72 74 20 6f 66 20 61 20 73 61 76 65 70   part of a savep
10e30 6f 69 6e 74 20 28 6f 72 20 73 74 61 74 65 6d 65  oint (or stateme
10e40 6e 74 29 20 72 6f 6c 6c 62 61 63 6b 20 66 72 6f  nt) rollback fro
10e50 6d 20 61 6e 20 0a 20 20 20 20 20 20 2a 2a 20 75  m an .      ** u
10e60 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e 20  nsynced portion 
10e70 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
10e80 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  nal file, then i
10e90 74 20 69 73 20 6e 6f 74 20 73 61 66 65 0a 20 20  t is not safe.  
10ea0 20 20 20 20 2a 2a 20 74 6f 20 6d 61 72 6b 20 74      ** to mark t
10eb0 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e  he page as clean
10ec0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
10ed0 65 20 6d 61 72 6b 69 6e 67 20 74 68 65 20 70 61  e marking the pa
10ee0 67 65 20 61 73 0a 20 20 20 20 20 20 2a 2a 20 63  ge as.      ** c
10ef0 6c 65 61 6e 20 77 69 6c 6c 20 63 6c 65 61 72 20  lean will clear 
10f00 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
10f10 59 4e 43 20 66 6c 61 67 2e 20 53 69 6e 63 65 20  YNC flag. Since 
10f20 74 68 65 20 70 61 67 65 20 69 73 0a 20 20 20 20  the page is.    
10f30 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e 20    ** already in 
10f40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10f50 20 28 72 65 63 6f 72 64 65 64 20 69 6e 20 50 61   (recorded in Pa
10f60 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 29 20  ger.pInJournal) 
10f70 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  and.      ** the
10f80 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
10f90 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72 65 64   flag is cleared
10fa0 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  , if the page is
10fb0 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 20 20   written to.    
10fc0 20 20 2a 2a 20 61 67 61 69 6e 20 77 69 74 68 69    ** again withi
10fd0 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  n this transacti
10fe0 6f 6e 2c 20 69 74 20 77 69 6c 6c 20 62 65 20 6d  on, it will be m
10ff0 61 72 6b 65 64 20 61 73 20 64 69 72 74 79 20 62  arked as dirty b
11000 75 74 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  ut.      ** the 
11010 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
11020 66 6c 61 67 20 77 69 6c 6c 20 6e 6f 74 20 62 65  flag will not be
11030 20 73 65 74 2e 20 49 74 20 63 6f 75 6c 64 20 74   set. It could t
11040 68 65 6e 20 70 6f 74 65 6e 74 69 61 6c 6c 79 0a  hen potentially.
11050 20 20 20 20 20 20 2a 2a 20 62 65 20 77 72 69 74        ** be writ
11060 74 65 6e 20 6f 75 74 20 69 6e 74 6f 20 74 68 65  ten out into the
11070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
11080 65 66 6f 72 65 20 69 74 73 20 6a 6f 75 72 6e 61  efore its journa
11090 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  l file.      ** 
110a0 73 65 67 6d 65 6e 74 20 69 73 20 73 79 6e 63 65  segment is synce
110b0 64 2e 20 49 66 20 61 20 63 72 61 73 68 20 6f 63  d. If a crash oc
110c0 63 75 72 73 20 64 75 72 69 6e 67 20 6f 72 20 66  curs during or f
110d0 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 2c 0a 20  ollowing this,. 
110e0 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
110f0 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
11100 65 6e 73 75 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  ensue..      */.
11110 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
11120 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
11130 72 29 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r) );.      sqli
11140 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
11150 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 23  an(pPg);.    }.#
11160 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
11170 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
11180 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
11190 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
111a0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20  ;.#endif.    /* 
111b0 49 66 20 74 68 69 73 20 77 61 73 20 70 61 67 65  If this was page
111c0 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65   1, then restore
111d0 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61   the value of Pa
111e0 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a  ger.dbFileVers..
111f0 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62      ** Do this b
11200 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69  efore any decodi
11210 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  ng. */.    if( p
11220 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
11230 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
11240 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75  dbFileVers, &((u
11250 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69  8*)pData)[24],si
11260 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
11270 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d  ileVers));.    }
11280 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20  ..    /* Decode 
11290 74 68 65 20 70 61 67 65 20 6a 75 73 74 20 72 65  the page just re
112a0 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a  ad from disk */.
112b0 20 20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65      CODEC1(pPage
112c0 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70  r, pData, pPg->p
112d0 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c 49 54  gno, 3, rc=SQLIT
112e0 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20 73 71  E_NOMEM);.    sq
112f0 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65 61  lite3PcacheRelea
11300 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 72  se(pPg);.  }.  r
11310 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11320 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61  ** Parameter zMa
11330 73 74 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65  ster is the name
11340 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
11350 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e  rnal file. A sin
11360 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  gle journal.** f
11370 69 6c 65 20 74 68 61 74 20 72 65 66 65 72 72 65  ile that referre
11380 64 20 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20  d to the master 
11390 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
113a0 20 6a 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65   just been rolle
113b0 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20  d back..** This 
113c0 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69  routine checks i
113d0 66 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  f it is possible
113e0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d   to delete the m
113f0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
11400 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20  le,.** and does 
11410 73 6f 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a  so if it is..**.
11420 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73  ** Argument zMas
11430 74 65 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f  ter may point to
11440 20 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65   Pager.pTmpSpace
11450 2e 20 53 6f 20 74 68 61 74 20 62 75 66 66 65 72  . So that buffer
11460 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69   is not .** avai
11470 6c 61 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69  lable for use wi
11480 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69  thin this functi
11490 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  on..**.** When a
114a0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
114b0 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64 2c  file is created,
114c0 20 69 74 20 69 73 20 70 6f 70 75 6c 61 74 65 64   it is populated
114d0 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
114e0 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f 66 20 69 74  .** of all of it
114f0 73 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  s child journals
11500 2c 20 6f 6e 65 20 61 66 74 65 72 20 61 6e 6f 74  , one after anot
11510 68 65 72 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  her, formatted a
11520 73 20 75 74 66 2d 38 20 0a 2a 2a 20 65 6e 63 6f  s utf-8 .** enco
11530 64 65 64 20 74 65 78 74 2e 20 54 68 65 20 65 6e  ded text. The en
11540 64 20 6f 66 20 65 61 63 68 20 63 68 69 6c 64 20  d of each child 
11550 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
11560 6d 61 72 6b 65 64 20 77 69 74 68 20 61 20 0a 2a  marked with a .*
11570 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
11580 20 62 79 74 65 20 28 30 78 30 30 29 2e 20 69 2e   byte (0x00). i.
11590 65 2e 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  e. the entire co
115a0 6e 74 65 6e 74 73 20 6f 66 20 61 20 6d 61 73 74  ntents of a mast
115b0 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  er journal.** fi
115c0 6c 65 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  le for a transac
115d0 74 69 6f 6e 20 69 6e 76 6f 6c 76 69 6e 67 20 74  tion involving t
115e0 77 6f 20 64 61 74 61 62 61 73 65 73 20 6d 69 67  wo databases mig
115f0 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 22  ht be:.**.**   "
11600 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61 2e 64 62 2d  /home/bill/a.db-
11610 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f 68 6f 6d 65  journal\x00/home
11620 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a 6f 75 72 6e  /bill/b.db-journ
11630 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a 2a 20 41 20  al\x00".**.** A 
11640 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
11650 69 6c 65 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  ile may only be 
11660 64 65 6c 65 74 65 64 20 6f 6e 63 65 20 61 6c 6c  deleted once all
11670 20 6f 66 20 69 74 73 20 63 68 69 6c 64 20 0a 2a   of its child .*
11680 2a 20 6a 6f 75 72 6e 61 6c 73 20 68 61 76 65 20  * journals have 
11690 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  been rolled back
116a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
116b0 63 74 69 6f 6e 20 72 65 61 64 73 20 74 68 65 20  ction reads the 
116c0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
116d0 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
116e0 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a 20 6d 65 6d  ile into .** mem
116f0 6f 72 79 20 61 6e 64 20 6c 6f 6f 70 73 20 74 68  ory and loops th
11700 72 6f 75 67 68 20 65 61 63 68 20 6f 66 20 74 68  rough each of th
11710 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  e child journal 
11720 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a 2a 20 65 61  names. For.** ea
11730 63 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ch child journal
11740 2c 20 69 74 20 63 68 65 63 6b 73 20 69 66 3a 0a  , it checks if:.
11750 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65  **.**   * if the
11760 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 65   child journal e
11770 78 69 73 74 73 2c 20 61 6e 64 20 69 66 20 73 6f  xists, and if so
11780 0a 2a 2a 20 20 20 2a 20 69 66 20 74 68 65 20 63  .**   * if the c
11790 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 63 6f 6e  hild journal con
117a0 74 61 69 6e 73 20 61 20 72 65 66 65 72 65 6e 63  tains a referenc
117b0 65 20 74 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72  e to master jour
117c0 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 66 69 6c 65  nal .**     file
117d0 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 49   zMaster.**.** I
117e0 66 20 61 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  f a child journa
117f0 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64 20 74  l can be found t
11800 68 61 74 20 6d 61 74 63 68 65 73 20 62 6f 74 68  hat matches both
11810 20 6f 66 20 74 68 65 20 63 72 69 74 65 72 69 61   of the criteria
11820 0a 2a 2a 20 61 62 6f 76 65 2c 20 74 68 69 73 20  .** above, this 
11830 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73  function returns
11840 20 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 61   without doing a
11850 6e 79 74 68 69 6e 67 2e 20 4f 74 68 65 72 77 69  nything. Otherwi
11860 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f 20 73 75 63  se, if.** no suc
11870 68 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20  h child journal 
11880 63 61 6e 20 62 65 20 66 6f 75 6e 64 2c 20 66 69  can be found, fi
11890 6c 65 20 7a 4d 61 73 74 65 72 20 69 73 20 64 65  le zMaster is de
118a0 6c 65 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68  leted from.** th
118b0 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 75 73  e file-system us
118c0 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  ing sqlite3OsDel
118d0 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ete()..**.** If 
118e0 61 6e 20 49 4f 20 65 72 72 6f 72 20 77 69 74 68  an IO error with
118f0 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
11900 2c 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  , an error code 
11910 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69  is returned. Thi
11920 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c  s.** function al
11930 6c 6f 63 61 74 65 73 20 6d 65 6d 6f 72 79 20 62  locates memory b
11940 79 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65  y calling sqlite
11950 33 4d 61 6c 6c 6f 63 28 29 2e 20 49 66 20 61 6e  3Malloc(). If an
11960 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a 2a 20 66   allocation.** f
11970 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
11980 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  EM is returned. 
11990 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 6e 6f  Otherwise, if no
119a0 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f 63 20 65 72   IO or malloc er
119b0 72 6f 72 73 20 0a 2a 2a 20 6f 63 63 75 72 2c 20  rors .** occur, 
119c0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
119d0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44  urned..**.** TOD
119e0 4f 3a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  O: This function
119f0 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 73 69 6e   allocates a sin
11a00 67 6c 65 20 62 6c 6f 63 6b 20 6f 66 20 6d 65 6d  gle block of mem
11a10 6f 72 79 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20 74  ory to load.** t
11a20 68 65 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e  he entire conten
11a30 74 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  ts of the master
11a40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
11a50 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20  his could be.** 
11a60 61 20 63 6f 75 70 6c 65 20 6f 66 20 6b 69 6c 6f  a couple of kilo
11a70 62 79 74 65 73 20 6f 72 20 73 6f 20 2d 20 70 6f  bytes or so - po
11a80 74 65 6e 74 69 61 6c 6c 79 20 6c 61 72 67 65 72  tentially larger
11a90 20 74 68 61 6e 20 74 68 65 20 70 61 67 65 20 0a   than the page .
11aa0 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  ** size..*/.stat
11ab0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65 6c  ic int pager_del
11ac0 6d 61 73 74 65 72 28 50 61 67 65 72 20 2a 70 50  master(Pager *pP
11ad0 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
11ae0 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 73 71   *zMaster){.  sq
11af0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
11b00 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
11b10 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
11b20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
11b30 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
11b40 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d  sqlite3_file *pM
11b50 61 73 74 65 72 3b 20 20 20 20 2f 2a 20 4d 61 6c  aster;    /* Mal
11b60 6c 6f 63 27 64 20 6d 61 73 74 65 72 2d 6a 6f 75  loc'd master-jou
11b70 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
11b80 70 74 6f 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ptor */.  sqlite
11b90 33 5f 66 69 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c  3_file *pJournal
11ba0 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f 63 27 64 20  ;   /* Malloc'd 
11bb0 63 68 69 6c 64 2d 6a 6f 75 72 6e 61 6c 20 66 69  child-journal fi
11bc0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 2a 2f  le descriptor */
11bd0 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
11be0 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20  Journal = 0; /* 
11bf0 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74  Contents of mast
11c00 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
11c10 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72  */.  i64 nMaster
11c20 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f  Journal;       /
11c30 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72  * Size of master
11c40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f   journal file */
11c50 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
11c60 73 70 61 63 65 20 66 6f 72 20 62 6f 74 68 20 74  space for both t
11c70 68 65 20 70 4a 6f 75 72 6e 61 6c 20 61 6e 64 20  he pJournal and 
11c80 70 4d 61 73 74 65 72 20 66 69 6c 65 20 64 65 73  pMaster file des
11c90 63 72 69 70 74 6f 72 73 2e 0a 20 20 2a 2a 20 49  criptors..  ** I
11ca0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 70  f successful, op
11cb0 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
11cc0 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 72  urnal file for r
11cd0 65 61 64 69 6e 67 2e 0a 20 20 2a 2f 0a 20 20 70  eading..  */.  p
11ce0 4d 61 73 74 65 72 20 3d 20 28 73 71 6c 69 74 65  Master = (sqlite
11cf0 33 5f 66 69 6c 65 20 2a 29 73 71 6c 69 74 65 33  3_file *)sqlite3
11d00 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70 56 66 73 2d  MallocZero(pVfs-
11d10 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b 0a  >szOsFile * 2);.
11d20 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73 71    pJournal = (sq
11d30 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28 28  lite3_file *)(((
11d40 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b 20  u8 *)pMaster) + 
11d50 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
11d60 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72 20  .  if( !pMaster 
11d70 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
11d80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c 73  TE_NOMEM;.  }els
11d90 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  e{.    const int
11da0 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
11db0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
11dc0 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
11dd0 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
11de0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
11df0 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
11e00 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
11e10 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
11e20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11e30 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
11e40 75 74 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  ut;..  rc = sqli
11e50 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d  te3OsFileSize(pM
11e60 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
11e70 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
11e80 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
11e90 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
11ea0 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
11eb0 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
11ec0 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
11ed0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
11ee0 74 65 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20  terPtr = 0;.    
11ef0 69 6e 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d  int nMasterPtr =
11f00 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
11f10 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  e+1;..    /* Loa
11f20 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
11f30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11f40 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
11f50 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ined from.    **
11f60 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
11f70 29 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f  ) and pointed to
11f80 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   by zMasterJourn
11f90 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  al. .    */.    
11fa0 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
11fb0 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28   sqlite3Malloc((
11fc0 69 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  int)nMasterJourn
11fd0 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 20  al + nMasterPtr 
11fe0 2b 20 31 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  + 1);.    if( !z
11ff0 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
12000 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
12010 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
12020 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
12030 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 4d  ut;.    }.    zM
12040 61 73 74 65 72 50 74 72 20 3d 20 26 7a 4d 61 73  asterPtr = &zMas
12050 74 65 72 4a 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74  terJournal[nMast
12060 65 72 4a 6f 75 72 6e 61 6c 2b 31 5d 3b 0a 20 20  erJournal+1];.  
12070 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12080 52 65 61 64 28 70 4d 61 73 74 65 72 2c 20 7a 4d  Read(pMaster, zM
12090 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 28 69  asterJournal, (i
120a0 6e 74 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  nt)nMasterJourna
120b0 6c 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  l, 0);.    if( r
120c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
120d0 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
120e0 74 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f  t;.    zMasterJo
120f0 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
12100 72 6e 61 6c 5d 20 3d 20 30 3b 0a 0a 20 20 20 20  rnal] = 0;..    
12110 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
12120 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
12130 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
12140 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
12150 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
12160 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69 73  {.      int exis
12170 74 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ts;.      rc = s
12180 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
12190 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53  Vfs, zJournal, S
121a0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
121b0 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
121c0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
121d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
121e0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
121f0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  _out;.      }.  
12200 20 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29      if( exists )
12210 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  {.        /* One
12220 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
12230 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74   pointed to by t
12240 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
12250 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20  l exists..      
12260 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64    ** Open it and
12270 20 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69   check if it poi
12280 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65  nts at the maste
12290 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20  r journal. If.  
122a0 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74        ** so, ret
122b0 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65  urn without dele
122c0 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20  ting the master 
122d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
122e0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
122f0 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20   int c;.        
12300 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c  int flags = (SQL
12310 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
12320 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
12330 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  IN_JOURNAL);.   
12340 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
12350 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a  3OsOpen(pVfs, zJ
12360 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c  ournal, pJournal
12370 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20  , flags, 0);.   
12380 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
12390 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
123a0 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
123b0 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
123c0 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  }..        rc = 
123d0 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
123e0 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73  l(pJournal, zMas
123f0 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50  terPtr, nMasterP
12400 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  tr);.        sql
12410 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75  ite3OsClose(pJou
12420 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
12430 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12440 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
12450 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
12460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
12470 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
12480 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72  Ptr[0]!=0 && str
12490 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
124a0 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
124b0 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
124c0 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
124d0 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
124e0 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
124f0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
12500 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
12510 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
12520 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
12530 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75      }.      zJou
12540 72 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33  rnal += (sqlite3
12550 53 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61  Strlen30(zJourna
12560 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
12570 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  .  .  rc = sqlit
12580 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c  e3OsDelete(pVfs,
12590 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64   zMaster, 0);..d
125a0 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
125b0 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
125c0 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
125d0 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  3_free(zMasterJo
125e0 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
125f0 69 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20  if( pMaster ){. 
12600 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
12610 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  e(pMaster);.    
12620 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
12630 70 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d  pJournal) );.  }
12640 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
12650 70 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75  pMaster);.  retu
12660 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
12670 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
12680 73 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65  s used to change
12690 20 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65   the actual size
126a0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
126b0 20 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65   .** file in the
126c0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68   file-system. Th
126d0 69 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20  is only happens 
126e0 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20  when committing 
126f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a  a transaction,.*
12700 2a 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63  * or rolling bac
12710 6b 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  k a transaction 
12720 28 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69  (including rolli
12730 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f  ng back a hot-jo
12740 75 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  urnal)..**.** If
12750 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
12760 73 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f  se file is not o
12770 70 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75  pen, or an exclu
12780 73 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  sive lock is not
12790 0a 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66  .** held, this f
127a0 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
127b0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
127c0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
127d0 69 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65  ile is.** change
127e0 64 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73  d to nPage pages
127f0 20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e   (nPage*pPager->
12800 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e  pageSize bytes).
12810 20 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20   If the file.** 
12820 6f 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65  on disk is curre
12830 6e 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e  ntly larger than
12840 20 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68   nPage pages, th
12850 65 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a  en use the VFS.*
12860 2a 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65  * xTruncate() me
12870 74 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65  thod to truncate
12880 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69   it..**.** Or, i
12890 74 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65  t might might be
128a0 20 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74   the case that t
128b0 68 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20  he file on disk 
128c0 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  is smaller than 
128d0 0a 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e  .** nPage pages.
128e0 20 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20   Some operating 
128f0 73 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74  system implement
12900 61 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63  ations can get c
12910 6f 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79  onfused if .** y
12920 6f 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61  ou try to trunca
12930 74 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d  te a file to som
12940 65 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c  e size that is l
12950 61 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a  arger than it .*
12960 2a 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20  * currently is, 
12970 73 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63  so detect this c
12980 61 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20  ase and write a 
12990 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65  single zero byte
129a0 20 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20   to .** the end 
129b0 6f 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20  of the new file 
129c0 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49  instead..**.** I
129d0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65  f successful, re
129e0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  turn SQLITE_OK. 
129f0 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f  If an IO error o
12a00 63 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69  ccurs while modi
12a10 66 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74  fying.** the dat
12a20 61 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75  abase file, retu
12a30 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  rn the error cod
12a40 65 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  e to the caller.
12a50 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12a60 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61  ager_truncate(Pa
12a70 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
12a80 6f 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20  o nPage){.  int 
12a90 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
12aa0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
12ab0 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
12ac0 53 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70  SIVE && isOpen(p
12ad0 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
12ae0 20 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a    i64 currentSiz
12af0 65 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20  e, newSize;.    
12b00 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73  /* TODO: Is it s
12b10 61 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72  afe to use Pager
12b20 2e 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65  .dbFileSize here
12b30 3f 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  ? */.    rc = sq
12b40 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
12b50 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72  pPager->fd, &cur
12b60 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e  rentSize);.    n
12b70 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  ewSize = pPager-
12b80 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
12b90 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63  Page;.    if( rc
12ba0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63  ==SQLITE_OK && c
12bb0 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53  urrentSize!=newS
12bc0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ize ){.      if(
12bd0 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77   currentSize>new
12be0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
12bf0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
12c00 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
12c10 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
12c20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
12c30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
12c40 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
12c50 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65  , "", 1, newSize
12c60 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  -1);.      }.   
12c70 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
12c80 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12c90 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
12ca0 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
12cb0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
12cc0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12cd0 0a 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75  .** Set the valu
12ce0 65 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73  e of the Pager.s
12cf0 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
12d00 6c 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  le for the given
12d10 0a 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20  .** pager based 
12d20 6f 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  on the value ret
12d30 75 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65  urned by the xSe
12d40 63 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a  ctorSize method.
12d50 2a 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64  ** of the open d
12d60 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
12d70 65 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69  e sector size wi
12d80 6c 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20  ll be used used 
12d90 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65  .** to determine
12da0 20 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c   the size and al
12db0 69 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e  ignment of journ
12dc0 61 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a  al header and .*
12dd0 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
12de0 20 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e   pointers within
12df0 20 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c   created journal
12e00 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f   files..**.** Fo
12e10 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
12e20 73 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20  s the effective 
12e30 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61  sector size is a
12e40 6c 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e  lways 512 bytes.
12e50 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65  .**.** Otherwise
12e60 2c 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72  , for non-tempor
12e70 61 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65  ary files, the e
12e80 66 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20  ffective sector 
12e90 73 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76  size is.** the v
12ea0 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79  alue returned by
12eb0 20 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65   the xSectorSize
12ec0 28 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65  () method rounde
12ed0 64 20 75 70 20 74 6f 20 33 32 20 69 66 0a 2a 2a  d up to 32 if.**
12ee0 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
12ef0 20 33 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20   32, or rounded 
12f00 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
12f10 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
12f20 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
12f30 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
12f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12f50 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
12f60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
12f70 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
12f80 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
12f90 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
12fa0 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
12fb0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
12fc0 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
12fd0 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
12fe0 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
12ff0 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
13000 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
13010 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
13020 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
13030 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
13040 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
13050 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
13060 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ault..    */.   
13070 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
13080 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
13090 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
130a0 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->fd);.  }.  if(
130b0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
130c0 69 7a 65 3c 33 32 20 29 7b 0a 20 20 20 20 70 50  ize<32 ){.    pP
130d0 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
130e0 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69 66   = 512;.  }.  if
130f0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
13100 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f  Size>MAX_SECTOR_
13110 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73 65  SIZE ){.    asse
13120 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  rt( MAX_SECTOR_S
13130 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20 20  IZE>=512 );.    
13140 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
13150 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ze = MAX_SECTOR_
13160 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  SIZE;.  }.}../*.
13170 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
13180 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
13190 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
131a0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
131b0 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
131c0 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
131d0 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
131e0 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
131f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
13200 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
13210 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
13220 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
13230 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
13240 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
13250 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
13260 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
13270 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
13280 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
13290 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
132a0 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
132b0 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
132c0 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
132d0 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
132e0 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
132f0 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
13300 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
13310 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
13320 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
13330 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
13340 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
13350 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
13360 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
13370 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
13380 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
13390 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
133a0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
133b0 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
133c0 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
133d0 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
133e0 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
133f0 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
13400 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
13410 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20 73   is the sector s
13420 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65 72  ize.  The header
13430 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68 69  .**       is thi
13440 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e 20  s many bytes in 
13450 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20 34  size..**  (6)  4
13460 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e   byte big-endian
13470 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
13480 73 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  s the page size.
13490 0a 2a 2a 20 20 28 37 29 20 20 7a 65 72 6f 20 70  .**  (7)  zero p
134a0 61 64 64 69 6e 67 20 6f 75 74 20 74 6f 20 74 68  adding out to th
134b0 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 73 69  e next sector si
134c0 7a 65 2e 0a 2a 2a 20 20 28 38 29 20 20 5a 65 72  ze..**  (8)  Zer
134d0 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
134e0 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
134f0 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
13500 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
13510 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
13520 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
13530 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
13540 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
13550 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
13560 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
13570 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
13580 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
13590 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
135a0 72 73 74 20 37 20 69 74 65 6d 73 20 61 62 6f 76  rst 7 items abov
135b0 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
135c0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
135d0 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
135e0 66 20 74 68 65 20 38 74 68 20 69 74 65 6d 2e 0a  f the 8th item..
135f0 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
13600 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
13610 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
13620 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
13630 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
13640 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
13650 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
13660 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
13670 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
13680 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
13690 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
136a0 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
136b0 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
136c0 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
136d0 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
136e0 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
136f0 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
13700 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
13710 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
13720 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
13730 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
13740 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
13750 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
13760 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
13770 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
13780 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
13790 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
137a0 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
137b0 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
137c0 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
137d0 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
137e0 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
137f0 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
13800 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
13810 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
13820 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
13830 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
13840 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
13850 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
13860 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
13870 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
13880 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
13890 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
138a0 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
138b0 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
138c0 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
138d0 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
138e0 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
138f0 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
13900 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
13910 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
13920 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
13930 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
13940 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
13950 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
13960 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
13970 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
13980 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
13990 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
139a0 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
139b0 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
139c0 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
139d0 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
139e0 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
139f0 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
13a00 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
13a10 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
13a20 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
13a30 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
13a40 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
13a50 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
13a60 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
13a70 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
13a80 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
13a90 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
13aa0 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
13ab0 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
13ac0 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
13ad0 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
13ae0 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
13af0 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
13b00 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
13b10 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
13b20 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ned..**.** The i
13b30 73 48 6f 74 20 70 61 72 61 6d 65 74 65 72 20 69  sHot parameter i
13b40 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65  ndicates that we
13b50 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 72   are trying to r
13b60 6f 6c 6c 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61  ollback a journa
13b70 6c 0a 2a 2a 20 74 68 61 74 20 6d 69 67 68 74 20  l.** that might 
13b80 62 65 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  be a hot journal
13b90 2e 20 20 4f 72 2c 20 69 74 20 63 6f 75 6c 64 20  .  Or, it could 
13ba0 62 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  be that the jour
13bb0 6e 61 6c 20 69 73 20 0a 2a 2a 20 70 72 65 73 65  nal is .** prese
13bc0 72 76 65 64 20 62 65 63 61 75 73 65 20 6f 66 20  rved because of 
13bd0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
13be0 49 53 54 20 6f 72 20 4a 4f 55 52 4e 41 4c 4d 4f  IST or JOURNALMO
13bf0 44 45 5f 54 52 55 4e 43 41 54 45 2e 0a 2a 2a 20  DE_TRUNCATE..** 
13c00 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72  If the journal r
13c10 65 61 6c 6c 79 20 69 73 20 68 6f 74 2c 20 72 65  eally is hot, re
13c20 73 65 74 20 74 68 65 20 70 61 67 65 72 20 63 61  set the pager ca
13c30 63 68 65 20 70 72 69 6f 72 20 72 6f 6c 6c 69 6e  che prior rollin
13c40 67 0a 2a 2a 20 62 61 63 6b 20 61 6e 79 20 63 6f  g.** back any co
13c50 6e 74 65 6e 74 2e 20 20 49 66 20 74 68 65 20 6a  ntent.  If the j
13c60 6f 75 72 6e 61 6c 20 69 73 20 6d 65 72 65 6c 79  ournal is merely
13c70 20 70 65 72 73 69 73 74 65 6e 74 2c 20 6e 6f 20   persistent, no 
13c80 72 65 73 65 74 20 69 73 0a 2a 2a 20 6e 65 65 64  reset is.** need
13c90 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
13ca0 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
13cb0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
13cc0 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
13cd0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
13ce0 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
13cf0 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
13d00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
13d10 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
13d20 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
13d30 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13d50 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
13d60 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
13d70 6c 20 2a 2f 0a 20 20 75 33 32 20 75 3b 20 20 20  l */.  u32 u;   
13d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d90 2f 2a 20 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70  /* Unsigned loop
13da0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67   counter */.  Pg
13db0 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20  no mxPg = 0;    
13dc0 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
13dd0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66  f the original f
13de0 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a  ile in pages */.
13df0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
13e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
13e10 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73  sult code of a s
13e20 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69  ubroutine */.  i
13e30 6e 74 20 72 65 73 20 3d 20 31 3b 20 20 20 20 20  nt res = 1;     
13e40 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65          /* Value
13e50 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
13e60 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a  ite3OsAccess() *
13e70 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  /.  char *zMaste
13e80 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  r = 0;       /* 
13e90 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a  Name of master j
13ea0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61  ournal file if a
13eb0 6e 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 65 65 64  ny */.  int need
13ec0 50 61 67 65 72 52 65 73 65 74 3b 20 20 20 20 20  PagerReset;     
13ed0 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
13ee0 74 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  t page prior to 
13ef0 66 69 72 73 74 20 70 61 67 65 20 72 6f 6c 6c 62  first page rollb
13f00 61 63 6b 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67  ack */..  /* Fig
13f10 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79  ure out how many
13f20 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20   records are in 
13f30 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62  the journal.  Ab
13f40 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a  ort early if.  *
13f50 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * the journal is
13f60 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61   empty..  */.  a
13f70 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
13f80 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20 20  ager->jfd) );.  
13f90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
13fa0 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a  leSize(pPager->j
13fb0 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28  fd, &szJ);.  if(
13fc0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
13fd0 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20  | szJ==0 ){.    
13fe0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
13ff0 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61  k;.  }..  /* Rea
14000 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  d the master jou
14010 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74  rnal name from t
14020 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69  he journal, if i
14030 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20  t is present..  
14040 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  ** If a master j
14050 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
14060 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 62   is specified, b
14070 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e  ut the file is n
14080 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20  ot.  ** present 
14090 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68  on disk, then th
140a0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  e journal is not
140b0 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f   hot and does no
140c0 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a  t need to be.  *
140d0 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20  * played back.. 
140e0 20 2a 2a 0a 20 20 2a 2a 20 54 4f 44 4f 3a 20 54   **.  ** TODO: T
140f0 65 63 68 6e 69 63 61 6c 6c 79 20 74 68 65 20 66  echnically the f
14100 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 6e 20 65  ollowing is an e
14110 72 72 6f 72 20 62 65 63 61 75 73 65 20 69 74 20  rror because it 
14120 61 73 73 75 6d 65 73 20 74 68 61 74 0a 20 20 2a  assumes that.  *
14130 2a 20 62 75 66 66 65 72 20 50 61 67 65 72 2e 70  * buffer Pager.p
14140 54 6d 70 53 70 61 63 65 20 69 73 20 28 6d 78 50  TmpSpace is (mxP
14150 61 74 68 6e 61 6d 65 2b 31 29 20 62 79 74 65 73  athname+1) bytes
14160 20 6f 72 20 6c 61 72 67 65 72 2e 20 69 2e 65 2e   or larger. i.e.
14170 20 74 68 61 74 0a 20 20 2a 2a 20 28 70 50 61 67   that.  ** (pPag
14180 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3e 3d 20  er->pageSize >= 
14190 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78  pPager->pVfs->mx
141a0 50 61 74 68 6e 61 6d 65 2b 31 29 2e 20 55 73 69  Pathname+1). Usi
141b0 6e 67 20 6f 73 5f 75 6e 69 78 2e 63 2c 0a 20 20  ng os_unix.c,.  
141c0 2a 2a 20 20 6d 78 50 61 74 68 6e 61 6d 65 20 69  **  mxPathname i
141d0 73 20 35 31 32 2c 20 77 68 69 63 68 20 69 73 20  s 512, which is 
141e0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
141f0 6d 69 6e 69 6d 75 6d 20 61 6c 6c 6f 77 61 62 6c  minimum allowabl
14200 65 20 76 61 6c 75 65 0a 20 20 2a 2a 20 66 6f 72  e value.  ** for
14210 20 70 61 67 65 53 69 7a 65 2e 0a 20 20 2a 2f 0a   pageSize..  */.
14220 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
14230 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
14240 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
14250 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
14260 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
14270 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
14280 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
14290 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
142a0 26 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a  & zMaster[0] ){.
142b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
142c0 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
142d0 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41  Master, SQLITE_A
142e0 43 43 45 53 53 5f 45 58 49 53 54 53 2c 20 26 72  CCESS_EXISTS, &r
142f0 65 73 29 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74  es);.  }.  zMast
14300 65 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63  er = 0;.  if( rc
14310 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21  !=SQLITE_OK || !
14320 72 65 73 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  res ){.    goto 
14330 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
14340 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
14350 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 6e 65  nalOff = 0;.  ne
14360 65 64 50 61 67 65 72 52 65 73 65 74 20 3d 20 69  edPagerReset = i
14370 73 48 6f 74 3b 0a 0a 20 20 2f 2a 20 54 68 69 73  sHot;..  /* This
14380 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73   loop terminates
14390 20 65 69 74 68 65 72 20 77 68 65 6e 20 61 20 72   either when a r
143a0 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  eadJournalHdr() 
143b0 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 72 5f 70  or .  ** pager_p
143c0 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
143d0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 20  () call returns 
143e0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61  SQLITE_DONE or a
143f0 6e 20 49 4f 20 65 72 72 6f 72 20 0a 20 20 2a 2a  n IO error .  **
14400 20 6f 63 63 75 72 73 2e 20 0a 20 20 2a 2f 0a 20   occurs. .  */. 
14410 20 77 68 69 6c 65 28 20 31 20 29 7b 0a 20 20 20   while( 1 ){.   
14420 20 2f 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78   /* Read the nex
14430 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
14440 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
14450 6c 20 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72  l file.  If ther
14460 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74  e are.    ** not
14470 20 65 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65   enough bytes le
14480 66 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ft in the journa
14490 6c 20 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d  l file for a com
144a0 70 6c 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72  plete header, or
144b0 0a 20 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f  .    ** it is co
144c0 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20  rrupted, then a 
144d0 70 72 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20  process must of 
144e0 66 61 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69  failed while wri
144f0 74 69 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20  ting it..    ** 
14500 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e  This indicates n
14510 6f 74 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64  othing more need
14520 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62  s to be rolled b
14530 61 63 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ack..    */.    
14540 72 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c  rc = readJournal
14550 48 64 72 28 70 50 61 67 65 72 2c 20 69 73 48 6f  Hdr(pPager, isHo
14560 74 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  t, szJ, &nRec, &
14570 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
14580 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
14590 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
145a0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
145b0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
145c0 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
145d0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
145e0 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
145f0 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
14600 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
14610 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
14620 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
14630 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
14640 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
14650 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
14660 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
14670 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
14680 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
14690 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
146a0 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
146b0 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
146c0 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
146d0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
146e0 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
146f0 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
14700 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
14710 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
14720 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
14730 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
14740 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
14750 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
14760 20 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73   nRec = (int)((s
14770 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
14780 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
14790 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
147a0 72 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r));.    }..    
147b0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
147c0 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
147d0 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
147e0 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
147f0 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
14800 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
14810 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
14820 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
14830 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
14840 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
14850 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
14860 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
14870 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
14880 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
14890 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
148a0 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
148b0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
148c0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
148d0 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
148e0 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
148f0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
14900 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
14910 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
14920 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
14930 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2a  et #2565..    **
14940 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
14950 63 6b 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ck a hot journal
14960 2c 20 6e 52 65 63 3d 3d 30 20 61 6c 77 61 79 73  , nRec==0 always
14970 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
14980 6e 65 78 74 0a 20 20 20 20 2a 2a 20 63 68 75 6e  next.    ** chun
14990 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  k of the journal
149a0 20 63 6f 6e 74 61 69 6e 73 20 7a 65 72 6f 20 70   contains zero p
149b0 61 67 65 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65  ages to be rolle
149c0 64 20 62 61 63 6b 2e 20 20 42 75 74 0a 20 20 20  d back.  But.   
149d0 20 2a 2a 20 77 68 65 6e 20 64 6f 69 6e 67 20 61   ** when doing a
149e0 20 52 4f 4c 4c 42 41 43 4b 20 61 6e 64 20 74 68   ROLLBACK and th
149f0 65 20 6e 52 65 63 3d 3d 30 20 63 68 75 6e 6b 20  e nRec==0 chunk 
14a00 69 73 20 74 68 65 20 6c 61 73 74 20 63 68 75 6e  is the last chun
14a10 6b 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20  k in.    ** the 
14a20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 6d 65 61 6e  journal, it mean
14a30 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  s that the journ
14a40 61 6c 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  al might contain
14a50 20 61 64 64 69 74 69 6f 6e 61 6c 0a 20 20 20 20   additional.    
14a60 2a 2a 20 70 61 67 65 73 20 74 68 61 74 20 6e 65  ** pages that ne
14a70 65 64 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20  ed to be rolled 
14a80 62 61 63 6b 20 61 6e 64 20 74 68 61 74 20 74 68  back and that th
14a90 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
14aa0 73 20 0a 20 20 20 20 2a 2a 20 73 68 6f 75 6c 64  s .    ** should
14ab0 20 62 65 20 63 6f 6d 70 75 74 65 64 20 62 61 73   be computed bas
14ac0 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed on the journa
14ad0 6c 20 66 69 6c 65 20 73 69 7a 65 2e 0a 20 20 20  l file size..   
14ae0 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63   */.    if( nRec
14af0 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20 26 26  ==0 && !isHot &&
14b00 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
14b10 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
14b20 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
14b30 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
14b40 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20 20 20  nalOff ){.      
14b50 6e 52 65 63 20 3d 20 28 69 6e 74 29 28 28 73 7a  nRec = (int)((sz
14b60 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
14b70 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
14b80 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
14b90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
14ba0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
14bb0 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
14bc0 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
14bd0 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
14be0 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
14bf0 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73  file back to its
14c00 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a   original size..
14c10 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
14c20 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
14c30 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
14c40 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  Z(pPager) ){.   
14c50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
14c60 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
14c70 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
14c80 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14c90 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
14ca0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
14cb0 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
14cc0 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
14cd0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43  .    }..    /* C
14ce0 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
14cf0 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f  es out of the jo
14d00 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69  urnal and back i
14d10 6e 74 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  nto the .    ** 
14d20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
14d30 64 2f 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e  d/or page cache.
14d40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
14d50 75 3d 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b  u=0; u<nRec; u++
14d60 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
14d70 64 50 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20  dPagerReset ){. 
14d80 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
14d90 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
14da0 20 20 20 20 6e 65 65 64 50 61 67 65 72 52 65 73      needPagerRes
14db0 65 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  et = 0;.      }.
14dc0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
14dd0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
14de0 67 65 28 70 50 61 67 65 72 2c 26 70 50 61 67 65  ge(pPager,&pPage
14df0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 30 2c  r->journalOff,0,
14e00 31 2c 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  1,0);.      if( 
14e10 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
14e20 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
14e30 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
14e40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
14e50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
14e60 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
14e70 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
14e80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
14e90 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
14ea0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
14eb0 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a  R_SHORT_READ ){.
14ec0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
14ed0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
14ee0 62 65 65 6e 20 74 72 75 6e 63 61 74 65 64 2c 20  been truncated, 
14ef0 73 69 6d 70 6c 79 20 73 74 6f 70 20 72 65 61 64  simply stop read
14f00 69 6e 67 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ing and.        
14f10 20 20 2a 2a 20 70 72 6f 63 65 73 73 69 6e 67 20    ** processing 
14f20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 68 69  the journal. Thi
14f30 73 20 6d 69 67 68 74 20 68 61 70 70 65 6e 20 69  s might happen i
14f40 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
14f50 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6e  s.          ** n
14f60 6f 74 20 63 6f 6d 70 6c 65 74 65 6c 79 20 77 72  ot completely wr
14f70 69 74 74 65 6e 20 61 6e 64 20 73 79 6e 63 65 64  itten and synced
14f80 20 70 72 69 6f 72 20 74 6f 20 61 20 63 72 61 73   prior to a cras
14f90 68 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 20 20  h.  In that.    
14fa0 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2c 20 74        ** case, t
14fb0 68 65 20 64 61 74 61 62 61 73 65 20 73 68 6f 75  he database shou
14fc0 6c 64 20 68 61 76 65 20 6e 65 76 65 72 20 62 65  ld have never be
14fd0 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 20 74 68  en written in th
14fe0 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
14ff0 69 72 73 74 20 70 6c 61 63 65 20 73 6f 20 69 74  irst place so it
15000 20 69 73 20 4f 4b 20 74 6f 20 73 69 6d 70 6c 79   is OK to simply
15010 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 72 6f 6c   abandon the rol
15020 6c 62 61 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20  lback. */.      
15030 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
15040 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f  OK;.          go
15050 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
15060 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
15070 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
15080 77 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f  we are unable to
15090 20 72 6f 6c 6c 62 61 63 6b 2c 20 71 75 69 74 20   rollback, quit 
150a0 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 65  and return the e
150b0 72 72 6f 72 0a 20 20 20 20 20 20 20 20 20 20 2a  rror.          *
150c0 2a 20 63 6f 64 65 2e 20 20 54 68 69 73 20 77 69  * code.  This wi
150d0 6c 6c 20 63 61 75 73 65 20 74 68 65 20 70 61 67  ll cause the pag
150e0 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
150f0 65 72 72 6f 72 20 73 74 61 74 65 0a 20 20 20 20  error state.    
15100 20 20 20 20 20 20 2a 2a 20 73 6f 20 74 68 61 74        ** so that
15110 20 6e 6f 20 66 75 72 74 68 65 72 20 68 61 72 6d   no further harm
15120 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 2e 20 20   will be done.  
15130 50 65 72 68 61 70 73 20 74 68 65 20 6e 65 78 74  Perhaps the next
15140 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 70 72  .          ** pr
15150 6f 63 65 73 73 20 74 6f 20 63 6f 6d 65 20 61 6c  ocess to come al
15160 6f 6e 67 20 77 69 6c 6c 20 62 65 20 61 62 6c 65  ong will be able
15170 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 74 68 65   to rollback the
15180 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20   database..     
15190 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
151a0 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
151b0 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ack;.        }. 
151c0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
151d0 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a  .  /*NOTREACHED*
151e0 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29 3b  /.  assert( 0 );
151f0 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
15200 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e 67 20 61    /* Following a
15210 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 64   rollback, the d
15220 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 68 6f  atabase file sho
15230 75 6c 64 20 62 65 20 62 61 63 6b 20 69 6e 20 69  uld be back in i
15240 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
15250 20 73 74 61 74 65 20 70 72 69 6f 72 20 74 6f 20   state prior to 
15260 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
15270 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 73 6f   transaction, so
15280 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20 20 2a 2a   invoke the.  **
15290 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42   SQLITE_FCNTL_DB
152a0 5f 55 4e 43 48 41 4e 47 45 44 20 66 69 6c 65 2d  _UNCHANGED file-
152b0 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f 64 20 74  control method t
152c0 6f 20 64 69 73 61 62 6c 65 20 74 68 65 0a 20 20  o disable the.  
152d0 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20 74 68 61  ** assertion tha
152e0 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
152f0 6e 20 63 6f 75 6e 74 65 72 20 77 61 73 20 6d 6f  n counter was mo
15300 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a 20 20 61  dified..  */.  a
15310 73 73 65 72 74 28 0a 20 20 20 20 70 50 61 67 65  ssert(.    pPage
15320 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 3d  r->fd->pMethods=
15330 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c 69 74 65  =0 ||.    sqlite
15340 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70  3OsFileControl(p
15350 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c 49 54 45  Pager->fd,SQLITE
15360 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43 48 41 4e  _FCNTL_DB_UNCHAN
15370 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54 45 5f 4f  GED,0)>=SQLITE_O
15380 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  K.  );..  /* If 
15390 74 68 69 73 20 70 6c 61 79 62 61 63 6b 20 69 73  this playback is
153a0 20 68 61 70 70 65 6e 69 6e 67 20 61 75 74 6f 6d   happening autom
153b0 61 74 69 63 61 6c 6c 79 20 61 73 20 61 20 72 65  atically as a re
153c0 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f 20 6f 72  sult of an IO or
153d0 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72   .  ** malloc er
153e0 72 6f 72 20 74 68 61 74 20 6f 63 63 75 72 72 65  ror that occurre
153f0 64 20 61 66 74 65 72 20 74 68 65 20 63 68 61 6e  d after the chan
15400 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73 20 75  ge-counter was u
15410 70 64 61 74 65 64 20 62 75 74 20 0a 20 20 2a 2a  pdated but .  **
15420 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
15430 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f 6d 6d  saction was comm
15440 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68 65 20  itted, then the 
15450 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 0a  change-counter .
15460 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74 69 6f    ** modificatio
15470 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76 65 20  n may just have 
15480 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e 20 49  been reverted. I
15490 66 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 69  f this happens i
154a0 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20 20 2a  n exclusive .  *
154b0 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73 75 62  * mode, then sub
154c0 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61 63 74  sequent transact
154d0 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64 20 62  ions performed b
154e0 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  y the connection
154f0 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a 20 75   will not.  ** u
15500 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
15510 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c 6c 2e  -counter at all.
15520 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64 20 74   This may lead t
15530 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73 69 73  o cache inconsis
15540 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f 62 6c  tency.  ** probl
15550 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20 70 72  ems for other pr
15560 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d 65 20  ocesses at some 
15570 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74  point in the fut
15580 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a 20 20  ure. So, just.  
15590 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69 73 20  ** in case this 
155a0 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 63 6c  has happened, cl
155b0 65 61 72 20 74 68 65 20 63 68 61 6e 67 65 43 6f  ear the changeCo
155c0 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e 6f 77  untDone flag now
155d0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
155e0 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65  >changeCountDone
155f0 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
15600 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  ile;..  if( rc==
15610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15620 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67 65   zMaster = pPage
15630 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20  r->pTmpSpace;.  
15640 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
15650 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
15660 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
15670 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
15680 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 20 20  athname+1);.    
15690 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
156a0 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 20  LITE_OK );.  }. 
156b0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
156c0 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 6f  OK && pPager->no
156d0 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
156e0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
156f0 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
15700 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
15710 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
15720 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
15730 67 73 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  gs);.  }.  if( r
15740 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15750 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d  pPager->noSync==
15760 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  0 && pPager->sta
15770 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
15780 49 56 45 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  IVE ){.    rc = 
15790 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50  sqlite3OsSync(pP
157a0 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
157b0 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
157c0 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
157d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
157e0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
157f0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
15800 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30   zMaster[0]!='\0
15810 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  ');.    testcase
15820 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15830 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
15840 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d  =SQLITE_OK && zM
15850 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20  aster[0] && res 
15860 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
15870 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72 20  re was a master 
15880 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73  journal and this
15890 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65   routine will re
158a0 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20  turn success,.  
158b0 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69    ** see if it i
158c0 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65  s possible to de
158d0 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  lete the master 
158e0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a  journal..    */.
158f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64      rc = pager_d
15900 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c  elmaster(pPager,
15910 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74   zMaster);.    t
15920 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
15930 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
15940 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65   /* The Pager.se
15950 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
15960 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20  e may have been 
15970 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f  updated while ro
15980 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20  lling.  ** back 
15990 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65  a journal create
159a0 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77  d by a process w
159b0 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20  ith a different 
159c0 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a  sector size.  **
159d0 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74   value. Reset it
159e0 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20   to the correct 
159f0 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70  value for this p
15a00 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73  rocess..  */.  s
15a10 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
15a20 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ger);.  return r
15a30 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  c;.}.../*.** Rea
15a40 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f  d the content fo
15a50 72 20 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f  r page pPg out o
15a60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15a70 69 6c 65 20 61 6e 64 20 69 6e 74 6f 20 0a 2a 2a  ile and into .**
15a80 20 70 50 67 2d 3e 70 44 61 74 61 2e 20 41 20 73   pPg->pData. A s
15a90 68 61 72 65 64 20 6c 6f 63 6b 20 6f 72 20 67 72  hared lock or gr
15aa0 65 61 74 65 72 20 6d 75 73 74 20 62 65 20 68 65  eater must be he
15ab0 6c 64 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ld on the databa
15ac0 73 65 0a 2a 2a 20 66 69 6c 65 20 62 65 66 6f 72  se.** file befor
15ad0 65 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  e this function 
15ae0 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
15af0 20 49 66 20 70 61 67 65 20 31 20 69 73 20 72 65   If page 1 is re
15b00 61 64 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c  ad, then the val
15b10 75 65 20 6f 66 20 50 61 67 65 72 2e 64 62 46 69  ue of Pager.dbFi
15b20 6c 65 56 65 72 73 5b 5d 20 69 73 20 73 65 74 20  leVers[] is set 
15b30 74 6f 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20  to.** the value 
15b40 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61  read from the da
15b50 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
15b60 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  ** If an IO erro
15b70 72 20 6f 63 63 75 72 73 2c 20 74 68 65 6e 20 74  r occurs, then t
15b80 68 65 20 49 4f 20 65 72 72 6f 72 20 69 73 20 72  he IO error is r
15b90 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63  eturned to the c
15ba0 61 6c 6c 65 72 2e 0a 2a 2a 20 4f 74 68 65 72 77  aller..** Otherw
15bb0 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ise, SQLITE_OK i
15bc0 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
15bd0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
15be0 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29  Page(PgHdr *pPg)
15bf0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
15c00 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
15c10 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
15c20 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
15c30 20 70 61 67 65 20 70 50 67 20 2a 2f 0a 20 20 50   page pPg */.  P
15c40 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50 67 2d 3e  gno pgno = pPg->
15c50 70 67 6e 6f 3b 20 20 20 20 20 20 20 2f 2a 20 50  pgno;       /* P
15c60 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 72 65  age number to re
15c70 61 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d  ad */.  int rc =
15c80 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
15c90 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
15ca0 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 49  ode */.  int isI
15cb0 6e 57 61 6c 20 3d 20 30 3b 20 20 20 20 20 20 20  nWal = 0;       
15cc0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
15cd0 20 70 61 67 65 20 69 73 20 69 6e 20 6c 6f 67 20   page is in log 
15ce0 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 70 67  file */.  int pg
15cf0 73 7a 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  sz = pPager->pag
15d00 65 53 69 7a 65 3b 20 2f 2a 20 4e 75 6d 62 65 72  eSize; /* Number
15d10 20 6f 66 20 62 79 74 65 73 20 74 6f 20 72 65 61   of bytes to rea
15d20 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
15d30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
15d40 41 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21  AGER_SHARED && !
15d50 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72  MEMDB );.  asser
15d60 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  t( isOpen(pPager
15d70 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 69 66 28 20  ->fd) );..  if( 
15d80 4e 45 56 45 52 28 21 69 73 4f 70 65 6e 28 70 50  NEVER(!isOpen(pP
15d90 61 67 65 72 2d 3e 66 64 29 29 20 29 7b 0a 20 20  ager->fd)) ){.  
15da0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15db0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
15dc0 20 20 6d 65 6d 73 65 74 28 70 50 67 2d 3e 70 44    memset(pPg->pD
15dd0 61 74 61 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  ata, 0, pPager->
15de0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 72  pageSize);.    r
15df0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
15e00 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 61 67 65  .  }..  if( page
15e10 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
15e20 29 7b 0a 20 20 20 20 2f 2a 20 54 72 79 20 74 6f  ){.    /* Try to
15e30 20 70 75 6c 6c 20 74 68 65 20 70 61 67 65 20 66   pull the page f
15e40 72 6f 6d 20 74 68 65 20 77 72 69 74 65 2d 61 68  rom the write-ah
15e50 65 61 64 20 6c 6f 67 2e 20 2a 2f 0a 20 20 20 20  ead log. */.    
15e60 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 52  rc = sqlite3WalR
15e70 65 61 64 28 70 50 61 67 65 72 2d 3e 70 57 61 6c  ead(pPager->pWal
15e80 2c 20 70 67 6e 6f 2c 20 26 69 73 49 6e 57 61 6c  , pgno, &isInWal
15e90 2c 20 70 67 73 7a 2c 20 70 50 67 2d 3e 70 44 61  , pgsz, pPg->pDa
15ea0 74 61 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ta);.  }.  if( r
15eb0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15ec0 21 69 73 49 6e 57 61 6c 20 29 7b 0a 20 20 20 20  !isInWal ){.    
15ed0 69 36 34 20 69 4f 66 66 73 65 74 20 3d 20 28 70  i64 iOffset = (p
15ee0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
15ef0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
15f00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15f10 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
15f20 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70 67 73   pPg->pData, pgs
15f30 7a 2c 20 69 4f 66 66 73 65 74 29 3b 0a 20 20 20  z, iOffset);.   
15f40 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
15f50 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
15f60 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
15f70 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a  QLITE_OK;.    }.
15f80 20 20 7d 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d    }..  if( pgno=
15f90 3d 31 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63  =1 ){.    if( rc
15fa0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
15fb0 74 68 65 20 72 65 61 64 20 69 73 20 75 6e 73 75  the read is unsu
15fc0 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
15fd0 65 20 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 74  e dbFileVers[] t
15fe0 6f 20 73 6f 6d 65 74 68 69 6e 67 0a 20 20 20 20  o something.    
15ff0 20 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 6e    ** that will n
16000 65 76 65 72 20 62 65 20 61 20 76 61 6c 69 64 20  ever be a valid 
16010 66 69 6c 65 20 76 65 72 73 69 6f 6e 2e 20 20 64  file version.  d
16020 62 46 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 61  bFileVers[] is a
16030 20 63 6f 70 79 0a 20 20 20 20 20 20 2a 2a 20 6f   copy.      ** o
16040 66 20 62 79 74 65 73 20 32 34 2e 2e 33 39 20 6f  f bytes 24..39 o
16050 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
16060 20 42 79 74 65 73 20 32 38 2e 2e 33 31 20 73 68   Bytes 28..31 sh
16070 6f 75 6c 64 20 61 6c 77 61 79 73 20 62 65 0a 20  ould always be. 
16080 20 20 20 20 20 2a 2a 20 7a 65 72 6f 2e 20 20 42       ** zero.  B
16090 79 74 65 73 20 33 32 2e 2e 33 35 20 61 6e 64 20  ytes 32..35 and 
160a0 33 35 2e 2e 33 39 20 73 68 6f 75 6c 64 20 62 65  35..39 should be
160b0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 77 68   page numbers wh
160c0 69 63 68 20 61 72 65 0a 20 20 20 20 20 20 2a 2a  ich are.      **
160d0 20 6e 65 76 65 72 20 30 78 66 66 66 66 66 66 66   never 0xfffffff
160e0 66 2e 20 20 53 6f 20 66 69 6c 6c 69 6e 67 20 70  f.  So filling p
160f0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
16100 73 5b 5d 20 77 69 74 68 20 61 6c 6c 20 30 78 66  s[] with all 0xf
16110 66 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73  f.      ** bytes
16120 20 73 68 6f 75 6c 64 20 73 75 66 66 69 63 65 2e   should suffice.
16130 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
16140 2a 2a 20 46 6f 72 20 61 6e 20 65 6e 63 72 79 70  ** For an encryp
16150 74 65 64 20 64 61 74 61 62 61 73 65 2c 20 74 68  ted database, th
16160 65 20 73 69 74 75 61 74 69 6f 6e 20 69 73 20 6d  e situation is m
16170 6f 72 65 20 63 6f 6d 70 6c 65 78 3a 20 20 62 79  ore complex:  by
16180 74 65 73 0a 20 20 20 20 20 20 2a 2a 20 32 34 2e  tes.      ** 24.
16190 2e 33 39 20 6f 66 20 74 68 65 20 64 61 74 61 62  .39 of the datab
161a0 61 73 65 20 61 72 65 20 77 68 69 74 65 20 6e 6f  ase are white no
161b0 69 73 65 2e 20 20 42 75 74 20 74 68 65 20 70 72  ise.  But the pr
161c0 6f 62 61 62 69 6c 69 74 79 20 6f 66 0a 20 20 20  obability of.   
161d0 20 20 20 2a 2a 20 77 68 69 74 65 20 6e 6f 69 73     ** white nois
161e0 69 6e 67 20 65 71 75 61 6c 69 6e 67 20 31 36 20  ing equaling 16 
161f0 62 79 74 65 73 20 6f 66 20 30 78 66 66 20 69 73  bytes of 0xff is
16200 20 76 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61   vanishingly sma
16210 6c 6c 20 73 6f 0a 20 20 20 20 20 20 2a 2a 20 77  ll so.      ** w
16220 65 20 73 68 6f 75 6c 64 20 73 74 69 6c 6c 20 62  e should still b
16230 65 20 6f 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  e ok..      */. 
16240 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 61 67       memset(pPag
16250 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
16260 30 78 66 66 2c 20 73 69 7a 65 6f 66 28 70 50 61  0xff, sizeof(pPa
16270 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
16280 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
16290 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
162a0 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
162b0 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
162c0 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
162d0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64  r->dbFileVers, d
162e0 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f  bFileVers, sizeo
162f0 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
16300 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20  Vers));.    }.  
16310 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
16320 72 2c 20 70 50 67 2d 3e 70 44 61 74 61 2c 20 70  r, pPg->pData, p
16330 67 6e 6f 2c 20 33 2c 20 72 63 20 3d 20 53 51 4c  gno, 3, rc = SQL
16340 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 0a 20 20 50  ITE_NOMEM);..  P
16350 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
16360 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
16370 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f 49  ount);.  PAGER_I
16380 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65 61  NCR(pPager->nRea
16390 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  d);.  IOTRACE(("
163a0 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70  PGIN %p %d\n", p
163b0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
163c0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 46 45   PAGERTRACE(("FE
163d0 54 43 48 20 25 64 20 70 61 67 65 20 25 64 20 68  TCH %d page %d h
163e0 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20  ash(%08x)\n",.  
163f0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
16400 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
16410 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61  no, pager_pageha
16420 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 72 65  sh(pPg)));..  re
16430 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
16440 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
16450 57 41 4c 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  WAL./*.** This f
16460 75 6e 63 74 69 6f 6e 20 69 73 20 69 6e 76 6f 6b  unction is invok
16470 65 64 20 6f 6e 63 65 20 66 6f 72 20 65 61 63 68  ed once for each
16480 20 70 61 67 65 20 74 68 61 74 20 68 61 73 20 61   page that has a
16490 6c 72 65 61 64 79 20 62 65 65 6e 20 0a 2a 2a 20  lready been .** 
164a0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
164b0 20 6c 6f 67 20 66 69 6c 65 20 77 68 65 6e 20 61   log file when a
164c0 20 57 41 4c 20 74 72 61 6e 73 61 63 74 69 6f 6e   WAL transaction
164d0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
164e0 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 69 50  .** Parameter iP
164f0 67 20 69 73 20 74 68 65 20 70 61 67 65 20 6e 75  g is the page nu
16500 6d 62 65 72 20 6f 66 20 73 61 69 64 20 70 61 67  mber of said pag
16510 65 2e 20 54 68 65 20 70 43 74 78 20 61 72 67 75  e. The pCtx argu
16520 6d 65 6e 74 20 0a 2a 2a 20 69 73 20 61 63 74 75  ment .** is actu
16530 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74  ally a pointer t
16540 6f 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  o the Pager stru
16550 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cture..**.** If 
16560 70 61 67 65 20 69 50 67 20 69 73 20 70 72 65 73  page iPg is pres
16570 65 6e 74 20 69 6e 20 74 68 65 20 63 61 63 68 65  ent in the cache
16580 2c 20 61 6e 64 20 68 61 73 20 6e 6f 20 6f 75 74  , and has no out
16590 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
165a0 63 65 73 2c 0a 2a 2a 20 69 74 20 69 73 20 64 69  ces,.** it is di
165b0 73 63 61 72 64 65 64 2e 20 4f 74 68 65 72 77 69  scarded. Otherwi
165c0 73 65 2c 20 69 66 20 74 68 65 72 65 20 61 72 65  se, if there are
165d0 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 75 74   one or more out
165e0 73 74 61 6e 64 69 6e 67 0a 2a 2a 20 72 65 66 65  standing.** refe
165f0 72 65 6e 63 65 73 2c 20 74 68 65 20 70 61 67 65  rences, the page
16600 20 63 6f 6e 74 65 6e 74 20 69 73 20 72 65 6c 6f   content is relo
16610 61 64 65 64 20 66 72 6f 6d 20 74 68 65 20 64 61  aded from the da
16620 74 61 62 61 73 65 2e 20 49 66 20 74 68 65 0a 2a  tabase. If the.*
16630 2a 20 61 74 74 65 6d 70 74 20 74 6f 20 72 65 6c  * attempt to rel
16640 6f 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  oad content from
16650 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
16660 20 72 65 71 75 69 72 65 64 20 61 6e 64 20 66 61   required and fa
16670 69 6c 73 2c 20 0a 2a 2a 20 72 65 74 75 72 6e 20  ils, .** return 
16680 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 20  an SQLite error 
16690 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73 65 2c  code. Otherwise,
166a0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
166b0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 55  tatic int pagerU
166c0 6e 64 6f 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64  ndoCallback(void
166d0 20 2a 70 43 74 78 2c 20 50 67 6e 6f 20 69 50 67   *pCtx, Pgno iPg
166e0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
166f0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72  LITE_OK;.  Pager
16700 20 2a 70 50 61 67 65 72 20 3d 20 28 50 61 67 65   *pPager = (Page
16710 72 20 2a 29 70 43 74 78 3b 0a 20 20 50 67 48 64  r *)pCtx;.  PgHd
16720 72 20 2a 70 50 67 3b 0a 0a 20 20 70 50 67 20 3d  r *pPg;..  pPg =
16730 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
16740 6b 75 70 28 70 50 61 67 65 72 2c 20 69 50 67 29  kup(pPager, iPg)
16750 3b 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  ;.  if( pPg ){. 
16760 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 63     if( sqlite3Pc
16770 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
16780 28 70 50 67 29 3d 3d 31 20 29 7b 0a 20 20 20 20  (pPg)==1 ){.    
16790 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44    sqlite3PcacheD
167a0 72 6f 70 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  rop(pPg);.    }e
167b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
167c0 72 65 61 64 44 62 50 61 67 65 28 70 50 67 29 3b  readDbPage(pPg);
167d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
167e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
167f0 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
16800 6e 69 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20  niter(pPg);.    
16810 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
16820 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29  3PagerUnref(pPg)
16830 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
16840 2a 20 4e 6f 72 6d 61 6c 6c 79 2c 20 69 66 20 61  * Normally, if a
16850 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
16860 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 61 6e 79  rolled back, any
16870 20 62 61 63 6b 75 70 20 70 72 6f 63 65 73 73 65   backup processe
16880 73 20 61 72 65 0a 20 20 2a 2a 20 75 70 64 61 74  s are.  ** updat
16890 65 64 20 61 73 20 64 61 74 61 20 69 73 20 63 6f  ed as data is co
168a0 70 69 65 64 20 6f 75 74 20 6f 66 20 74 68 65 20  pied out of the 
168b0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
168c0 20 61 6e 64 20 69 6e 74 6f 20 74 68 65 0a 20 20   and into the.  
168d0 2a 2a 20 64 61 74 61 62 61 73 65 2e 20 54 68 69  ** database. Thi
168e0 73 20 69 73 20 6e 6f 74 20 67 65 6e 65 72 61 6c  s is not general
168f0 6c 79 20 70 6f 73 73 69 62 6c 65 20 77 69 74 68  ly possible with
16900 20 61 20 57 41 4c 20 64 61 74 61 62 61 73 65 2c   a WAL database,
16910 20 61 73 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63   as.  ** rollbac
16920 6b 20 69 6e 76 6f 6c 76 65 73 20 73 69 6d 70 6c  k involves simpl
16930 79 20 74 72 75 6e 63 61 74 69 6e 67 20 74 68 65  y truncating the
16940 20 6c 6f 67 20 66 69 6c 65 2e 20 54 68 65 72 65   log file. There
16950 66 6f 72 65 2c 20 69 66 20 6f 6e 65 0a 20 20 2a  fore, if one.  *
16960 2a 20 6f 72 20 6d 6f 72 65 20 66 72 61 6d 65 73  * or more frames
16970 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
16980 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
16990 65 20 6c 6f 67 20 28 61 6e 64 20 74 68 65 72 65  e log (and there
169a0 66 6f 72 65 20 0a 20 20 2a 2a 20 61 6c 73 6f 20  fore .  ** also 
169b0 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68 65 20  copied into the 
169c0 62 61 63 6b 75 70 20 64 61 74 61 62 61 73 65 73  backup databases
169d0 29 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 69  ) as part of thi
169e0 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 20  s transaction,. 
169f0 20 2a 2a 20 74 68 65 20 62 61 63 6b 75 70 73 20   ** the backups 
16a00 6d 75 73 74 20 62 65 20 72 65 73 74 61 72 74 65  must be restarte
16a10 64 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65  d..  */.  sqlite
16a20 33 42 61 63 6b 75 70 52 65 73 74 61 72 74 28 70  3BackupRestart(p
16a30 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 29 3b  Pager->pBackup);
16a40 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
16a50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
16a60 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
16a70 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 74 72  to rollback a tr
16a80 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 61 20 57  ansaction on a W
16a90 41 4c 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  AL database..*/.
16aa0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
16ab0 52 6f 6c 6c 62 61 63 6b 57 61 6c 28 50 61 67 65  RollbackWal(Page
16ac0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
16ad0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
16ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
16af0 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a 2f 0a   Return Code */.
16b00 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 3b 20    PgHdr *pList; 
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 64 69 72    /* List of dir
16b30 74 79 20 70 61 67 65 73 20 74 6f 20 72 65 76 65  ty pages to reve
16b40 72 74 20 2a 2f 0a 0a 20 20 2f 2a 20 46 6f 72 20  rt */..  /* For 
16b50 61 6c 6c 20 70 61 67 65 73 20 69 6e 20 74 68 65  all pages in the
16b60 20 63 61 63 68 65 20 74 68 61 74 20 61 72 65 20   cache that are 
16b70 63 75 72 72 65 6e 74 6c 79 20 64 69 72 74 79 20  currently dirty 
16b80 6f 72 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a  or have already.
16b90 20 20 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65    ** been writte
16ba0 6e 20 28 62 75 74 20 6e 6f 74 20 63 6f 6d 6d 69  n (but not commi
16bb0 74 74 65 64 29 20 74 6f 20 74 68 65 20 6c 6f 67  tted) to the log
16bc0 20 66 69 6c 65 2c 20 64 6f 20 6f 6e 65 20 6f 66   file, do one of
16bd0 20 74 68 65 20 0a 20 20 2a 2a 20 66 6f 6c 6c 6f   the .  ** follo
16be0 77 69 6e 67 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  wing:.  **.  ** 
16bf0 20 20 2b 20 44 69 73 63 61 72 64 20 74 68 65 20    + Discard the 
16c00 63 61 63 68 65 64 20 70 61 67 65 20 28 69 66 20  cached page (if 
16c10 72 65 66 63 6f 75 6e 74 3d 3d 30 29 2c 20 6f 72  refcount==0), or
16c20 0a 20 20 2a 2a 20 20 20 2b 20 52 65 6c 6f 61 64  .  **   + Reload
16c30 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 66 72   page content fr
16c40 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 20  om the database 
16c50 28 69 66 20 72 65 66 63 6f 75 6e 74 3e 30 29 2e  (if refcount>0).
16c60 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
16c70 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
16c80 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 72  >dbOrigSize;.  r
16c90 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 55 6e  c = sqlite3WalUn
16ca0 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
16cb0 20 70 61 67 65 72 55 6e 64 6f 43 61 6c 6c 62 61   pagerUndoCallba
16cc0 63 6b 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67  ck, (void *)pPag
16cd0 65 72 29 3b 0a 20 20 70 4c 69 73 74 20 3d 20 73  er);.  pList = s
16ce0 71 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74  qlite3PcacheDirt
16cf0 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50  yList(pPager->pP
16d00 43 61 63 68 65 29 3b 0a 20 20 77 68 69 6c 65 28  Cache);.  while(
16d10 20 70 4c 69 73 74 20 26 26 20 72 63 3d 3d 53 51   pList && rc==SQ
16d20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 50  LITE_OK ){.    P
16d30 67 48 64 72 20 2a 70 4e 65 78 74 20 3d 20 70 4c  gHdr *pNext = pL
16d40 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  ist->pDirty;.   
16d50 20 72 63 20 3d 20 70 61 67 65 72 55 6e 64 6f 43   rc = pagerUndoC
16d60 61 6c 6c 62 61 63 6b 28 28 76 6f 69 64 20 2a 29  allback((void *)
16d70 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
16d80 67 6e 6f 29 3b 0a 20 20 20 20 70 4c 69 73 74 20  gno);.    pList 
16d90 3d 20 70 4e 65 78 74 3b 0a 20 20 7d 0a 0a 20 20  = pNext;.  }..  
16da0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16db0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
16dc0 6e 20 69 73 20 61 20 77 72 61 70 70 65 72 20 61  n is a wrapper a
16dd0 72 6f 75 6e 64 20 73 71 6c 69 74 65 33 57 61 6c  round sqlite3Wal
16de0 46 72 61 6d 65 73 28 29 2e 20 41 73 20 77 65 6c  Frames(). As wel
16df0 6c 20 61 73 20 6c 6f 67 67 69 6e 67 0a 2a 2a 20  l as logging.** 
16e00 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
16e10 74 68 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  the list of page
16e20 73 20 68 65 61 64 65 64 20 62 79 20 70 4c 69 73  s headed by pLis
16e30 74 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  t (connected by 
16e40 70 44 69 72 74 79 29 2c 0a 2a 2a 20 74 68 69 73  pDirty),.** this
16e50 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 69 66 69   function notifi
16e60 65 73 20 61 6e 79 20 61 63 74 69 76 65 20 62 61  es any active ba
16e70 63 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 74  ckup processes t
16e80 68 61 74 20 74 68 65 20 70 61 67 65 73 20 68 61  hat the pages ha
16e90 76 65 0a 2a 2a 20 63 68 61 6e 67 65 64 2e 20 0a  ve.** changed. .
16ea0 2a 2f 20 0a 73 74 61 74 69 63 20 69 6e 74 20 70  */ .static int p
16eb0 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28 0a 20  agerWalFrames(. 
16ec0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74   /* Pager object
16ef0 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4c 69   */.  PgHdr *pLi
16f00 73 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  st,             
16f10 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
16f20 20 66 72 61 6d 65 73 20 74 6f 20 6c 6f 67 20 2a   frames to log *
16f30 2f 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 61  /.  Pgno nTrunca
16f40 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
16f50 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
16f60 73 69 7a 65 20 61 66 74 65 72 20 74 68 69 73 20  size after this 
16f70 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74 20  commit */.  int 
16f80 69 73 43 6f 6d 6d 69 74 2c 20 20 20 20 20 20 20  isCommit,       
16f90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
16fa0 72 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61  rue if this is a
16fb0 20 63 6f 6d 6d 69 74 20 2a 2f 0a 20 20 69 6e 74   commit */.  int
16fc0 20 73 79 6e 63 5f 66 6c 61 67 73 20 20 20 20 20   sync_flags     
16fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
16fe0 46 6c 61 67 73 20 74 6f 20 70 61 73 73 20 74 6f  Flags to pass to
16ff0 20 4f 73 53 79 6e 63 28 29 20 28 6f 72 20 30 29   OsSync() (or 0)
17000 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
17010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17020 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
17030 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73  rn code */..  as
17040 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 57  sert( pPager->pW
17050 61 6c 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  al );.  rc = sql
17060 69 74 65 33 57 61 6c 46 72 61 6d 65 73 28 70 50  ite3WalFrames(pP
17070 61 67 65 72 2d 3e 70 57 61 6c 2c 20 0a 20 20 20  ager->pWal, .   
17080 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
17090 69 7a 65 2c 20 70 4c 69 73 74 2c 20 6e 54 72 75  ize, pList, nTru
170a0 6e 63 61 74 65 2c 20 69 73 43 6f 6d 6d 69 74 2c  ncate, isCommit,
170b0 20 73 79 6e 63 5f 66 6c 61 67 73 0a 20 20 29 3b   sync_flags.  );
170c0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
170d0 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e  E_OK && pPager->
170e0 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20 50  pBackup ){.    P
170f0 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
17100 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
17110 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 20  ->pDirty){.     
17120 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70   sqlite3BackupUp
17130 64 61 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61  date(pPager->pBa
17140 63 6b 75 70 2c 20 70 2d 3e 70 67 6e 6f 2c 20 28  ckup, p->pgno, (
17150 75 38 20 2a 29 70 2d 3e 70 44 61 74 61 29 3b 0a  u8 *)p->pData);.
17160 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
17170 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17180 42 65 67 69 6e 20 61 20 72 65 61 64 20 74 72 61  Begin a read tra
17190 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
171a0 57 41 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  WAL..**.** This 
171b0 72 6f 75 74 69 6e 65 20 75 73 65 64 20 74 6f 20  routine used to 
171c0 62 65 20 63 61 6c 6c 65 64 20 22 70 61 67 65 72  be called "pager
171d0 4f 70 65 6e 53 6e 61 70 73 68 6f 74 28 29 22 20  OpenSnapshot()" 
171e0 62 65 63 61 75 73 65 20 69 74 20 65 73 73 65 6e  because it essen
171f0 74 69 61 6c 6c 79 0a 2a 2a 20 6d 61 6b 65 73 20  tially.** makes 
17200 61 20 73 6e 61 70 73 68 6f 74 20 6f 66 20 74 68  a snapshot of th
17210 65 20 64 61 74 61 62 61 73 65 20 61 74 20 74 68  e database at th
17220 65 20 63 75 72 72 65 6e 74 20 70 6f 69 6e 74 20  e current point 
17230 69 6e 20 74 69 6d 65 20 61 6e 64 20 70 72 65 73  in time and pres
17240 65 72 76 65 73 0a 2a 2a 20 74 68 61 74 20 73 6e  erves.** that sn
17250 61 70 73 68 6f 74 20 66 6f 72 20 75 73 65 20 62  apshot for use b
17260 79 20 74 68 65 20 72 65 61 64 65 72 20 69 6e 20  y the reader in 
17270 73 70 69 74 65 20 6f 66 20 63 6f 6e 63 75 72 72  spite of concurr
17280 65 6e 74 6c 79 20 63 68 61 6e 67 65 73 20 62 79  ently changes by
17290 0a 2a 2a 20 6f 74 68 65 72 20 77 72 69 74 65 72  .** other writer
172a0 73 20 6f 72 20 63 68 65 63 6b 70 6f 69 6e 74 65  s or checkpointe
172b0 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
172c0 74 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64  t pagerBeginRead
172d0 54 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65  Transaction(Page
172e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
172f0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
17300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17310 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
17320 20 20 69 6e 74 20 63 68 61 6e 67 65 64 20 3d 20    int changed = 
17330 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
17340 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
17350 68 65 20 6d 75 73 74 20 62 65 20 72 65 73 65 74  he must be reset
17360 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
17370 61 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65  agerUseWal(pPage
17380 72 29 20 29 3b 0a 0a 20 20 2f 2a 20 73 71 6c 69  r) );..  /* sqli
17390 74 65 33 57 61 6c 45 6e 64 52 65 61 64 54 72 61  te3WalEndReadTra
173a0 6e 73 61 63 74 69 6f 6e 28 29 20 77 61 73 20 6e  nsaction() was n
173b0 6f 74 20 63 61 6c 6c 65 64 20 66 6f 72 20 74 68  ot called for th
173c0 65 20 70 72 65 76 69 6f 75 73 0a 20 20 2a 2a 20  e previous.  ** 
173d0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 6c  transaction in l
173e0 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 45 58 43 4c  ocking_mode=EXCL
173f0 55 53 49 56 45 2e 20 20 53 6f 20 63 61 6c 6c 20  USIVE.  So call 
17400 69 74 20 6e 6f 77 2e 20 20 49 66 20 77 65 0a 20  it now.  If we. 
17410 20 2a 2a 20 61 72 65 20 69 6e 20 6c 6f 63 6b 69   ** are in locki
17420 6e 67 5f 6d 6f 64 65 3d 4e 4f 52 4d 41 4c 20 61  ng_mode=NORMAL a
17430 6e 64 20 45 6e 64 52 65 61 64 28 29 20 77 61 73  nd EndRead() was
17440 20 70 72 65 76 69 6f 75 73 6c 79 20 63 61 6c 6c   previously call
17450 65 64 2c 0a 20 20 2a 2a 20 74 68 65 20 64 75 70  ed,.  ** the dup
17460 6c 69 63 61 74 65 20 63 61 6c 6c 20 69 73 20 68  licate call is h
17470 61 72 6d 6c 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  armless..  */.  
17480 73 71 6c 69 74 65 33 57 61 6c 45 6e 64 52 65 61  sqlite3WalEndRea
17490 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  dTransaction(pPa
174a0 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 0a 20 20 72  ger->pWal);..  r
174b0 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 42 65  c = sqlite3WalBe
174c0 67 69 6e 52 65 61 64 54 72 61 6e 73 61 63 74 69  ginReadTransacti
174d0 6f 6e 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  on(pPager->pWal,
174e0 20 26 63 68 61 6e 67 65 64 29 3b 0a 20 20 69 66   &changed);.  if
174f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
17500 29 7b 0a 20 20 20 20 69 6e 74 20 64 75 6d 6d 79  ){.    int dummy
17510 3b 0a 20 20 20 20 69 66 28 20 63 68 61 6e 67 65  ;.    if( change
17520 64 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  d ){.      pager
17530 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
17540 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17550 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c  ager->errCode ||
17560 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
17570 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  alid==0 );.    }
17580 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17590 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
175a0 70 50 61 67 65 72 2c 20 26 64 75 6d 6d 79 29 3b  pPager, &dummy);
175b0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
175c0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
175d0 52 45 44 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72  RED;..  return r
175e0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  c;.}../*.** Chec
175f0 6b 20 69 66 20 74 68 65 20 2a 2d 77 61 6c 20 66  k if the *-wal f
17600 69 6c 65 20 74 68 61 74 20 63 6f 72 72 65 73 70  ile that corresp
17610 6f 6e 64 73 20 74 6f 20 74 68 65 20 64 61 74 61  onds to the data
17620 62 61 73 65 20 6f 70 65 6e 65 64 20 62 79 20 70  base opened by p
17630 50 61 67 65 72 0a 2a 2a 20 65 78 69 73 74 73 2e  Pager.** exists.
17640 20 41 73 73 75 6d 69 6e 67 20 6e 6f 20 65 72 72   Assuming no err
17650 6f 72 20 6f 63 63 75 72 73 2c 20 73 65 74 20 2a  or occurs, set *
17660 70 45 78 69 73 74 73 20 74 6f 20 31 20 69 66 20  pExists to 1 if 
17670 74 68 65 20 66 69 6c 65 20 65 78 69 73 74 73 2c  the file exists,
17680 0a 2a 2a 20 6f 72 20 30 20 6f 74 68 65 72 77 69  .** or 0 otherwi
17690 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51  se and return SQ
176a0 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20 49  LITE_OK. If an I
176b0 4f 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f  O or OOM error o
176c0 63 63 75 72 73 2c 20 72 65 74 75 72 6e 0a 2a 2a  ccurs, return.**
176d0 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
176e0 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   code..*/.static
176f0 20 69 6e 74 20 70 61 67 65 72 48 61 73 57 41 4c   int pagerHasWAL
17700 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
17710 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b 0a 20  int *pExists){. 
17720 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
17730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17740 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
17750 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 57 61 6c 3b  */.  char *zWal;
17760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17770 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
17780 74 68 65 20 57 41 4c 20 66 69 6c 65 20 2a 2f 0a  the WAL file */.
17790 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
177a0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a  er->tempFile );.
177b0 20 20 7a 57 61 6c 20 3d 20 73 71 6c 69 74 65 33    zWal = sqlite3
177c0 5f 6d 70 72 69 6e 74 66 28 22 25 73 2d 77 61 6c  _mprintf("%s-wal
177d0 22 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  ", pPager->zFile
177e0 6e 61 6d 65 29 3b 0a 20 20 69 66 28 20 21 7a 57  name);.  if( !zW
177f0 61 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  al ){.    rc = S
17800 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d  QLITE_NOMEM;.  }
17810 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
17820 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
17830 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 7a 57 61  Pager->pVfs, zWa
17840 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
17850 5f 45 58 49 53 54 53 2c 20 70 45 78 69 73 74 73  _EXISTS, pExists
17860 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
17870 72 65 65 28 7a 57 61 6c 29 3b 0a 20 20 7d 0a 20  ree(zWal);.  }. 
17880 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
17890 2a 0a 2a 2a 20 43 68 65 63 6b 20 69 66 20 74 68  *.** Check if th
178a0 65 20 2a 2d 77 61 6c 20 66 69 6c 65 20 74 68 61  e *-wal file tha
178b0 74 20 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f  t corresponds to
178c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6f 70   the database op
178d0 65 6e 65 64 20 62 79 20 70 50 61 67 65 72 0a 2a  ened by pPager.*
178e0 2a 20 65 78 69 73 74 73 2e 20 49 66 20 69 74 20  * exists. If it 
178f0 64 6f 65 73 2c 20 6f 70 65 6e 20 74 68 65 20 70  does, open the p
17900 61 67 65 72 20 69 6e 20 57 41 4c 20 6d 6f 64 65  ager in WAL mode
17910 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  . Otherwise, if 
17920 6e 6f 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75  no error.** occu
17930 72 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 50 61  rs, make sure Pa
17940 67 65 72 2e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  ger.journalMode 
17950 69 73 20 6e 6f 74 20 73 65 74 20 74 6f 20 50 41  is not set to PA
17960 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
17970 57 41 4c 2e 0a 2a 2a 20 49 66 20 61 6e 20 49 4f  WAL..** If an IO
17980 20 6f 72 20 4f 4f 4d 20 65 72 72 6f 72 20 6f 63   or OOM error oc
17990 63 75 72 73 2c 20 72 65 74 75 72 6e 20 61 6e 20  curs, return an 
179a0 53 51 4c 69 74 65 20 65 72 72 6f 72 20 63 6f 64  SQLite error cod
179b0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
179c0 57 41 4c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  WAL file is open
179d0 65 64 2c 20 61 6c 73 6f 20 6f 70 65 6e 20 61 20  ed, also open a 
179e0 73 6e 61 70 73 68 6f 74 20 28 72 65 61 64 20 74  snapshot (read t
179f0 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a  ransaction)..**.
17a00 2a 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  ** The caller mu
17a10 73 74 20 68 6f 6c 64 20 61 20 53 48 41 52 45 44  st hold a SHARED
17a20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
17a30 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 63 61  abase file to ca
17a40 6c 6c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  ll this.** funct
17a50 69 6f 6e 2e 20 42 65 63 61 75 73 65 20 61 6e 20  ion. Because an 
17a60 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
17a70 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 69 73  n the db file is
17a80 20 72 65 71 75 69 72 65 64 20 74 6f 20 64 65 6c   required to del
17a90 65 74 65 20 0a 2a 2a 20 61 20 57 41 4c 2c 20 74  ete .** a WAL, t
17aa0 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 65 72  his ensures ther
17ab0 65 20 69 73 20 6e 6f 20 72 61 63 65 20 63 6f 6e  e is no race con
17ac0 64 69 74 69 6f 6e 20 62 65 74 77 65 65 6e 20 74  dition between t
17ad0 68 65 20 78 41 63 63 65 73 73 28 29 20 0a 2a 2a  he xAccess() .**
17ae0 20 62 65 6c 6f 77 20 61 6e 64 20 61 6e 20 78 44   below and an xD
17af0 65 6c 65 74 65 28 29 20 62 65 69 6e 67 20 65 78  elete() being ex
17b00 65 63 75 74 65 64 20 62 79 20 73 6f 6d 65 20 6f  ecuted by some o
17b10 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e  ther connection.
17b20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
17b30 61 67 65 72 4f 70 65 6e 57 61 6c 49 66 50 72 65  agerOpenWalIfPre
17b40 73 65 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  sent(Pager *pPag
17b50 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
17b60 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
17b70 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
17b80 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 73  le ){.    int is
17b90 57 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Wal;            
17ba0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
17bb0 69 66 20 57 41 4c 20 66 69 6c 65 20 65 78 69 73  if WAL file exis
17bc0 74 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70  ts */.    rc = p
17bd0 61 67 65 72 48 61 73 57 41 4c 28 70 50 61 67 65  agerHasWAL(pPage
17be0 72 2c 20 26 69 73 57 61 6c 29 3b 0a 20 20 20 20  r, &isWal);.    
17bf0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17c00 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  K ){.      if( i
17c10 73 57 61 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  sWal ){.        
17c20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
17c30 65 72 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  er);.        rc 
17c40 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  = sqlite3PagerOp
17c50 65 6e 57 61 6c 28 70 50 61 67 65 72 2c 20 30 29  enWal(pPager, 0)
17c60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
17c70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
17c80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
17c90 67 65 72 42 65 67 69 6e 52 65 61 64 54 72 61 6e  gerBeginReadTran
17ca0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b  saction(pPager);
17cb0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17cc0 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67 65   }else if( pPage
17cd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
17ce0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
17cf0 45 5f 57 41 4c 20 29 7b 0a 20 20 20 20 20 20 20  E_WAL ){.       
17d00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17d10 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55  Mode = PAGER_JOU
17d20 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3b  RNALMODE_DELETE;
17d30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
17d40 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
17d50 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
17d60 50 6c 61 79 62 61 63 6b 20 73 61 76 65 70 6f 69  Playback savepoi
17d70 6e 74 20 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f  nt pSavepoint. O
17d80 72 2c 20 69 66 20 70 53 61 76 65 70 6f 69 6e 74  r, if pSavepoint
17d90 3d 3d 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61  ==NULL, then pla
17da0 79 62 61 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74  yback.** the ent
17db0 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
17dc0 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 63 61 73  al file. The cas
17dd0 65 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55  e pSavepoint==NU
17de0 4c 4c 20 6f 63 63 75 72 73 20 77 68 65 6e 20 0a  LL occurs when .
17df0 2a 2a 20 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f  ** a ROLLBACK TO
17e00 20 63 6f 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f   command is invo
17e10 6b 65 64 20 6f 6e 20 61 20 53 41 56 45 50 4f 49  ked on a SAVEPOI
17e20 4e 54 20 74 68 61 74 20 69 73 20 61 20 74 72 61  NT that is a tra
17e30 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76  nsaction .** sav
17e40 65 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68  epoint..**.** Wh
17e50 65 6e 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  en pSavepoint is
17e60 20 6e 6f 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69   not NULL (meani
17e70 6e 67 20 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63  ng a non-transac
17e80 74 69 6f 6e 20 73 61 76 65 70 6f 69 6e 74 20 69  tion savepoint i
17e90 73 20 0a 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c  s .** being roll
17ea0 65 64 20 62 61 63 6b 29 2c 20 74 68 65 6e 20 74  ed back), then t
17eb0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73  he rollback cons
17ec0 69 73 74 73 20 6f 66 20 75 70 20 74 6f 20 74 68  ists of up to th
17ed0 72 65 65 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70  ree stages,.** p
17ee0 65 72 66 6f 72 6d 65 64 20 69 6e 20 74 68 65 20  erformed in the 
17ef0 6f 72 64 65 72 20 73 70 65 63 69 66 69 65 64 3a  order specified:
17f00 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73  .**.**   * Pages
17f10 20 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b   are played back
17f20 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a   from the main j
17f30 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
17f40 61 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f  at byte.**     o
17f50 66 66 73 65 74 20 50 61 67 65 72 53 61 76 65 70  ffset PagerSavep
17f60 6f 69 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64  oint.iOffset and
17f70 20 63 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a   continuing to .
17f80 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
17f90 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74  point.iHdrOffset
17fa0 2c 20 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20  , or to the end 
17fb0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
17fc0 6e 61 6c 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20  nal.**     file 
17fd0 69 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  if PagerSavepoin
17fe0 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
17ff0 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  zero..**.**   * 
18000 49 66 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  If PagerSavepoin
18010 74 2e 69 48 64 72 4f 66 66 73 65 74 20 69 73 20  t.iHdrOffset is 
18020 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70  not zero, then p
18030 61 67 65 73 20 61 72 65 20 70 6c 61 79 65 64 0a  ages are played.
18040 2a 2a 20 20 20 20 20 62 61 63 6b 20 73 74 61 72  **     back star
18050 74 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ting from the jo
18060 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6d 6d  urnal header imm
18070 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69  ediately followi
18080 6e 67 20 0a 2a 2a 20 20 20 20 20 50 61 67 65 72  ng .**     Pager
18090 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
180a0 66 73 65 74 20 74 6f 20 74 68 65 20 65 6e 64 20  fset to the end 
180b0 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  of the main jour
180c0 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
180d0 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 74 68    * Pages are th
180e0 65 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66  en played back f
180f0 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  rom the sub-jour
18100 6e 61 6c 20 66 69 6c 65 2c 20 73 74 61 72 74 69  nal file, starti
18110 6e 67 0a 2a 2a 20 20 20 20 20 77 69 74 68 20 74  ng.**     with t
18120 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
18130 74 2e 69 53 75 62 52 65 63 20 61 6e 64 20 63 6f  t.iSubRec and co
18140 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65 20  ntinuing to the 
18150 65 6e 64 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68  end of.**     th
18160 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
18170 2a 2a 0a 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74  **.** Throughout
18180 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72   the rollback pr
18190 6f 63 65 73 73 2c 20 65 61 63 68 20 74 69 6d 65  ocess, each time
181a0 20 61 20 70 61 67 65 20 69 73 20 72 6f 6c 6c 65   a page is rolle
181b0 64 20 62 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63  d back, the.** c
181c0 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74  orresponding bit
181d0 20 69 73 20 73 65 74 20 69 6e 20 61 20 62 69 74   is set in a bit
181e0 76 65 63 20 73 74 72 75 63 74 75 72 65 20 28 76  vec structure (v
181f0 61 72 69 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e  ariable pDone in
18200 20 74 68 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e   the.** implemen
18210 74 61 74 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54  tation below). T
18220 68 69 73 20 69 73 20 75 73 65 64 20 74 6f 20 65  his is used to e
18230 6e 73 75 72 65 20 74 68 61 74 20 61 20 70 61 67  nsure that a pag
18240 65 20 69 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c  e is only.** rol
18250 6c 65 64 20 62 61 63 6b 20 74 68 65 20 66 69 72  led back the fir
18260 73 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 6e  st time it is en
18270 63 6f 75 6e 74 65 72 65 64 20 69 6e 20 65 69 74  countered in eit
18280 68 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  her journal..**.
18290 2a 2a 20 49 66 20 70 53 61 76 65 70 6f 69 6e 74  ** If pSavepoint
182a0 20 69 73 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70   is NULL, then p
182b0 61 67 65 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c  ages are only pl
182c0 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74  ayed back from t
182d0 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e  he main.** journ
182e0 61 6c 20 66 69 6c 65 2e 20 54 68 65 72 65 20 69  al file. There i
182f0 73 20 6e 6f 20 6e 65 65 64 20 66 6f 72 20 61 20  s no need for a 
18300 62 69 74 76 65 63 20 69 6e 20 74 68 69 73 20 63  bitvec in this c
18310 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69  ase..**.** In ei
18320 74 68 65 72 20 63 61 73 65 2c 20 62 65 66 6f 72  ther case, befor
18330 65 20 70 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65  e playback comme
18340 6e 63 65 73 20 74 68 65 20 50 61 67 65 72 2e 64  nces the Pager.d
18350 62 53 69 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a  bSize variable.*
18360 2a 20 69 73 20 72 65 73 65 74 20 74 6f 20 74 68  * is reset to th
18370 65 20 76 61 6c 75 65 20 74 68 61 74 20 69 74 20  e value that it 
18380 68 65 6c 64 20 61 74 20 74 68 65 20 73 74 61 72  held at the star
18390 74 20 6f 66 20 74 68 65 20 73 61 76 65 70 6f 69  t of the savepoi
183a0 6e 74 20 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73  nt .** (or trans
183b0 61 63 74 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65  action). No page
183c0 20 77 69 74 68 20 61 20 70 61 67 65 2d 6e 75 6d   with a page-num
183d0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
183e0 20 74 68 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69   this value.** i
183f0 73 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 49  s played back. I
18400 66 20 6f 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74  f one is encount
18410 65 72 65 64 20 69 74 20 69 73 20 73 69 6d 70 6c  ered it is simpl
18420 79 20 73 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74  y skipped..*/.st
18430 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 50 6c  atic int pagerPl
18440 61 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28  aybackSavepoint(
18450 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
18460 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70  agerSavepoint *p
18470 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36  Savepoint){.  i6
18480 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
18490 20 20 20 20 20 20 20 2f 2a 20 45 66 66 65 63 74         /* Effect
184a0 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  ive size of the 
184b0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  main journal */.
184c0 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
184d0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 6e             /* En
184e0 64 20 6f 66 20 66 69 72 73 74 20 73 65 67 6d 65  d of first segme
184f0 6e 74 20 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e  nt of main-journ
18500 61 6c 20 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20  al records */.  
18510 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
18520 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65 74 75  OK;      /* Retu
18530 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74  rn code */.  Bit
18540 76 65 63 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20  vec *pDone = 0; 
18550 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
18560 74 6f 20 65 6e 73 75 72 65 20 70 61 67 65 73 20  to ensure pages 
18570 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79  played back only
18580 20 6f 6e 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65   once */..  asse
18590 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
185a0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
185b0 29 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74  );..  /* Allocat
185c0 65 20 61 20 62 69 74 76 65 63 20 74 6f 20 75 73  e a bitvec to us
185d0 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 73  e to store the s
185e0 65 74 20 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c  et of pages roll
185f0 65 64 20 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28  ed back */.  if(
18600 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20   pSavepoint ){. 
18610 20 20 20 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74     pDone = sqlit
18620 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28 70  e3BitvecCreate(p
18630 53 61 76 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67  Savepoint->nOrig
18640 29 3b 0a 20 20 20 20 69 66 28 20 21 70 44 6f 6e  );.    if( !pDon
18650 65 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  e ){.      retur
18660 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
18670 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
18680 53 65 74 20 74 68 65 20 64 61 74 61 62 61 73 65  Set the database
18690 20 73 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68   size back to th
186a0 65 20 76 61 6c 75 65 20 69 74 20 77 61 73 20 62  e value it was b
186b0 65 66 6f 72 65 20 74 68 65 20 73 61 76 65 70 6f  efore the savepo
186c0 69 6e 74 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20  int .  ** being 
186d0 72 65 76 65 72 74 65 64 20 77 61 73 20 6f 70 65  reverted was ope
186e0 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ned..  */.  pPag
186f0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 53 61  er->dbSize = pSa
18700 76 65 70 6f 69 6e 74 20 3f 20 70 53 61 76 65 70  vepoint ? pSavep
18710 6f 69 6e 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50  oint->nOrig : pP
18720 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
18730 3b 0a 0a 20 20 69 66 28 20 21 70 53 61 76 65 70  ;..  if( !pSavep
18740 6f 69 6e 74 20 26 26 20 70 61 67 65 72 55 73 65  oint && pagerUse
18750 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
18760 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 52     return pagerR
18770 6f 6c 6c 62 61 63 6b 57 61 6c 28 70 50 61 67 65  ollbackWal(pPage
18780 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 73  r);.  }..  /* Us
18790 65 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  e pPager->journa
187a0 6c 4f 66 66 20 61 73 20 74 68 65 20 65 66 66 65  lOff as the effe
187b0 63 74 69 76 65 20 73 69 7a 65 20 6f 66 20 74 68  ctive size of th
187c0 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
187d0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 54    ** journal.  T
187e0 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 6d  he actual file m
187f0 69 67 68 74 20 62 65 20 6c 61 72 67 65 72 20 74  ight be larger t
18800 68 61 6e 20 74 68 69 73 20 69 6e 0a 20 20 2a 2a  han this in.  **
18810 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
18820 44 45 5f 54 52 55 4e 43 41 54 45 20 6f 72 20 50  DE_TRUNCATE or P
18830 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
18840 5f 50 45 52 53 49 53 54 2e 20 20 42 75 74 20 61  _PERSIST.  But a
18850 6e 79 74 68 69 6e 67 0a 20 20 2a 2a 20 70 61 73  nything.  ** pas
18860 74 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  t pPager->journa
18870 6c 4f 66 66 20 69 73 20 6f 66 66 2d 6c 69 6d 69  lOff is off-limi
18880 74 73 20 74 6f 20 75 73 2e 0a 20 20 2a 2f 0a 20  ts to us..  */. 
18890 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
188a0 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 61 73 73  ournalOff;.  ass
188b0 65 72 74 28 20 70 61 67 65 72 55 73 65 57 61 6c  ert( pagerUseWal
188c0 28 70 50 61 67 65 72 29 3d 3d 30 20 7c 7c 20 73  (pPager)==0 || s
188d0 7a 4a 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 42  zJ==0 );..  /* B
188e0 65 67 69 6e 20 62 79 20 72 6f 6c 6c 69 6e 67 20  egin by rolling 
188f0 62 61 63 6b 20 72 65 63 6f 72 64 73 20 66 72 6f  back records fro
18900 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e  m the main journ
18910 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 0a 20  al starting at. 
18920 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
18930 6e 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63  nt.iOffset and c
18940 6f 6e 74 69 6e 75 69 6e 67 20 74 6f 20 74 68 65  ontinuing to the
18950 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68 65   next journal he
18960 61 64 65 72 2e 0a 20 20 2a 2a 20 54 68 65 72 65  ader..  ** There
18970 20 6d 69 67 68 74 20 62 65 20 72 65 63 6f 72 64   might be record
18980 73 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 6a 6f  s in the main jo
18990 75 72 6e 61 6c 20 74 68 61 74 20 68 61 76 65 20  urnal that have 
189a0 61 20 70 61 67 65 20 6e 75 6d 62 65 72 0a 20 20  a page number.  
189b0 2a 2a 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  ** greater than 
189c0 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
189d0 62 61 73 65 20 73 69 7a 65 20 28 70 50 61 67 65  base size (pPage
189e0 72 2d 3e 64 62 53 69 7a 65 29 20 62 75 74 20 74  r->dbSize) but t
189f0 68 6f 73 65 0a 20 20 2a 2a 20 77 69 6c 6c 20 62  hose.  ** will b
18a00 65 20 73 6b 69 70 70 65 64 20 61 75 74 6f 6d 61  e skipped automa
18a10 74 69 63 61 6c 6c 79 2e 20 20 50 61 67 65 73 20  tically.  Pages 
18a20 61 72 65 20 61 64 64 65 64 20 74 6f 20 70 44 6f  are added to pDo
18a30 6e 65 20 61 73 20 74 68 65 79 0a 20 20 2a 2a 20  ne as they.  ** 
18a40 61 72 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e  are played back.
18a50 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76  .  */.  if( pSav
18a60 65 70 6f 69 6e 74 20 26 26 20 21 70 61 67 65 72  epoint && !pager
18a70 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
18a80 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20  {.    iHdrOff = 
18a90 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72  pSavepoint->iHdr
18aa0 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f  Offset ? pSavepo
18ab0 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20  int->iHdrOffset 
18ac0 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65  : szJ;.    pPage
18ad0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
18ae0 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66  pSavepoint->iOff
18af0 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  set;.    while( 
18b00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
18b10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18b20 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20  Off<iHdrOff ){. 
18b30 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
18b40 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
18b50 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67 65  e(pPager, &pPage
18b60 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70  r->journalOff, p
18b70 44 6f 6e 65 2c 20 31 2c 20 31 29 3b 0a 20 20 20  Done, 1, 1);.   
18b80 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
18b90 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
18ba0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
18bb0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
18bc0 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  f = 0;.  }..  /*
18bd0 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69 6e   Continue rollin
18be0 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20 6f  g back records o
18bf0 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ut of the main j
18c00 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67 20  ournal starting 
18c10 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72 73  at.  ** the firs
18c20 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  t journal header
18c30 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69 6e   seen and contin
18c40 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20 65  uing until the e
18c50 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20 2a  ffective end.  *
18c60 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a 6f  * of the main jo
18c70 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f 6e  urnal file.  Con
18c80 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f 75  tinue to skip ou
18c90 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73  t-of-range pages
18ca0 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69 6e   and.  ** contin
18cb0 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73 20  ue adding pages 
18cc0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20 70  rolled back to p
18cd0 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  Done..  */.  whi
18ce0 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
18cf0 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  K && pPager->jou
18d00 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a 20  rnalOff<szJ ){. 
18d10 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20 20     u32 ii;      
18d20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
18d30 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33 32  unter */.    u32
18d40 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20 20   nJRec = 0;     
18d50 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
18d60 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
18d70 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
18d80 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
18d90 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 30  nalHdr(pPager, 0
18da0 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26  , szJ, &nJRec, &
18db0 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65  dummy);.    asse
18dc0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
18dd0 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20  ONE );..    /*. 
18de0 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65     ** The "pPage
18df0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
18e00 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
18e10 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
18e20 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a  urnalOff".    **
18e30 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65 64   test is related
18e40 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35   to ticket #2565
18e50 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63 75  .  See the discu
18e60 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20  ssion in the.   
18e70 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61   ** pager_playba
18e80 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f  ck() function fo
18e90 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
18ea0 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  ormation..    */
18eb0 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d  .    if( nJRec==
18ec0 30 20 0a 20 20 20 20 20 26 26 20 70 50 61 67 65  0 .     && pPage
18ed0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f  r->journalHdr+JO
18ee0 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
18ef0 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f  ger)==pPager->jo
18f00 75 72 6e 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a  urnalOff.    ){.
18f10 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 75        nJRec = (u
18f20 33 32 29 28 28 73 7a 4a 20 2d 20 70 50 61 67 65  32)((szJ - pPage
18f30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a  r->journalOff)/J
18f40 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61  OURNAL_PG_SZ(pPa
18f50 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ger));.    }.   
18f60 20 66 6f 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53   for(ii=0; rc==S
18f70 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e  QLITE_OK && ii<n
18f80 4a 52 65 63 20 26 26 20 70 50 61 67 65 72 2d 3e  JRec && pPager->
18f90 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20  journalOff<szJ; 
18fa0 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20  ii++){.      rc 
18fb0 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
18fc0 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
18fd0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
18fe0 61 6c 4f 66 66 2c 20 70 44 6f 6e 65 2c 20 31 2c  alOff, pDone, 1,
18ff0 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   1);.    }.    a
19000 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
19010 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
19020 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
19030 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
19040 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a  >journalOff==szJ
19050 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
19060 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
19070 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
19080 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
19090 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
190a0 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
190b0 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
190c0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
190d0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
190e0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
190f0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
19100 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
19110 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
19120 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
19130 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
19140 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
19150 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
19160 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
19170 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
19180 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
19190 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
191a0 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 55 73  .    if( pagerUs
191b0 65 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a  eWal(pPager) ){.
191c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
191d0 65 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 55 6e  e3WalSavepointUn
191e0 64 6f 28 70 50 61 67 65 72 2d 3e 70 57 61 6c 2c  do(pPager->pWal,
191f0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 61 57 61   pSavepoint->aWa
19200 6c 44 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20  lData);.    }.  
19210 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f    for(ii=pSavepo
19220 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63  int->iSubRec; rc
19230 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
19240 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  i<pPager->nSubRe
19250 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  c; ii++){.      
19260 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d  assert( offset==
19270 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ii*(4+pPager->pa
19280 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20  geSize) );.     
19290 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
192a0 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
192b0 61 67 65 72 2c 20 26 6f 66 66 73 65 74 2c 20 70  ager, &offset, p
192c0 44 6f 6e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  Done, 0, 1);.   
192d0 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 72   }.    assert( r
192e0 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
192f0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
19300 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 44  BitvecDestroy(pD
19310 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  one);.  if( rc==
19320 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19330 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19340 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 0a  Off = szJ;.  }..
19350 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19360 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65  /*.** Change the
19370 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
19380 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
19390 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c 6f  es that are allo
193a0 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  wed..*/.void sql
193b0 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63 68  ite3PagerSetCach
193c0 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
193d0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
193e0 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  {.  sqlite3Pcach
193f0 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eSetCachesize(pP
19400 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 6d  ager->pPCache, m
19410 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  xPage);.}../*.**
19420 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62 75   Adjust the robu
19430 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64 61  stness of the da
19440 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67 65  tabase to damage
19450 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73 68   due to OS crash
19460 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66  es.** or power f
19470 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e 67  ailures by chang
19480 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ing the number o
19490 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e 20  f syncs()s when 
194a0 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72  writing.** the r
194b0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
194c0 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72 65    There are thre
194d0 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20  e levels:.**.** 
194e0 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71 6c     OFF       sql
194f0 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73 20  ite3OsSync() is 
19500 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20 54  never called.  T
19510 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61 75  his is the defau
19520 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  lt.**           
19530 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79     for temporary
19540 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20 66   and transient f
19550 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e  iles..**.**    N
19560 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f 75  ORMAL    The jou
19570 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 6f  rnal is synced o
19580 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  nce before write
19590 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
195a0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
195b0 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 69  atabase.  This i
195c0 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75  s normally adequ
195d0 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20  ate protection, 
195e0 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  but.**          
195f0 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72 65      it is theore
19600 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65  tically possible
19610 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75 6e  , though very un
19620 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20  likely,.**      
19630 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e 20          that an 
19640 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65 72  inopertune power
19650 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c   failure could l
19660 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  eave the journal
19670 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19680 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69 63   in a state whic
19690 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64 61  h would cause da
196a0 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  mage to the data
196b0 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
196c0 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73 20       when it is 
196d0 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  rolled back..**.
196e0 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20 20  **    FULL      
196f0 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  The journal is s
19700 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66 6f  ynced twice befo
19710 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
19720 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
19730 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20         database 
19740 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69 74  (with some addit
19750 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
19760 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69 65  n - the nRec fie
19770 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ld.**           
19780 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61     of the journa
19790 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e 67  l header - being
197a0 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74 77   written in betw
197b0 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20  een the two.**  
197c0 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63              sync
197d0 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75 6d  s).  If we assum
197e0 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20 61  e that writing a
197f0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
19800 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
19810 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20 74  tor is atomic, t
19820 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70 72  hen this mode pr
19830 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20 20  ovides.**       
19840 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63 65         assurance
19850 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
19860 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f  l will not be co
19870 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a 2a  rrupted to the.*
19880 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  *              p
19890 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67 20  oint of causing 
198a0 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
198b0 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72 6f  tabase during ro
198c0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75  llback..**.** Nu
198d0 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73 73  meric values ass
198e0 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
198f0 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f 46  se states are OF
19900 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a  F==1, NORMAL=2,.
19910 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a  ** and FULL=3..*
19920 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
19930 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41 47  _OMIT_PAGER_PRAG
19940 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  MAS.void sqlite3
19950 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c 65  PagerSetSafetyLe
19960 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
19970 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69 6e  r, int level, in
19980 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a 20  t bFullFsync){. 
19990 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
199a0 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20  =  (level==1 || 
199b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
199c0 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72  ) ?1:0;.  pPager
199d0 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c 65  ->fullSync = (le
199e0 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
199f0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31 3a  r->tempFile) ?1:
19a00 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79 6e  0;.  pPager->syn
19a10 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c 6c  c_flags = (bFull
19a20 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59 4e  Fsync?SQLITE_SYN
19a30 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53 59  C_FULL:SQLITE_SY
19a40 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69 66  NC_NORMAL);.  if
19a50 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  ( pPager->noSync
19a60 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53   ) pPager->needS
19a70 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64 69  ync = 0;.}.#endi
19a80 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  f../*.** The fol
19a90 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61  lowing global va
19aa0 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65 6d  riable is increm
19ab0 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20 74  ented whenever t
19ac0 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61 74  he library.** at
19ad0 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20 61  tempts to open a
19ae0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
19af0 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74 69    This informati
19b00 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a  on is used for.*
19b10 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e  * testing and an
19b20 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a 2a  alysis only.  .*
19b30 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
19b40 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
19b50 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 20  _opentemp_count 
19b60 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  = 0;.#endif../*.
19b70 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72  ** Open a tempor
19b80 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ary file..**.** 
19b90 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20 64  Write the file d
19ba0 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a  escriptor into *
19bb0 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53 51  pFile. Return SQ
19bc0 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
19bd0 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20 6f  ss .** or some o
19be0 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
19bf0 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65 20  if we fail. The 
19c00 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
19c10 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74 65  cally .** delete
19c20 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
19c30 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
19c40 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  losed..**.** The
19c50 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 6f   flags passed to
19c60 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20 78   the VFS layer x
19c70 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65 20  Open() call are 
19c80 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64 0a  those specified.
19c90 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72 20  ** by parameter 
19ca0 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77 69  vfsFlags ORed wi
19cb0 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  th the following
19cc0 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c 49  :.**.**     SQLI
19cd0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
19ce0 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f  E.**     SQLITE_
19cf0 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20 20  OPEN_CREATE.**  
19d00 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45     SQLITE_OPEN_E
19d10 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20  XCLUSIVE.**     
19d20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
19d30 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74 61  TEONCLOSE.*/.sta
19d40 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70 65  tic int pagerOpe
19d50 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20 2a  ntemp(.  Pager *
19d60 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 2f  pPager,        /
19d70 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a 65  * The pager obje
19d80 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ct */.  sqlite3_
19d90 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f 2a  file *pFile,  /*
19da0 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
19db0 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65 20  descriptor here 
19dc0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
19dd0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
19de0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
19df0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
19e00 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
19e10 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
19e20 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 23  eturn code */..#
19e30 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
19e40 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  T.  sqlite3_open
19e50 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20 2f  temp_count++;  /
19e60 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69  * Used for testi
19e70 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20  ng and analysis 
19e80 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a  only */.#endif..
19e90 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20 53    vfsFlags |=  S
19ea0 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
19eb0 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50  RITE | SQLITE_OP
19ec0 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20 20  EN_CREATE |.    
19ed0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
19ee0 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c 20  PEN_EXCLUSIVE | 
19ef0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
19f00 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63 20  TEONCLOSE;.  rc 
19f10 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
19f20 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30 2c  pPager->pVfs, 0,
19f30 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67 73   pFile, vfsFlags
19f40 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28 20  , 0);.  assert( 
19f50 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
19f60 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20 29   isOpen(pFile) )
19f70 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19f80 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
19f90 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e  busy handler fun
19fa0 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ction..**.** The
19fb0 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20 74   pager invokes t
19fc0 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
19fd0 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b  if sqlite3OsLock
19fe0 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20 53  () returns .** S
19ff0 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e 20  QLITE_BUSY when 
1a000 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
1a010 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20 74  e from no-lock t
1a020 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c  o a SHARED lock,
1a030 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79 69  .** or when tryi
1a040 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66 72  ng to upgrade fr
1a050 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  om a RESERVED lo
1a060 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53 49  ck to an EXCLUSI
1a070 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74 20  VE .** lock. It 
1a080 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f 6b  does *not* invok
1a090 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  e the busy handl
1a0a0 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e  er when upgradin
1a0b0 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45 44  g from.** SHARED
1a0c0 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f 72   to RESERVED, or
1a0d0 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67 20   when upgrading 
1a0e0 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20 45  from SHARED to E
1a0f0 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68 69  XCLUSIVE.** (whi
1a100 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  ch occurs during
1a110 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
1a120 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79 3a  lback). Summary:
1a130 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69 74  .**.**   Transit
1a140 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  ion             
1a150 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e 76             | Inv
1a160 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c 65  okes xBusyHandle
1a170 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  r.**   ---------
1a180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a190 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1a1a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1a1b0 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20 20  **   NO_LOCK    
1a1c0 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f 43     -> SHARED_LOC
1a1d0 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a 20  K      | Yes.** 
1a1e0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
1a1f0 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  -> RESERVED_LOCK
1a200 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53 48      | No.**   SH
1a210 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20 45  ARED_LOCK   -> E
1a220 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
1a230 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52 56  | No.**   RESERV
1a240 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c 55  ED_LOCK -> EXCLU
1a250 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59 65  SIVE_LOCK   | Ye
1a260 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 62  s.**.** If the b
1a270 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c  usy-handler call
1a280 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f 6e  back returns non
1a290 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b 20  -zero, the lock 
1a2a0 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e 20  is .** retried. 
1a2b0 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a 65  If it returns ze
1a2c0 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51 4c  ro, then the SQL
1a2d0 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20 69  ITE_BUSY error i
1a2e0 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74 6f  s.** returned to
1a2f0 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20 74   the caller of t
1a300 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75 6e  he pager API fun
1a310 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ction..*/.void s
1a320 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42 75  qlite3PagerSetBu
1a330 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61 67  syhandler(.  Pag
1a340 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1a350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a360 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1a370 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42 75  t */.  int (*xBu
1a380 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64 20  syHandler)(void 
1a390 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 50  *),         /* P
1a3a0 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d 68  ointer to busy-h
1a3b0 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 20  andler function 
1a3c0 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73 79  */.  void *pBusy
1a3d0 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20 20  HandlerArg      
1a3e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 67            /* Arg
1a3f0 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74 6f  ument to pass to
1a400 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f   xBusyHandler */
1a410 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d 3e  .){  .  pPager->
1a420 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 78  xBusyHandler = x
1a430 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 70  BusyHandler;.  p
1a440 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1a450 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48 61  lerArg = pBusyHa
1a460 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a  ndlerArg;.}../*.
1a470 2a 2a 20 52 65 70 6f 72 74 20 74 68 65 20 63 75  ** Report the cu
1a480 72 72 65 6e 74 20 70 61 67 65 20 73 69 7a 65 20  rrent page size 
1a490 61 6e 64 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  and number of re
1a4a0 73 65 72 76 65 64 20 62 79 74 65 73 20 62 61 63  served bytes bac
1a4b0 6b 0a 2a 2a 20 74 6f 20 74 68 65 20 63 6f 64 65  k.** to the code
1a4c0 63 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  c..*/.#ifdef SQL
1a4d0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 73 74  ITE_HAS_CODEC.st
1a4e0 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 52  atic void pagerR
1a4f0 65 70 6f 72 74 53 69 7a 65 28 50 61 67 65 72 20  eportSize(Pager 
1a500 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
1a510 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69  pPager->xCodecSi
1a520 7a 65 43 68 6e 67 20 29 7b 0a 20 20 20 20 70 50  zeChng ){.    pP
1a530 61 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65  ager->xCodecSize
1a540 43 68 6e 67 28 70 50 61 67 65 72 2d 3e 70 43 6f  Chng(pPager->pCo
1a550 64 65 63 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  dec, pPager->pag
1a560 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a580 20 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6e    (int)pPager->n
1a590 52 65 73 65 72 76 65 29 3b 0a 20 20 7d 0a 7d 0a  Reserve);.  }.}.
1a5a0 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
1a5b0 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 58  agerReportSize(X
1a5c0 29 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f 70 20 69  )     /* No-op i
1a5d0 66 20 77 65 20 64 6f 20 6e 6f 74 20 73 75 70 70  f we do not supp
1a5e0 6f 72 74 20 61 20 63 6f 64 65 63 20 2a 2f 0a 23  ort a codec */.#
1a5f0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  endif../*.** Cha
1a600 6e 67 65 20 74 68 65 20 70 61 67 65 20 73 69 7a  nge the page siz
1a610 65 20 75 73 65 64 20 62 79 20 74 68 65 20 50 61  e used by the Pa
1a620 67 65 72 20 6f 62 6a 65 63 74 2e 20 54 68 65 20  ger object. The 
1a630 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 0a 2a  new page size .*
1a640 2a 20 69 73 20 70 61 73 73 65 64 20 69 6e 20 2a  * is passed in *
1a650 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a 2a  pPageSize..**.**
1a660 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
1a670 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
1a680 61 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75  ate when this fu
1a690 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1a6a0 2c 20 69 74 0a 2a 2a 20 69 73 20 61 20 6e 6f 2d  , it.** is a no-
1a6b0 6f 70 2e 20 54 68 65 20 76 61 6c 75 65 20 72 65  op. The value re
1a6c0 74 75 72 6e 65 64 20 69 73 20 74 68 65 20 65 72  turned is the er
1a6d0 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20  ror state error 
1a6e0 63 6f 64 65 20 28 69 2e 65 2e 20 0a 2a 2a 20 6f  code (i.e. .** o
1a6f0 6e 65 20 6f 66 20 53 51 4c 49 54 45 5f 49 4f 45  ne of SQLITE_IOE
1a700 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
1a710 50 54 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  PT or SQLITE_FUL
1a720 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  L)..**.** Otherw
1a730 69 73 65 2c 20 69 66 20 61 6c 6c 20 6f 66 20 74  ise, if all of t
1a740 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  he following are
1a750 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a   true:.**.**   *
1a760 20 74 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   the new page si
1a770 7a 65 20 28 76 61 6c 75 65 20 6f 66 20 2a 70 50  ze (value of *pP
1a780 61 67 65 53 69 7a 65 29 20 69 73 20 76 61 6c 69  ageSize) is vali
1a790 64 20 28 61 20 70 6f 77 65 72 20 0a 2a 2a 20 20  d (a power .**  
1a7a0 20 20 20 6f 66 20 74 77 6f 20 62 65 74 77 65 65     of two betwee
1a7b0 6e 20 35 31 32 20 61 6e 64 20 53 51 4c 49 54 45  n 512 and SQLITE
1a7c0 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 2c 20  _MAX_PAGE_SIZE, 
1a7d0 69 6e 63 6c 75 73 69 76 65 29 2c 20 61 6e 64 0a  inclusive), and.
1a7e0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 72 65 20  **.**   * there 
1a7f0 61 72 65 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69  are no outstandi
1a800 6e 67 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ng page referenc
1a810 65 73 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  es, and.**.**   
1a820 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
1a830 73 20 65 69 74 68 65 72 20 6e 6f 74 20 61 6e 20  s either not an 
1a840 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1a850 73 65 20 6f 72 20 69 74 20 69 73 0a 2a 2a 20 20  se or it is.**  
1a860 20 20 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20     an in-memory 
1a870 64 61 74 61 62 61 73 65 20 74 68 61 74 20 63 75  database that cu
1a880 72 72 65 6e 74 6c 79 20 63 6f 6e 73 69 73 74 73  rrently consists
1a890 20 6f 66 20 7a 65 72 6f 20 70 61 67 65 73 2e 0a   of zero pages..
1a8a0 2a 2a 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 70  **.** then the p
1a8b0 61 67 65 72 20 6f 62 6a 65 63 74 20 70 61 67 65  ager object page
1a8c0 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
1a8d0 2a 70 50 61 67 65 53 69 7a 65 2e 0a 2a 2a 0a 2a  *pPageSize..**.*
1a8e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69  * If the page si
1a8f0 7a 65 20 69 73 20 63 68 61 6e 67 65 64 2c 20 74  ze is changed, t
1a900 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
1a910 6e 20 75 73 65 73 20 73 71 6c 69 74 65 33 50 61  n uses sqlite3Pa
1a920 67 65 72 4d 61 6c 6c 6f 63 28 29 20 0a 2a 2a 20  gerMalloc() .** 
1a930 74 6f 20 6f 62 74 61 69 6e 20 61 20 6e 65 77 20  to obtain a new 
1a940 50 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20  Pager.pTmpSpace 
1a950 62 75 66 66 65 72 2e 20 49 66 20 74 68 69 73 20  buffer. If this 
1a960 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d  allocation attem
1a970 70 74 20 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51  pt .** fails, SQ
1a980 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65  LITE_NOMEM is re
1a990 74 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70  turned and the p
1a9a0 61 67 65 20 73 69 7a 65 20 72 65 6d 61 69 6e 73  age size remains
1a9b0 20 75 6e 63 68 61 6e 67 65 64 2e 20 0a 2a 2a 20   unchanged. .** 
1a9c0 49 6e 20 61 6c 6c 20 6f 74 68 65 72 20 63 61 73  In all other cas
1a9d0 65 73 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  es, SQLITE_OK is
1a9e0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
1a9f0 20 49 66 20 74 68 65 20 70 61 67 65 20 73 69 7a   If the page siz
1aa00 65 20 69 73 20 6e 6f 74 20 63 68 61 6e 67 65 64  e is not changed
1aa10 2c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  , either because
1aa20 20 6f 6e 65 20 6f 66 20 74 68 65 20 65 6e 75 6d   one of the enum
1aa30 65 72 61 74 65 64 0a 2a 2a 20 63 6f 6e 64 69 74  erated.** condit
1aa40 69 6f 6e 73 20 61 62 6f 76 65 20 69 73 20 6e 6f  ions above is no
1aa50 74 20 74 72 75 65 2c 20 74 68 65 20 70 61 67 65  t true, the page
1aa60 72 20 77 61 73 20 69 6e 20 65 72 72 6f 72 20 73  r was in error s
1aa70 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
1aa80 2a 20 66 75 6e 63 74 69 6f 6e 20 77 61 73 20 63  * function was c
1aa90 61 6c 6c 65 64 2c 20 6f 72 20 62 65 63 61 75 73  alled, or becaus
1aaa0 65 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6c 6c  e the memory all
1aab0 6f 63 61 74 69 6f 6e 20 61 74 74 65 6d 70 74 20  ocation attempt 
1aac0 66 61 69 6c 65 64 2c 20 0a 2a 2a 20 74 68 65 6e  failed, .** then
1aad0 20 2a 70 50 61 67 65 53 69 7a 65 20 69 73 20 73   *pPageSize is s
1aae0 65 74 20 74 6f 20 74 68 65 20 6f 6c 64 2c 20 72  et to the old, r
1aaf0 65 74 61 69 6e 65 64 20 70 61 67 65 20 73 69 7a  etained page siz
1ab00 65 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  e before returni
1ab10 6e 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ng..*/.int sqlit
1ab20 65 33 50 61 67 65 72 53 65 74 50 61 67 65 73 69  e3PagerSetPagesi
1ab30 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
1ab40 2c 20 75 31 36 20 2a 70 50 61 67 65 53 69 7a 65  , u16 *pPageSize
1ab50 2c 20 69 6e 74 20 6e 52 65 73 65 72 76 65 29 7b  , int nReserve){
1ab60 0a 20 20 69 6e 74 20 72 63 20 3d 20 70 50 61 67  .  int rc = pPag
1ab70 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20  er->errCode;..  
1ab80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1ab90 4b 20 29 7b 0a 20 20 20 20 75 31 36 20 70 61 67  K ){.    u16 pag
1aba0 65 53 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69  eSize = *pPageSi
1abb0 7a 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ze;.    assert( 
1abc0 70 61 67 65 53 69 7a 65 3d 3d 30 20 7c 7c 20 28  pageSize==0 || (
1abd0 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
1abe0 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
1abf0 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 29  E_MAX_PAGE_SIZE)
1ac00 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70 50 61   );.    if( (pPa
1ac10 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 7c 7c  ger->memDb==0 ||
1ac20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d   pPager->dbSize=
1ac30 3d 30 29 0a 20 20 20 20 20 26 26 20 73 71 6c 69  =0).     && sqli
1ac40 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
1ac50 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
1ac60 65 29 3d 3d 30 20 0a 20 20 20 20 20 26 26 20 70  e)==0 .     && p
1ac70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
1ac80 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
1ac90 65 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20  eSize .    ){.  
1aca0 20 20 20 20 63 68 61 72 20 2a 70 4e 65 77 20 3d      char *pNew =
1acb0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
1acc0 50 61 67 65 4d 61 6c 6c 6f 63 28 70 61 67 65 53  PageMalloc(pageS
1acd0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
1ace0 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 20  !pNew ){.       
1acf0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1ad00 45 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  EM;.      }else{
1ad10 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72  .        pager_r
1ad20 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1ad30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 61        pPager->pa
1ad40 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a  geSize = pageSiz
1ad50 65 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e;.        sqlit
1ad60 65 33 50 61 67 65 46 72 65 65 28 70 50 61 67 65  e3PageFree(pPage
1ad70 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
1ad80 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
1ad90 54 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b  TmpSpace = pNew;
1ada0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1adb0 50 63 61 63 68 65 53 65 74 50 61 67 65 53 69 7a  PcacheSetPageSiz
1adc0 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
1add0 65 2c 20 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  e, pageSize);.  
1ade0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1adf0 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 28 75 31  *pPageSize = (u1
1ae00 36 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  6)pPager->pageSi
1ae10 7a 65 3b 0a 20 20 20 20 69 66 28 20 6e 52 65 73  ze;.    if( nRes
1ae20 65 72 76 65 3c 30 20 29 20 6e 52 65 73 65 72 76  erve<0 ) nReserv
1ae30 65 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 73  e = pPager->nRes
1ae40 65 72 76 65 3b 0a 20 20 20 20 61 73 73 65 72 74  erve;.    assert
1ae50 28 20 6e 52 65 73 65 72 76 65 3e 3d 30 20 26 26  ( nReserve>=0 &&
1ae60 20 6e 52 65 73 65 72 76 65 3c 31 30 30 30 20 29   nReserve<1000 )
1ae70 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  ;.    pPager->nR
1ae80 65 73 65 72 76 65 20 3d 20 28 69 31 36 29 6e 52  eserve = (i16)nR
1ae90 65 73 65 72 76 65 3b 0a 20 20 20 20 70 61 67 65  eserve;.    page
1aea0 72 52 65 70 6f 72 74 53 69 7a 65 28 70 50 61 67  rReportSize(pPag
1aeb0 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
1aec0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1aed0 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
1aee0 74 6f 20 74 68 65 20 22 74 65 6d 70 6f 72 61 72  to the "temporar
1aef0 79 20 70 61 67 65 22 20 62 75 66 66 65 72 20 68  y page" buffer h
1af00 65 6c 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  eld internally.*
1af10 2a 20 62 79 20 74 68 65 20 70 61 67 65 72 2e 20  * by the pager. 
1af20 20 54 68 69 73 20 69 73 20 61 20 62 75 66 66 65   This is a buffe
1af30 72 20 74 68 61 74 20 69 73 20 62 69 67 20 65 6e  r that is big en
1af40 6f 75 67 68 20 74 6f 20 68 6f 6c 64 20 74 68 65  ough to hold the
1af50 0a 2a 2a 20 65 6e 74 69 72 65 20 63 6f 6e 74 65  .** entire conte
1af60 6e 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  nt of a database
1af70 20 70 61 67 65 2e 20 20 54 68 69 73 20 62 75 66   page.  This buf
1af80 66 65 72 20 69 73 20 75 73 65 64 20 69 6e 74 65  fer is used inte
1af90 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75 72 69 6e 67  rnally.** during
1afa0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 64 20 77 69   rollback and wi
1afb0 6c 6c 20 62 65 20 6f 76 65 72 77 72 69 74 74 65  ll be overwritte
1afc0 6e 20 77 68 65 6e 65 76 65 72 20 61 20 72 6f 6c  n whenever a rol
1afd0 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e  lback.** occurs.
1afe0 20 20 42 75 74 20 6f 74 68 65 72 20 6d 6f 64 75    But other modu
1aff0 6c 65 73 20 61 72 65 20 66 72 65 65 20 74 6f 20  les are free to 
1b000 75 73 65 20 69 74 20 74 6f 6f 2c 20 61 73 20 6c  use it too, as l
1b010 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c  ong as.** no rol
1b020 6c 62 61 63 6b 73 20 61 72 65 20 68 61 70 70 65  lbacks are happe
1b030 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ning..*/.void *s
1b040 71 6c 69 74 65 33 50 61 67 65 72 54 65 6d 70 53  qlite3PagerTempS
1b050 70 61 63 65 28 50 61 67 65 72 20 2a 70 50 61 67  pace(Pager *pPag
1b060 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
1b070 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
1b080 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  .}../*.** Attemp
1b090 74 20 74 6f 20 73 65 74 20 74 68 65 20 6d 61 78  t to set the max
1b0a0 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 70 61  imum database pa
1b0b0 67 65 20 63 6f 75 6e 74 20 69 66 20 6d 78 50 61  ge count if mxPa
1b0c0 67 65 20 69 73 20 70 6f 73 69 74 69 76 65 2e 20  ge is positive. 
1b0d0 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20 63 68 61 6e  .** Make no chan
1b0e0 67 65 73 20 69 66 20 6d 78 50 61 67 65 20 69 73  ges if mxPage is
1b0f0 20 7a 65 72 6f 20 6f 72 20 6e 65 67 61 74 69 76   zero or negativ
1b100 65 2e 20 20 41 6e 64 20 6e 65 76 65 72 20 72 65  e.  And never re
1b110 64 75 63 65 20 74 68 65 0a 2a 2a 20 6d 61 78 69  duce the.** maxi
1b120 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 20 62  mum page count b
1b130 65 6c 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74  elow the current
1b140 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b150 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67  abase..**.** Reg
1b160 61 72 64 6c 65 73 73 20 6f 66 20 6d 78 50 61 67  ardless of mxPag
1b170 65 2c 20 72 65 74 75 72 6e 20 74 68 65 20 63 75  e, return the cu
1b180 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 70 61  rrent maximum pa
1b190 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74  ge count..*/.int
1b1a0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d 61 78   sqlite3PagerMax
1b1b0 50 61 67 65 43 6f 75 6e 74 28 50 61 67 65 72 20  PageCount(Pager 
1b1c0 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
1b1d0 61 67 65 29 7b 0a 20 20 69 6e 74 20 6e 50 61 67  age){.  int nPag
1b1e0 65 3b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  e;.  if( mxPage>
1b1f0 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
1b200 3e 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65  >mxPgno = mxPage
1b210 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
1b220 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
1b230 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 73  _UNLOCK ){.    s
1b240 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1b250 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 50  ount(pPager, &nP
1b260 61 67 65 29 3b 0a 20 20 20 20 61 73 73 65 72 74  age);.    assert
1b270 28 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f  ( pPager->mxPgno
1b280 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 7d 0a 20  >=nPage );.  }. 
1b290 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1b2a0 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
1b2b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
1b2c0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
1b2d0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
1b2e0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
1b2f0 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
1b300 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
1b310 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
1b320 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
1b330 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
1b340 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
1b350 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
1b360 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
1b370 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
1b380 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
1b390 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
1b3a0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
1b3b0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
1b3c0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
1b3d0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
1b3e0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
1b3f0 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
1b400 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
1b410 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
1b420 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
1b430 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
1b440 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
1b450 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
1b460 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
1b470 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
1b480 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
1b490 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
1b4a0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
1b4b0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
1b4c0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
1b4d0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
1b4e0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
1b4f0 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
1b500 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
1b510 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
1b520 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
1b530 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
1b540 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
1b550 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1b560 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
1b570 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
1b580 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
1b590 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
1b5a0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
1b5b0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
1b5c0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 77  * If the pager w
1b5d0 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61 20 74  as opened on a t
1b5e0 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20 28 7a  ransient file (z
1b5f0 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c 20 6f  Filename==""), o
1b600 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e 20 61  r.** opened on a
1b610 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61 6e 20   file less than 
1b620 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  N bytes in size,
1b630 20 74 68 65 20 6f 75 74 70 75 74 20 62 75 66 66   the output buff
1b640 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65 64 20  er is.** zeroed 
1b650 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  and SQLITE_OK re
1b660 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61 74 69  turned. The rati
1b670 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73 20 69  onale for this i
1b680 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a 2a 20  s that this .** 
1b690 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64  function is used
1b6a0 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
1b6b0 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64 20 61  e headers, and a
1b6c0 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74 20 6f   new transient o
1b6d0 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65 64 20  r.** zero sized 
1b6e0 64 61 74 61 62 61 73 65 20 68 61 73 20 61 20 68  database has a h
1b6f0 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e 73 69  eader than consi
1b700 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f 66 20  sts entirely of 
1b710 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  zeroes..**.** If
1b720 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20 61 70   any IO error ap
1b730 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54 45 5f  art from SQLITE_
1b740 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1b750 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c   is encountered,
1b760 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 63 6f  .** the error co
1b770 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
1b780 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61 6e 64  o the caller and
1b790 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
1b7a0 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 62   the.** output b
1b7b0 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65 64 2e  uffer undefined.
1b7c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1b7d0 61 67 65 72 52 65 61 64 46 69 6c 65 68 65 61 64  agerReadFilehead
1b7e0 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
1b7f0 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
1b800 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
1b810 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1b820 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74 28 70  E_OK;.  memset(p
1b830 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 61  Dest, 0, N);.  a
1b840 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
1b850 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61  ager->fd) || pPa
1b860 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b  ger->tempFile );
1b870 0a 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74  ..  /* This rout
1b880 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
1b890 65 64 20 62 79 20 62 74 72 65 65 20 69 6d 6d 65  ed by btree imme
1b8a0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 63 72  diately after cr
1b8b0 65 61 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  eating.  ** the 
1b8c0 50 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 20 54  Pager object.  T
1b8d0 68 65 72 65 20 68 61 73 20 6e 6f 74 20 62 65 65  here has not bee
1b8e0 6e 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79  n an opportunity
1b8f0 20 74 6f 20 74 72 61 6e 73 69 74 69 6f 6e 0a 20   to transition. 
1b900 20 2a 2a 20 74 6f 20 57 41 4c 20 6d 6f 64 65 20   ** to WAL mode 
1b910 79 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  yet..  */.  asse
1b920 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
1b930 28 70 50 61 67 65 72 29 20 29 3b 0a 23 69 66 20  (pPager) );.#if 
1b940 30 0a 20 20 69 66 28 20 70 61 67 65 72 55 73 65  0.  if( pagerUse
1b950 57 61 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20  Wal(pPager) ){. 
1b960 20 20 20 69 6e 74 20 69 73 49 6e 57 61 6c 20 3d     int isInWal =
1b970 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
1b980 69 74 65 33 57 61 6c 52 65 61 64 28 70 50 61 67  ite3WalRead(pPag
1b990 65 72 2d 3e 70 57 61 6c 2c 20 31 2c 20 26 69 73  er->pWal, 1, &is
1b9a0 49 6e 57 61 6c 2c 20 4e 2c 20 70 44 65 73 74 29  InWal, N, pDest)
1b9b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1b9c0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 49 6e 57  LITE_OK || isInW
1b9d0 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  al ){.      retu
1b9e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
1b9f0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 69  .#endif..  if( i
1ba00 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
1ba10 29 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  ) ){.    IOTRACE
1ba20 28 28 22 44 42 48 44 52 20 25 70 20 30 20 25 64  (("DBHDR %p 0 %d
1ba30 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29  \n", pPager, N))
1ba40 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1ba50 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1ba60 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29  fd, pDest, N, 0)
1ba70 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1ba80 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1ba90 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72  _READ ){.      r
1baa0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1bab0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1bac0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1bad0 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
1bae0 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
1baf0 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1bb00 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
1bb10 0a 2a 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e  .** with pPager.
1bb20 20 4e 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20   Normally, this 
1bb30 69 73 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73  is calculated as
1bb40 20 28 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e   (<db file size>
1bb50 2f 3c 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a  /<page-size>)..*
1bb60 2a 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68  * However, if th
1bb70 65 20 66 69 6c 65 20 69 73 20 62 65 74 77 65 65  e file is betwee
1bb80 6e 20 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69  n 1 and <page-si
1bb90 7a 65 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ze> bytes in siz
1bba0 65 2c 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73  e, then .** this
1bbb0 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61   is considered a
1bbc0 20 31 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a   1 page file..**
1bbd0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1bbe0 20 69 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61   is in error sta
1bbf0 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
1bc00 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c  ction is called,
1bc10 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72   then the.** err
1bc20 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
1bc30 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
1bc40 61 6e 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74  and *pnPage left
1bc50 20 75 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a   unchanged. Or,.
1bc60 2a 2a 20 69 66 20 74 68 65 20 66 69 6c 65 20 73  ** if the file s
1bc70 79 73 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20  ystem has to be 
1bc80 71 75 65 72 69 65 64 20 66 6f 72 20 74 68 65 20  queried for the 
1bc90 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
1bca0 20 61 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72   and.** the quer
1bcb0 79 20 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e  y attempt return
1bcc0 73 20 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74  s an IO error, t
1bcd0 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
1bce0 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
1bcf0 61 6e 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c  and *pnPage is l
1bd00 65 66 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  eft unchanged..*
1bd10 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
1bd20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
1bd30 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65   successful, the
1bd40 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  n SQLITE_OK is r
1bd50 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a  eturned.** and *
1bd60 70 6e 50 61 67 65 20 69 73 20 73 65 74 20 74 6f  pnPage is set to
1bd70 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
1bd80 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
1bd90 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
1bda0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1bdb0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
1bdc0 2c 20 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a  , int *pnPage){.
1bdd0 20 20 50 67 6e 6f 20 6e 50 61 67 65 20 3d 20 30    Pgno nPage = 0
1bde0 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56  ;           /* V
1bdf0 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76  alue to return v
1be00 69 61 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20  ia *pnPage */.. 
1be10 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68   /* Determine th
1be20 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
1be30 73 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53  s in the file. S
1be40 74 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61  tore this in nPa
1be50 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ge. */.  if( pPa
1be60 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
1be70 20 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20   ){.    nPage = 
1be80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
1be90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
1bea0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1beb0 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65       /* Error re
1bec0 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65  turned by OsFile
1bed0 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36  Size() */.    i6
1bee0 34 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20  4 n = 0;        
1bef0 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69        /* File si
1bf00 7a 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75  ze in bytes retu
1bf10 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69  rned by OsFileSi
1bf20 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20 69 66 28  ze() */..    if(
1bf30 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
1bf40 67 65 72 29 20 26 26 20 70 50 61 67 65 72 2d 3e  ger) && pPager->
1bf50 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
1bf60 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  OCK ){.      sql
1bf70 69 74 65 33 57 61 6c 44 62 73 69 7a 65 28 70 50  ite3WalDbsize(pP
1bf80 61 67 65 72 2d 3e 70 57 61 6c 2c 20 26 6e 50 61  ager->pWal, &nPa
1bf90 67 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ge);.    }..    
1bfa0 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29 7b 0a  if( nPage==0 ){.
1bfb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
1bfc0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29  Open(pPager->fd)
1bfd0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
1bfe0 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20 69 66  File );.      if
1bff0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
1c000 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  >fd) ){.        
1c010 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28  if( SQLITE_OK!=(
1c020 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
1c030 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66  leSize(pPager->f
1c040 64 2c 20 26 6e 29 29 20 29 7b 0a 20 20 20 20 20  d, &n)) ){.     
1c050 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
1c060 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1c070 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1c080 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
1c090 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
1c0a0 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e  >0 && n<pPager->
1c0b0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
1c0c0 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
1c0d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1c0e0 20 20 20 20 6e 50 61 67 65 20 3d 20 28 50 67 6e      nPage = (Pgn
1c0f0 6f 29 28 6e 20 2f 20 70 50 61 67 65 72 2d 3e 70  o)(n / pPager->p
1c100 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1c110 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
1c120 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1c130 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
1c140 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c150 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
1c160 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
1c170 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
1c180 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
1c190 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  izeValid = 1;.  
1c1a0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1c1b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
1c1c0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
1c1d0 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
1c1e0 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ter than the .  
1c1f0 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
1c200 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
1c210 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
1c220 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
1c230 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
1c240 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
1c250 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
1c260 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
1c270 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
1c280 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
1c290 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPage;.  }..  /*
1c2a0 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
1c2b0 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74  variable and ret
1c2c0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f  urn SQLITE_OK */
1c2d0 0a 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e 50 61  .  *pnPage = nPa
1c2e0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ge;.  return SQL
1c2f0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  ITE_OK;.}.../*.*
1c300 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20  * Try to obtain 
1c310 61 20 6c 6f 63 6b 20 6f 66 20 74 79 70 65 20 6c  a lock of type l
1c320 6f 63 6b 74 79 70 65 20 6f 6e 20 74 68 65 20 64  ocktype on the d
1c330 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1c340 0a 2a 2a 20 61 20 73 69 6d 69 6c 61 72 20 6f 72  .** a similar or
1c350 20 67 72 65 61 74 65 72 20 6c 6f 63 6b 20 69 73   greater lock is
1c360 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 74   already held, t
1c370 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1c380 61 20 6e 6f 2d 6f 70 0a 2a 2a 20 28 72 65 74 75  a no-op.** (retu
1c390 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b 20  rning SQLITE_OK 
1c3a0 69 6d 6d 65 64 69 61 74 65 6c 79 29 2e 0a 2a 2a  immediately)..**
1c3b0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61  .** Otherwise, a
1c3c0 74 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e  ttempt to obtain
1c3d0 20 74 68 65 20 6c 6f 63 6b 20 75 73 69 6e 67 20   the lock using 
1c3e0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 2e  sqlite3OsLock().
1c3f0 20 49 6e 76 6f 6b 65 20 0a 2a 2a 20 74 68 65 20   Invoke .** the 
1c400 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
1c410 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 63 75 72   the lock is cur
1c420 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c  rently not avail
1c430 61 62 6c 65 2e 20 52 65 70 65 61 74 20 0a 2a 2a  able. Repeat .**
1c440 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
1c450 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
1c460 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
1c470 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20 0a  the attempt to .
1c480 2a 2a 20 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f  ** obtain the lo
1c490 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
1c4a0 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
1c4b0 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
1c4c0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
1c4d0 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
1c4e0 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
1c4f0 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20 69 73  . If the lock is
1c500 20 6f 62 74 61 69 6e 65 64 20 73 75 63 63 65 73   obtained succes
1c510 73 66 75 6c 6c 79 2c 20 73 65 74 20 74 68 65 20  sfully, set the 
1c520 50 61 67 65 72 2e 73 74 61 74 65 20 0a 2a 2a 20  Pager.state .** 
1c530 76 61 72 69 61 62 6c 65 20 74 6f 20 6c 6f 63 6b  variable to lock
1c540 74 79 70 65 20 62 65 66 6f 72 65 20 72 65 74 75  type before retu
1c550 72 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  rning..*/.static
1c560 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f   int pager_wait_
1c570 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  on_lock(Pager *p
1c580 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74  Pager, int lockt
1c590 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20  ype){.  int rc; 
1c5a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1c5c0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
1c5d0 20 20 2f 2a 20 54 68 65 20 4f 53 20 6c 6f 63 6b    /* The OS lock
1c5e0 20 76 61 6c 75 65 73 20 6d 75 73 74 20 62 65 20   values must be 
1c5f0 74 68 65 20 73 61 6d 65 20 61 73 20 74 68 65 20  the same as the 
1c600 50 61 67 65 72 20 6c 6f 63 6b 20 76 61 6c 75 65  Pager lock value
1c610 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 50  s */.  assert( P
1c620 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53 48 41  AGER_SHARED==SHA
1c630 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  RED_LOCK );.  as
1c640 73 65 72 74 28 20 50 41 47 45 52 5f 52 45 53 45  sert( PAGER_RESE
1c650 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44 5f 4c  RVED==RESERVED_L
1c660 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
1c670 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1c680 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  ==EXCLUSIVE_LOCK
1c690 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65   );..  /* If the
1c6a0 20 66 69 6c 65 20 69 73 20 63 75 72 72 65 6e 74   file is current
1c6b0 6c 79 20 75 6e 6c 6f 63 6b 65 64 20 74 68 65 6e  ly unlocked then
1c6c0 20 74 68 65 20 73 69 7a 65 20 6d 75 73 74 20 62   the size must b
1c6d0 65 20 75 6e 6b 6e 6f 77 6e 2e 20 49 74 0a 20 20  e unknown. It.  
1c6e0 2a 2a 20 6d 75 73 74 20 6e 6f 74 20 68 61 76 65  ** must not have
1c6f0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
1c700 74 20 74 68 69 73 20 70 6f 69 6e 74 2e 0a 20 20  t this point..  
1c710 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
1c720 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1c730 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
1c740 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
1c750 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1c760 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1c770 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 70  AGER_SHARED || p
1c780 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
1c790 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68  d==0 );..  /* Ch
1c7a0 65 63 6b 20 74 68 61 74 20 74 68 69 73 20 69 73  eck that this is
1c7b0 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20   either a no-op 
1c7c0 28 62 65 63 61 75 73 65 20 74 68 65 20 72 65 71  (because the req
1c7d0 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a  uested lock is .
1c7e0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c    ** already hel
1c7f0 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65  d, or one of the
1c800 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68   transistions th
1c810 61 74 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  at the busy-hand
1c820 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20  ler.  ** may be 
1c830 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20  invoked during, 
1c840 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65  according to the
1c850 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20   comment above. 
1c860 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
1c870 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29  SetBusyhandler()
1c880 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  ..  */.  assert(
1c890 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e   (pPager->state>
1c8a0 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20  =locktype).     
1c8b0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
1c8c0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1c8d0 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50  K && locktype==P
1c8e0 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
1c8f0 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
1c900 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
1c910 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70  ERVED && locktyp
1c920 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e==PAGER_EXCLUSI
1c930 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20  VE).  );..  if( 
1c940 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
1c950 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
1c960 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
1c970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b   }else{.    do {
1c980 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1c990 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
1c9a0 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
1c9b0 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
1c9c0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
1c9d0 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e  pPager->xBusyHan
1c9e0 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75  dler(pPager->pBu
1c9f0 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b  syHandlerArg) );
1ca00 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1ca10 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ca20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1ca30 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20  (u8)locktype;.  
1ca40 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f      IOTRACE(("LO
1ca50 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  CK %p %d\n", pPa
1ca60 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a  ger, locktype)).
1ca70 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1ca80 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1ca90 46 75 6e 63 74 69 6f 6e 20 61 73 73 65 72 74 54  Function assertT
1caa0 72 75 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e  runcateConstrain
1cab0 74 28 70 50 61 67 65 72 29 20 63 68 65 63 6b 73  t(pPager) checks
1cac0 20 74 68 61 74 20 6f 6e 65 20 6f 66 20 74 68 65   that one of the
1cad0 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   .** following i
1cae0 73 20 74 72 75 65 20 66 6f 72 20 61 6c 6c 20 64  s true for all d
1caf0 69 72 74 79 20 70 61 67 65 73 20 63 75 72 72 65  irty pages curre
1cb00 6e 74 6c 79 20 69 6e 20 74 68 65 20 70 61 67 65  ntly in the page
1cb10 2d 63 61 63 68 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  -cache:.**.**   
1cb20 61 29 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  a) The page numb
1cb30 65 72 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  er is less than 
1cb40 6f 72 20 65 71 75 61 6c 20 74 6f 20 74 68 65 20  or equal to the 
1cb50 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20  size of the .** 
1cb60 20 20 20 20 20 63 75 72 72 65 6e 74 20 64 61 74       current dat
1cb70 61 62 61 73 65 20 69 6d 61 67 65 2c 20 69 6e 20  abase image, in 
1cb80 70 61 67 65 73 2c 20 4f 52 0a 2a 2a 0a 2a 2a 20  pages, OR.**.** 
1cb90 20 20 62 29 20 69 66 20 74 68 65 20 70 61 67 65    b) if the page
1cba0 20 63 6f 6e 74 65 6e 74 20 77 65 72 65 20 77 72   content were wr
1cbb0 69 74 74 65 6e 20 61 74 20 74 68 69 73 20 74 69  itten at this ti
1cbc0 6d 65 2c 20 69 74 20 77 6f 75 6c 64 20 6e 6f 74  me, it would not
1cbd0 0a 2a 2a 20 20 20 20 20 20 62 65 20 6e 65 63 65  .**      be nece
1cbe0 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20 74  ssary to write t
1cbf0 68 65 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65  he current conte
1cc00 6e 74 20 6f 75 74 20 74 6f 20 74 68 65 20 73 75  nt out to the su
1cc10 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  b-journal.**    
1cc20 20 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64    (as determined
1cc30 20 62 79 20 66 75 6e 63 74 69 6f 6e 20 73 75 62   by function sub
1cc40 6a 52 65 71 75 69 72 65 73 50 61 67 65 28 29 29  jRequiresPage())
1cc50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1cc60 6f 6e 64 69 74 69 6f 6e 20 61 73 73 65 72 74 65  ondition asserte
1cc70 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
1cc80 6f 6e 20 77 65 72 65 20 6e 6f 74 20 74 72 75 65  on were not true
1cc90 2c 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 69 72  , and the.** dir
1cca0 74 79 20 70 61 67 65 20 77 65 72 65 20 74 6f 20  ty page were to 
1ccb0 62 65 20 64 69 73 63 61 72 64 65 64 20 66 72 6f  be discarded fro
1ccc0 6d 20 74 68 65 20 63 61 63 68 65 20 76 69 61 20  m the cache via 
1ccd0 74 68 65 20 70 61 67 65 72 53 74 72 65 73 73 28  the pagerStress(
1cce0 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 2c 20 70 61  ).** routine, pa
1ccf0 67 65 72 53 74 72 65 73 73 28 29 20 77 6f 75 6c  gerStress() woul
1cd00 64 20 6e 6f 74 20 77 72 69 74 65 20 74 68 65 20  d not write the 
1cd10 63 75 72 72 65 6e 74 20 70 61 67 65 20 63 6f 6e  current page con
1cd20 74 65 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 64  tent to.** the d
1cd30 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
1cd40 20 61 20 73 61 76 65 70 6f 69 6e 74 20 74 72 61   a savepoint tra
1cd50 6e 73 61 63 74 69 6f 6e 20 77 65 72 65 20 72 6f  nsaction were ro
1cd60 6c 6c 65 64 20 62 61 63 6b 20 61 66 74 65 72 0a  lled back after.
1cd70 2a 2a 20 74 68 69 73 20 68 61 70 70 65 6e 65 64  ** this happened
1cd80 2c 20 74 68 65 20 63 6f 72 72 65 63 74 20 62 65  , the correct be
1cd90 68 61 76 69 6f 75 72 20 77 6f 75 6c 64 20 62 65  haviour would be
1cda0 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20   to restore the 
1cdb0 63 75 72 72 65 6e 74 0a 2a 2a 20 63 6f 6e 74 65  current.** conte
1cdc0 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20  nt of the page. 
1cdd0 48 6f 77 65 76 65 72 2c 20 73 69 6e 63 65 20 74  However, since t
1cde0 68 69 73 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e  his content is n
1cdf0 6f 74 20 70 72 65 73 65 6e 74 20 69 6e 20 65 69  ot present in ei
1ce00 74 68 65 72 0a 2a 2a 20 74 68 65 20 64 61 74 61  ther.** the data
1ce10 62 61 73 65 20 66 69 6c 65 20 6f 72 20 74 68 65  base file or the
1ce20 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20   portion of the 
1ce30 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ce40 20 61 6e 64 20 0a 2a 2a 20 73 75 62 2d 6a 6f 75   and .** sub-jou
1ce50 72 6e 61 6c 20 72 6f 6c 6c 65 64 20 62 61 63 6b  rnal rolled back
1ce60 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 63 6f 75   the content cou
1ce70 6c 64 20 6e 6f 74 20 62 65 20 72 65 73 74 6f 72  ld not be restor
1ce80 65 64 20 61 6e 64 20 74 68 65 0a 2a 2a 20 64 61  ed and the.** da
1ce90 74 61 62 61 73 65 20 69 6d 61 67 65 20 77 6f 75  tabase image wou
1cea0 6c 64 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70  ld become corrup
1ceb0 74 2e 20 49 74 20 69 73 20 74 68 65 72 65 66 6f  t. It is therefo
1cec0 72 65 20 66 6f 72 74 75 6e 61 74 65 20 74 68 61  re fortunate tha
1ced0 74 20 0a 2a 2a 20 74 68 69 73 20 63 69 72 63 75  t .** this circu
1cee0 6d 73 74 61 6e 63 65 20 63 61 6e 6e 6f 74 20 61  mstance cannot a
1cef0 72 69 73 65 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rise..*/.#if def
1cf00 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1cf10 47 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  G).static void a
1cf20 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1cf30 73 74 72 61 69 6e 74 43 62 28 50 67 48 64 72 20  straintCb(PgHdr 
1cf40 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74 28  *pPg){.  assert(
1cf50 20 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44   pPg->flags&PGHD
1cf60 52 5f 44 49 52 54 59 20 29 3b 0a 20 20 61 73 73  R_DIRTY );.  ass
1cf70 65 72 74 28 20 21 73 75 62 6a 52 65 71 75 69 72  ert( !subjRequir
1cf80 65 73 50 61 67 65 28 70 50 67 29 20 7c 7c 20 70  esPage(pPg) || p
1cf90 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 67 2d 3e 70  Pg->pgno<=pPg->p
1cfa0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b  Pager->dbSize );
1cfb0 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  .}.static void a
1cfc0 73 73 65 72 74 54 72 75 6e 63 61 74 65 43 6f 6e  ssertTruncateCon
1cfd0 73 74 72 61 69 6e 74 28 50 61 67 65 72 20 2a 70  straint(Pager *p
1cfe0 50 61 67 65 72 29 7b 0a 20 20 73 71 6c 69 74 65  Pager){.  sqlite
1cff0 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44 69  3PcacheIterateDi
1d000 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43 61  rty(pPager->pPCa
1d010 63 68 65 2c 20 61 73 73 65 72 74 54 72 75 6e 63  che, assertTrunc
1d020 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 43 62 29  ateConstraintCb)
1d030 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69  ;.}.#else.# defi
1d040 6e 65 20 61 73 73 65 72 74 54 72 75 6e 63 61 74  ne assertTruncat
1d050 65 43 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67  eConstraint(pPag
1d060 65 72 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  er).#endif../*.*
1d070 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
1d080 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1d090 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
1d0a0 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
1d0b0 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
1d0c0 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
1d0d0 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
1d0e0 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
1d0f0 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
1d100 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
1d110 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
1d120 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
1d130 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
1d140 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
1d150 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
1d160 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1d170 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  is committed..*/
1d180 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
1d190 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
1d1a0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
1d1b0 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
1d1c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
1d1d0 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61  SizeValid );.  a
1d1e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
1d1f0 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
1d200 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1d210 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
1d220 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61  ESERVED );.  pPa
1d230 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
1d240 61 67 65 3b 0a 20 20 61 73 73 65 72 74 54 72 75  age;.  assertTru
1d250 6e 63 61 74 65 43 6f 6e 73 74 72 61 69 6e 74 28  ncateConstraint(
1d260 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pPager);.}.../*.
1d270 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1d280 20 69 73 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   is called befor
1d290 65 20 61 74 74 65 6d 70 74 69 6e 67 20 61 20 68  e attempting a h
1d2a0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1d2b0 61 63 6b 2e 20 49 74 0a 2a 2a 20 73 79 6e 63 73  ack. It.** syncs
1d2c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1d2d0 65 20 74 6f 20 64 69 73 6b 2c 20 74 68 65 6e 20  e to disk, then 
1d2e0 73 65 74 73 20 70 50 61 67 65 72 2d 3e 6a 6f 75  sets pPager->jou
1d2f0 72 6e 61 6c 48 64 72 20 74 6f 20 74 68 65 0a 2a  rnalHdr to the.*
1d300 2a 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  * size of the jo
1d310 75 72 6e 61 6c 20 66 69 6c 65 20 73 6f 20 74 68  urnal file so th
1d320 61 74 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  at the pager_pla
1d330 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
1d340 6b 6e 6f 77 73 0a 2a 2a 20 74 68 61 74 20 74 68  knows.** that th
1d350 65 20 65 6e 74 69 72 65 20 6a 6f 75 72 6e 61 6c  e entire journal
1d360 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73   file has been s
1d370 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 53 79 6e  ynced..**.** Syn
1d380 63 69 6e 67 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  cing a hot-journ
1d390 61 6c 20 74 6f 20 64 69 73 6b 20 62 65 66 6f 72  al to disk befor
1d3a0 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20  e attempting to 
1d3b0 72 6f 6c 6c 20 69 74 20 62 61 63 6b 20 65 6e 73  roll it back ens
1d3c0 75 72 65 73 20 0a 2a 2a 20 74 68 61 74 20 69 66  ures .** that if
1d3d0 20 61 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65   a power-failure
1d3e0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 74   occurs during t
1d3f0 68 65 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65  he rollback, the
1d400 20 70 72 6f 63 65 73 73 20 74 68 61 74 0a 2a 2a   process that.**
1d410 20 61 74 74 65 6d 70 74 73 20 72 6f 6c 6c 62 61   attempts rollba
1d420 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 79 73  ck following sys
1d430 74 65 6d 20 72 65 63 6f 76 65 72 79 20 73 65 65  tem recovery see
1d440 73 20 74 68 65 20 73 61 6d 65 20 6a 6f 75 72 6e  s the same journ
1d450 61 6c 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 61 73  al.** content as
1d460 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a 2a   this process..*
1d470 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74 68 69  *.** If everythi
1d480 6e 67 20 67 6f 65 73 20 61 73 20 70 6c 61 6e 6e  ng goes as plann
1d490 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ed, SQLITE_OK is
1d4a0 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
1d4b0 77 69 73 65 2c 20 0a 2a 2a 20 61 6e 20 53 51 4c  wise, .** an SQL
1d4c0 69 74 65 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  ite error code..
1d4d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1d4e0 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e 61  gerSyncHotJourna
1d4f0 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
1d500 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
1d510 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 21 70  ITE_OK;.  if( !p
1d520 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1d530 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1d540 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
1d550 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
1d560 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 7d 0a 20 20  _NORMAL);.  }.  
1d570 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d580 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
1d590 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1d5a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
1d5b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
1d5c0 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1d5d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
1d5e0 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
1d5f0 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
1d600 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
1d610 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
1d620 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
1d630 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
1d640 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
1d650 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1d660 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
1d670 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
1d680 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
1d690 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
1d6a0 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
1d6b0 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
1d6c0 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
1d6d0 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
1d6e0 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
1d6f0 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
1d700 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
1d710 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
1d720 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
1d730 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
1d740 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
1d750 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
1d760 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
1d770 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
1d780 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
1d790 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
1d7a0 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
1d7b0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
1d7c0 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
1d7d0 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
1d7e0 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
1d7f0 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
1d800 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
1d810 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
1d820 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
1d830 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1d840 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
1d850 2a 70 50 61 67 65 72 29 7b 0a 20 20 75 38 20 2a  *pPager){.  u8 *
1d860 70 54 6d 70 20 3d 20 28 75 38 20 2a 29 70 50 61  pTmp = (u8 *)pPa
1d870 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
1d880 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  .  disable_simul
1d890 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29  ated_io_errors()
1d8a0 3b 0a 20 20 73 71 6c 69 74 65 33 42 65 67 69 6e  ;.  sqlite3Begin
1d8b0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
1d8c0 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
1d8d0 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
1d8e0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d  >exclusiveMode =
1d8f0 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   0;.#ifndef SQLI
1d900 54 45 5f 4f 4d 49 54 5f 57 41 4c 0a 20 20 73 71  TE_OMIT_WAL.  sq
1d910 6c 69 74 65 33 57 61 6c 43 6c 6f 73 65 28 70 50  lite3WalClose(pP
1d920 61 67 65 72 2d 3e 70 57 61 6c 2c 0a 20 20 20 20  ager->pWal,.    
1d930 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  (pPager->noSync 
1d940 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79  ? 0 : pPager->sy
1d950 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20 20 20 20  nc_flags), .    
1d960 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1d970 2c 20 70 54 6d 70 0a 20 20 29 3b 0a 20 20 70 50  , pTmp.  );.  pP
1d980 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b 0a  ager->pWal = 0;.
1d990 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 5f 72  #endif.  pager_r
1d9a0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1d9b0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1d9c0 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
1d9d0 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ager);.  }else{.
1d9e0 20 20 20 20 2f 2a 20 53 65 74 20 50 61 67 65 72      /* Set Pager
1d9f0 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74 6f 20 2d  .journalHdr to -
1da00 31 20 66 6f 72 20 74 68 65 20 62 65 6e 65 66 69  1 for the benefi
1da10 74 20 6f 66 20 74 68 65 20 70 61 67 65 72 5f 70  t of the pager_p
1da20 6c 61 79 62 61 63 6b 28 29 20 0a 20 20 20 20 2a  layback() .    *
1da30 2a 20 63 61 6c 6c 20 77 68 69 63 68 20 6d 61 79  * call which may
1da40 20 62 65 20 6d 61 64 65 20 66 72 6f 6d 20 77 69   be made from wi
1da50 74 68 69 6e 20 70 61 67 65 72 55 6e 6c 6f 63 6b  thin pagerUnlock
1da60 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29 2e 20 49  AndRollback(). I
1da70 66 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6e  f it.    ** is n
1da80 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20  ot -1, then the 
1da90 75 6e 73 79 6e 63 65 64 20 70 6f 72 74 69 6f 6e  unsynced portion
1daa0 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72   of an open jour
1dab0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a 20 20 20  nal file may.   
1dac0 20 2a 2a 20 62 65 20 70 6c 61 79 65 64 20 62 61   ** be played ba
1dad0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
1dae0 62 61 73 65 2e 20 49 66 20 61 20 70 6f 77 65 72  base. If a power
1daf0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
1db00 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68 69  while.    ** thi
1db10 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 2c 20  s is happening, 
1db20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d 61 79  the database may
1db30 20 62 65 63 6f 6d 65 20 63 6f 72 72 75 70 74 2e   become corrupt.
1db40 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1db50 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
1db60 66 64 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61  fd) ){.      pPa
1db70 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 70  ger->errCode = p
1db80 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f 75 72 6e  agerSyncHotJourn
1db90 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1dba0 7d 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  }.    pagerUnloc
1dbb0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
1dbc0 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ger);.  }.  sqli
1dbd0 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
1dbe0 6f 63 28 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  oc();.  enable_s
1dbf0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
1dc00 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
1dc10 43 45 28 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE(("CLOSE %d\n"
1dc20 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1dc30 29 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  )));.  IOTRACE((
1dc40 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50  "CLOSE %p\n", pP
1dc50 61 67 65 72 29 29 0a 20 20 73 71 6c 69 74 65 33  ager)).  sqlite3
1dc60 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
1dc70 66 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61  fd);.  sqlite3Pa
1dc80 67 65 46 72 65 65 28 70 54 6d 70 29 3b 0a 20 20  geFree(pTmp);.  
1dc90 73 71 6c 69 74 65 33 50 63 61 63 68 65 43 6c 6f  sqlite3PcacheClo
1dca0 73 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  se(pPager->pPCac
1dcb0 68 65 29 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c  he);..#ifdef SQL
1dcc0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20  ITE_HAS_CODEC.  
1dcd0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  if( pPager->xCod
1dce0 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d  ecFree ) pPager-
1dcf0 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67  >xCodecFree(pPag
1dd00 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 23 65 6e  er->pCodec);.#en
1dd10 64 69 66 0a 0a 20 20 61 73 73 65 72 74 28 20 21  dif..  assert( !
1dd20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
1dd30 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e 70  nt && !pPager->p
1dd40 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  InJournal );.  a
1dd50 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
1dd60 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21  Pager->jfd) && !
1dd70 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73  isOpen(pPager->s
1dd80 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71 6c 69 74  jfd) );..  sqlit
1dd90 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
1dda0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ddb0 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  _OK;.}..#if !def
1ddc0 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
1ddd0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1dde0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
1ddf0 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  n the page numbe
1de00 72 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  r for page pPg..
1de10 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50  */.Pgno sqlite3P
1de20 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44  agerPagenumber(D
1de30 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
1de40 65 74 75 72 6e 20 70 50 67 2d 3e 70 67 6e 6f 3b  eturn pPg->pgno;
1de50 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
1de60 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Increment the r
1de70 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
1de80 6f 72 20 70 61 67 65 20 70 50 67 2e 0a 2a 2f 0a  or page pPg..*/.
1de90 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
1dea0 72 52 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  rRef(DbPage *pPg
1deb0 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
1dec0 68 65 52 65 66 28 70 50 67 29 3b 0a 7d 0a 0a 2f  heRef(pPg);.}../
1ded0 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
1dee0 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68 65 72 20  urnal. In other 
1def0 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
1df00 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
1df10 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
1df20 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
1df30 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
1df40 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
1df50 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
1df60 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20 63 61 6e  .** disk and can
1df70 20 62 65 20 72 65 73 74 6f 72 65 64 20 69 6e 20   be restored in 
1df80 74 68 65 20 65 76 65 6e 74 20 6f 66 20 61 20 68  the event of a h
1df90 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62  ot-journal rollb
1dfa0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
1dfb0 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1dfc0 20 66 6c 61 67 20 69 73 20 6e 6f 74 20 73 65 74   flag is not set
1dfd0 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
1dfe0 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20 6e 6f 2d  tion is a.** no-
1dff0 6f 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74  op. Otherwise, t
1e000 68 65 20 61 63 74 69 6f 6e 73 20 72 65 71 75 69  he actions requi
1e010 72 65 64 20 64 65 70 65 6e 64 20 6f 6e 20 74 68  red depend on th
1e020 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 0a 2a  e journal-mode.*
1e030 2a 20 61 6e 64 20 74 68 65 20 64 65 76 69 63 65  * and the device
1e040 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
1e050 20 6f 66 20 74 68 65 20 74 68 65 20 66 69 6c 65   of the the file
1e060 2d 73 79 73 74 65 6d 2c 20 61 73 20 66 6f 6c 6c  -system, as foll
1e070 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49  ows:.**.**   * I
1e080 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
1e090 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  le is an in-memo
1e0a0 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ry journal file,
1e0b0 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65 65 64 0a   no action need.
1e0c0 2a 2a 20 20 20 20 20 62 65 20 74 61 6b 65 6e 2e  **     be taken.
1e0d0 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74 68 65 72  .**.**   * Other
1e0e0 77 69 73 65 2c 20 69 66 20 74 68 65 20 64 65 76  wise, if the dev
1e0f0 69 63 65 20 64 6f 65 73 20 6e 6f 74 20 73 75 70  ice does not sup
1e100 70 6f 72 74 20 74 68 65 20 53 41 46 45 5f 41 50  port the SAFE_AP
1e110 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2c 0a 2a  PEND property,.*
1e120 2a 20 20 20 20 20 74 68 65 6e 20 74 68 65 20 6e  *     then the n
1e130 52 65 63 20 66 69 65 6c 64 20 6f 66 20 74 68 65  Rec field of the
1e140 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20 77   most recently w
1e150 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61 6c 20 68  ritten journal h
1e160 65 61 64 65 72 0a 2a 2a 20 20 20 20 20 69 73 20  eader.**     is 
1e170 75 70 64 61 74 65 64 20 74 6f 20 63 6f 6e 74 61  updated to conta
1e180 69 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  in the number of
1e190 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 73   journal records
1e1a0 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 20 20   that have.**   
1e1b0 20 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 66    been written f
1e1c0 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20 49 66 20  ollowing it. If 
1e1d0 74 68 65 20 70 61 67 65 72 20 69 73 20 6f 70 65  the pager is ope
1e1e0 72 61 74 69 6e 67 20 69 6e 20 66 75 6c 6c 2d 73  rating in full-s
1e1f0 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f 64 65 2c  ync.**     mode,
1e200 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1e210 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64  l file is synced
1e220 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 69 65   before this fie
1e230 6c 64 20 69 73 20 75 70 64 61 74 65 64 2e 0a 2a  ld is updated..*
1e240 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  *.**   * If the 
1e250 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1e260 73 75 70 70 6f 72 74 20 74 68 65 20 53 45 51 55  support the SEQU
1e270 45 4e 54 49 41 4c 20 70 72 6f 70 65 72 74 79 2c  ENTIAL property,
1e280 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20 20 6a 6f   then .**     jo
1e290 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79  urnal file is sy
1e2a0 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20  nced..**.** Or, 
1e2b0 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64 65 3a 0a  in pseudo-code:.
1e2c0 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e 4f 54 20  **.**   if( NOT 
1e2d0 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e  <in-memory journ
1e2e0 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20 20 69 66  al> ){.**     if
1e2f0 28 20 4e 4f 54 20 53 41 46 45 5f 41 50 50 45 4e  ( NOT SAFE_APPEN
1e300 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20 20 69 66  D ){.**       if
1e310 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  ( <full-sync mod
1e320 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72  e> ) xSync(<jour
1e330 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20  nal file>);.**  
1e340 20 20 20 20 20 3c 75 70 64 61 74 65 20 6e 52 65       <update nRe
1e350 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20 20 20 20  c field>.**     
1e360 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28 20 4e 4f  } .**     if( NO
1e370 54 20 53 45 51 55 45 4e 54 49 41 4c 20 29 20 78  T SEQUENTIAL ) x
1e380 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69  Sync(<journal fi
1e390 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a 2a 2a 0a  le>);.**   }.**.
1e3a0 2a 2a 20 54 68 65 20 50 61 67 65 72 2e 6e 65 65  ** The Pager.nee
1e3b0 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 65  dSync flag is ne
1e3c0 76 65 72 20 62 65 20 73 65 74 20 66 6f 72 20 74  ver be set for t
1e3d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 2c 20  emporary files, 
1e3e0 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c 65 20 6f  or any.** file o
1e3f0 70 65 72 61 74 69 6e 67 20 69 6e 20 6e 6f 2d 73  perating in no-s
1e400 79 6e 63 20 6d 6f 64 65 20 28 50 61 67 65 72 2e  ync mode (Pager.
1e410 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f 20 6e 6f  noSync set to no
1e420 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a 2a 20 49  n-zero)..**.** I
1e430 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74 68  f successful, th
1e440 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
1e450 73 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44  s the PGHDR_NEED
1e460 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66 20 65 76  _SYNC flag of ev
1e470 65 72 79 20 0a 2a 2a 20 70 61 67 65 20 63 75 72  ery .** page cur
1e480 72 65 6e 74 6c 79 20 68 65 6c 64 20 69 6e 20 6d  rently held in m
1e490 65 6d 6f 72 79 20 62 65 66 6f 72 65 20 72 65 74  emory before ret
1e4a0 75 72 6e 69 6e 67 20 53 51 4c 49 54 45 5f 4f 4b  urning SQLITE_OK
1e4b0 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a 20 65 72  . If an IO.** er
1e4c0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
1e4d0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 49 4f 20  ed, then the IO 
1e4e0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
1e4f0 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61  turned to the ca
1e500 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ller..*/.static 
1e510 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  int syncJournal(
1e520 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1e530 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
1e540 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 61 73  edSync ){.    as
1e550 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
1e560 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 69  empFile );.    i
1e570 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1e580 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f  alMode!=PAGER_JO
1e590 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
1e5a0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
1e5b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1e5c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1e5d0 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
1e5e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
1e5f0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
1e600 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
1e610 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
1e620 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1e630 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
1e640 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20 20 20 69  jfd) );..      i
1e650 66 28 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  f( 0==(iDc&SQLIT
1e660 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1e670 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 20 20  END) ){.        
1e680 2f 2a 20 54 68 69 73 20 62 6c 6f 63 6b 20 64 65  /* This block de
1e690 61 6c 73 20 77 69 74 68 20 61 6e 20 6f 62 73 63  als with an obsc
1e6a0 75 72 65 20 70 72 6f 62 6c 65 6d 2e 20 49 66 20  ure problem. If 
1e6b0 74 68 65 20 6c 61 73 74 20 63 6f 6e 6e 65 63 74  the last connect
1e6c0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ion.        ** t
1e6d0 68 61 74 20 77 72 6f 74 65 20 74 6f 20 74 68 69  hat wrote to thi
1e6e0 73 20 64 61 74 61 62 61 73 65 20 77 61 73 20 6f  s database was o
1e6f0 70 65 72 61 74 69 6e 67 20 69 6e 20 70 65 72 73  perating in pers
1e700 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 0a 20  istent-journal. 
1e710 20 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65 2c 20         ** mode, 
1e720 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
1e730 20 66 69 6c 65 20 6d 61 79 20 61 74 20 74 68 69   file may at thi
1e740 73 20 70 6f 69 6e 74 20 61 63 74 75 61 6c 6c 79  s point actually
1e750 20 62 65 20 6c 61 72 67 65 72 0a 20 20 20 20 20   be larger.     
1e760 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1e770 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 62 79 74 65  .journalOff byte
1e780 73 2e 20 49 66 20 74 68 65 20 6e 65 78 74 20 74  s. If the next t
1e790 68 69 6e 67 20 69 6e 20 74 68 65 20 6a 6f 75 72  hing in the jour
1e7a0 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  nal.        ** f
1e7b0 69 6c 65 20 68 61 70 70 65 6e 73 20 74 6f 20 62  ile happens to b
1e7c0 65 20 61 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  e a journal-head
1e7d0 65 72 20 28 77 72 69 74 74 65 6e 20 61 73 20 70  er (written as p
1e7e0 61 72 74 20 6f 66 20 74 68 65 0a 20 20 20 20 20  art of the.     
1e7f0 20 20 20 2a 2a 20 70 72 65 76 69 6f 75 73 20 63     ** previous c
1e800 6f 6e 6e 65 63 74 69 6f 6e 27 73 20 74 72 61 6e  onnection's tran
1e810 73 61 63 74 69 6f 6e 29 2c 20 61 6e 64 20 61 20  saction), and a 
1e820 63 72 61 73 68 20 6f 72 20 70 6f 77 65 72 2d 66  crash or power-f
1e830 61 69 6c 75 72 65 20 0a 20 20 20 20 20 20 20 20  ailure .        
1e840 2a 2a 20 6f 63 63 75 72 73 20 61 66 74 65 72 20  ** occurs after 
1e850 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20  nRec is updated 
1e860 62 75 74 20 62 65 66 6f 72 65 20 74 68 69 73 20  but before this 
1e870 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 72 69 74 65  connection write
1e880 73 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e  s .        ** an
1e890 79 74 68 69 6e 67 20 65 6c 73 65 20 74 6f 20 74  ything else to t
1e8a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1e8b0 28 6f 72 20 63 6f 6d 6d 69 74 73 2f 72 6f 6c 6c  (or commits/roll
1e8c0 73 20 62 61 63 6b 20 69 74 73 20 0a 20 20 20 20  s back its .    
1e8d0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1e8e0 6f 6e 29 2c 20 74 68 65 6e 20 53 51 4c 69 74 65  on), then SQLite
1e8f0 20 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 6e 66   may become conf
1e900 75 73 65 64 20 77 68 65 6e 20 64 6f 69 6e 67 20  used when doing 
1e910 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  the .        ** 
1e920 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
1e930 62 61 63 6b 20 66 6f 6c 6c 6f 77 69 6e 67 20 72  back following r
1e940 65 63 6f 76 65 72 79 2e 20 49 74 20 6d 61 79 20  ecovery. It may 
1e950 72 6f 6c 6c 20 62 61 63 6b 20 61 6c 6c 0a 20 20  roll back all.  
1e960 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 69 73        ** of this
1e970 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 64 61 74   connections dat
1e980 61 2c 20 74 68 65 6e 20 70 72 6f 63 65 65 64 20  a, then proceed 
1e990 74 6f 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  to rolling back 
1e9a0 74 68 65 20 6f 6c 64 2c 0a 20 20 20 20 20 20 20  the old,.       
1e9b0 20 2a 2a 20 6f 75 74 2d 6f 66 2d 64 61 74 65 20   ** out-of-date 
1e9c0 64 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77  data that follow
1e9d0 73 20 69 74 2e 20 44 61 74 61 62 61 73 65 20 63  s it. Database c
1e9e0 6f 72 72 75 70 74 69 6f 6e 2e 0a 20 20 20 20 20  orruption..     
1e9f0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1ea00 20 54 6f 20 77 6f 72 6b 20 61 72 6f 75 6e 64 20   To work around 
1ea10 74 68 69 73 2c 20 69 66 20 74 68 65 20 6a 6f 75  this, if the jou
1ea20 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 61  rnal file does a
1ea30 70 70 65 61 72 20 74 6f 20 63 6f 6e 74 61 69 6e  ppear to contain
1ea40 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 76 61  .        ** a va
1ea50 6c 69 64 20 68 65 61 64 65 72 20 66 6f 6c 6c 6f  lid header follo
1ea60 77 69 6e 67 20 50 61 67 65 72 2e 6a 6f 75 72 6e  wing Pager.journ
1ea70 61 6c 4f 66 66 2c 20 74 68 65 6e 20 77 72 69 74  alOff, then writ
1ea80 65 20 61 20 30 78 30 30 0a 20 20 20 20 20 20 20  e a 0x00.       
1ea90 20 2a 2a 20 62 79 74 65 20 74 6f 20 74 68 65 20   ** byte to the 
1eaa0 73 74 61 72 74 20 6f 66 20 69 74 20 74 6f 20 70  start of it to p
1eab0 72 65 76 65 6e 74 20 69 74 20 66 72 6f 6d 20 62  revent it from b
1eac0 65 69 6e 67 20 72 65 63 6f 67 6e 69 7a 65 64 2e  eing recognized.
1ead0 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
1eae0 20 20 20 20 2a 2a 20 56 61 72 69 61 62 6c 65 20      ** Variable 
1eaf0 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20 69  iNextHdrOffset i
1eb00 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66 66  s set to the off
1eb10 73 65 74 20 61 74 20 77 68 69 63 68 20 74 68 69  set at which thi
1eb20 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  s.        ** pro
1eb30 62 6c 65 6d 61 74 69 63 20 68 65 61 64 65 72 20  blematic header 
1eb40 77 69 6c 6c 20 6f 63 63 75 72 2c 20 69 66 20 69  will occur, if i
1eb50 74 20 65 78 69 73 74 73 2e 20 61 4d 61 67 69 63  t exists. aMagic
1eb60 20 69 73 20 75 73 65 64 20 0a 20 20 20 20 20 20   is used .      
1eb70 20 20 2a 2a 20 61 73 20 61 20 74 65 6d 70 6f 72    ** as a tempor
1eb80 61 72 79 20 62 75 66 66 65 72 20 74 6f 20 69 6e  ary buffer to in
1eb90 73 70 65 63 74 20 74 68 65 20 66 69 72 73 74 20  spect the first 
1eba0 63 6f 75 70 6c 65 20 6f 66 20 62 79 74 65 73 20  couple of bytes 
1ebb0 6f 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  of.        ** th
1ebc0 65 20 70 6f 74 65 6e 74 69 61 6c 20 6a 6f 75 72  e potential jour
1ebd0 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 20 20  nal header..    
1ebe0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
1ebf0 36 34 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65  64 iNextHdrOffse
1ec00 74 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  t;.        u8 aM
1ec10 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
1ec20 20 75 38 20 7a 48 65 61 64 65 72 5b 73 69 7a 65   u8 zHeader[size
1ec30 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
1ec40 29 2b 34 5d 3b 0a 0a 20 20 20 20 20 20 20 20 6d  )+4];..        m
1ec50 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61  emcpy(zHeader, a
1ec60 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
1ec70 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
1ec80 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 70 75  ic));.        pu
1ec90 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
1eca0 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
1ecb0 4d 61 67 69 63 29 5d 2c 20 70 50 61 67 65 72 2d  Magic)], pPager-
1ecc0 3e 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 20  >nRec);..       
1ecd0 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 20   iNextHdrOffset 
1ece0 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73  = journalHdrOffs
1ecf0 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
1ed00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ed10 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a  OsRead(pPager->j
1ed20 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 69  fd, aMagic, 8, i
1ed30 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29 3b 0a  NextHdrOffset);.
1ed40 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
1ed50 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d  SQLITE_OK && 0==
1ed60 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
1ed70 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
1ed80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74   ){.          st
1ed90 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20 7a 65  atic const u8 ze
1eda0 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20 20 20  robyte = 0;.    
1edb0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1edc0 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1edd0 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79 74 65  ->jfd, &zerobyte
1ede0 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f 66 66  , 1, iNextHdrOff
1edf0 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  set);.        }.
1ee00 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1ee10 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21  SQLITE_OK && rc!
1ee20 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
1ee30 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
1ee40 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ee50 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1ee60 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
1ee70 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f   nRec value into
1ee80 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ee90 65 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a  e header. If in.
1eea0 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d          ** full-
1eeb0 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65  synchronous mode
1eec0 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  , sync the journ
1eed0 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65  al first. This e
1eee0 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20  nsures that.    
1eef0 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20      ** all data 
1ef00 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74  has really hit t
1ef10 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e  he disk before n
1ef20 52 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74  Rec is updated t
1ef30 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a  o mark.        *
1ef40 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64  * it as a candid
1ef50 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b  ate for rollback
1ef60 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
1ef70 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20       ** This is 
1ef80 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69 66 20  not required if 
1ef90 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 6d  the persistent m
1efa0 65 64 69 61 20 73 75 70 70 6f 72 74 73 20 74 68  edia supports th
1efb0 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 41 46  e.        ** SAF
1efc0 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74  E_APPEND propert
1efd0 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20 74 68  y. Because in th
1efe0 69 73 20 63 61 73 65 20 69 74 20 69 73 20 6e 6f  is case it is no
1eff0 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20 20 20  t possible .    
1f000 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72 62 61      ** for garba
1f010 67 65 20 64 61 74 61 20 74 6f 20 62 65 20 61 70  ge data to be ap
1f020 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 66 69  pended to the fi
1f030 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66 69 65  le, the nRec fie
1f040 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 73  ld.        ** is
1f050 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74 68 20   populated with 
1f060 30 78 46 46 46 46 46 46 46 46 20 77 68 65 6e 20  0xFFFFFFFF when 
1f070 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
1f080 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a 20 20  er is written.  
1f090 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76        ** and nev
1f0a0 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65 20 75  er needs to be u
1f0b0 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20 20 20  pdated..        
1f0c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1f0d0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1f0e0 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
1f0f0 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49  E_IOCAP_SEQUENTI
1f100 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  AL) ){.         
1f110 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53 59   PAGERTRACE(("SY
1f120 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
1f130 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1f140 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20 20 20  ger)));.        
1f150 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53 59 4e    IOTRACE(("JSYN
1f160 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
1f170 29 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ).          rc =
1f180 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
1f190 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
1f1a0 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b  er->sync_flags);
1f1b0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1f1c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1f1d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f1e0 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52    }.        IOTR
1f1f0 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25 6c  ACE(("JHDR %p %l
1f200 6c 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  ld\n", pPager, p
1f210 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1f220 72 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  r));.        rc 
1f230 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
1f240 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  (.            pP
1f250 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64  ager->jfd, zHead
1f260 65 72 2c 20 73 69 7a 65 6f 66 28 7a 48 65 61 64  er, sizeof(zHead
1f270 65 72 29 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  er), pPager->jou
1f280 72 6e 61 6c 48 64 72 0a 20 20 20 20 20 20 20 20  rnalHdr.        
1f290 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1f2a0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1f2b0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f2c0 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
1f2d0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1f2e0 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
1f2f0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1f300 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1f310 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1f320 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1f330 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1f340 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1f350 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
1f360 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1f370 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1f380 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1f390 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
1f3a0 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1f3b0 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
1f3c0 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
1f3d0 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
1f3e0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1f3f0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1f400 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1f410 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1f420 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
1f430 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75  file was just su
1f440 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
1f450 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65  d. Set Pager.nee
1f460 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f  dSync .    ** to
1f470 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20   zero and clear 
1f480 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1f490 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20  YNC flag on all 
1f4a0 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20  pagess..    */. 
1f4b0 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1f4c0 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
1f4d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1f4e0 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  ted = 1;.    pPa
1f4f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
1f500 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
1f510 6c 4f 66 66 3b 0a 20 20 20 20 73 71 6c 69 74 65  lOff;.    sqlite
1f520 33 50 63 61 63 68 65 43 6c 65 61 72 53 79 6e 63  3PcacheClearSync
1f530 46 6c 61 67 73 28 70 50 61 67 65 72 2d 3e 70 50  Flags(pPager->pP
1f540 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a 20 20 72  Cache);.  }..  r
1f550 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1f560 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 61 72  .}../*.** The ar
1f570 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 66 69  gument is the fi
1f580 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b 65 64 20  rst in a linked 
1f590 6c 69 73 74 20 6f 66 20 64 69 72 74 79 20 70 61  list of dirty pa
1f5a0 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 0a 2a 2a  ges connected.**
1f5b0 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
1f5c0 69 72 74 79 20 70 6f 69 6e 74 65 72 2e 20 54 68  irty pointer. Th
1f5d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74  is function writ
1f5e0 65 73 20 65 61 63 68 20 6f 6e 65 20 6f 66 20 74  es each one of t
1f5f0 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  he.** in-memory 
1f600 70 61 67 65 73 20 69 6e 20 74 68 65 20 6c 69 73  pages in the lis
1f610 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
1f620 65 20 66 69 6c 65 2e 20 54 68 65 20 61 72 67 75  e file. The argu
1f630 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62 65 20 4e  ment may.** be N
1f640 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e 74 69 6e  ULL, representin
1f650 67 20 61 6e 20 65 6d 70 74 79 20 6c 69 73 74 2e  g an empty list.
1f660 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
1f670 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a  is function is.*
1f680 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  * a no-op..**.**
1f690 20 54 68 65 20 70 61 67 65 72 20 6d 75 73 74 20   The pager must 
1f6a0 68 6f 6c 64 20 61 74 20 6c 65 61 73 74 20 61 20  hold at least a 
1f6b0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 77 68  RESERVED lock wh
1f6c0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
1f6d0 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2e 20 42  .** is called. B
1f6e0 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 61 6e  efore writing an
1f6f0 79 74 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  ything to the da
1f700 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 69  tabase file, thi
1f710 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 75 70 67  s lock.** is upg
1f720 72 61 64 65 64 20 74 6f 20 61 6e 20 45 58 43 4c  raded to an EXCL
1f730 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 74  USIVE lock. If t
1f740 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 20 62  he lock cannot b
1f750 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a 2a 20 53  e obtained,.** S
1f760 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72 65  QLITE_BUSY is re
1f770 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f 20 64 61  turned and no da
1f780 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
1f790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f7a0 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66 20 74 68  le..** .** If th
1f7b0 65 20 70 61 67 65 72 20 69 73 20 61 20 74 65 6d  e pager is a tem
1f7c0 70 2d 66 69 6c 65 20 70 61 67 65 72 20 61 6e 64  p-file pager and
1f7d0 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1f7e0 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a 2a 2a 20  -system file.** 
1f7f0 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e 2c  is not yet open,
1f800 20 69 74 20 69 73 20 63 72 65 61 74 65 64 20 61   it is created a
1f810 6e 64 20 6f 70 65 6e 65 64 20 62 65 66 6f 72 65  nd opened before
1f820 20 61 6e 79 20 64 61 74 61 20 69 73 20 0a 2a 2a   any data is .**
1f830 20 77 72 69 74 74 65 6e 20 6f 75 74 2e 0a 2a 2a   written out..**
1f840 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20 6c 6f 63  .** Once the loc
1f850 6b 20 68 61 73 20 62 65 65 6e 20 75 70 67 72 61  k has been upgra
1f860 64 65 64 20 61 6e 64 2c 20 69 66 20 6e 65 63 65  ded and, if nece
1f870 73 73 61 72 79 2c 20 74 68 65 20 66 69 6c 65 20  ssary, the file 
1f880 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68 65 20 70  opened,.** the p
1f890 61 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e  ages are written
1f8a0 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1f8b0 62 61 73 65 20 66 69 6c 65 20 69 6e 20 6c 69 73  base file in lis
1f8c0 74 20 6f 72 64 65 72 2e 20 57 72 69 74 69 6e 67  t order. Writing
1f8d0 0a 2a 2a 20 61 20 70 61 67 65 20 69 73 20 73 6b  .** a page is sk
1f8e0 69 70 70 65 64 20 69 66 20 69 74 20 6d 65 65 74  ipped if it meet
1f8f0 73 20 65 69 74 68 65 72 20 6f 66 20 74 68 65 20  s either of the 
1f900 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65 72  following criter
1f910 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  ia:.**.**   * Th
1f920 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73  e page number is
1f930 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 50 61   greater than Pa
1f940 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f 72 0a 2a  ger.dbSize, or.*
1f950 2a 20 20 20 2a 20 54 68 65 20 50 47 48 44 52 5f  *   * The PGHDR_
1f960 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 20  DONT_WRITE flag 
1f970 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 70 61  is set on the pa
1f980 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 72 69  ge..**.** If wri
1f990 74 69 6e 67 20 6f 75 74 20 61 20 70 61 67 65 20  ting out a page 
1f9a0 63 61 75 73 65 73 20 74 68 65 20 64 61 74 61 62  causes the datab
1f9b0 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77  ase file to grow
1f9c0 2c 20 50 61 67 65 72 2e 64 62 46 69 6c 65 53 69  , Pager.dbFileSi
1f9d0 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61 74 65 64  ze.** is updated
1f9e0 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e 20 49 66   accordingly. If
1f9f0 20 70 61 67 65 20 31 20 69 73 20 77 72 69 74 74   page 1 is writt
1fa00 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20 74 68 65  en out, then the
1fa10 20 76 61 6c 75 65 20 63 61 63 68 65 64 0a 2a 2a   value cached.**
1fa20 20 69 6e 20 50 61 67 65 72 2e 64 62 46 69 6c 65   in Pager.dbFile
1fa30 56 65 72 73 5b 5d 20 69 73 20 75 70 64 61 74 65  Vers[] is update
1fa40 64 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 6e  d to match the n
1fa50 65 77 20 76 61 6c 75 65 20 73 74 6f 72 65 64 20  ew value stored 
1fa60 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61  in.** the databa
1fa70 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  se file..**.** I
1fa80 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20  f everything is 
1fa90 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
1faa0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
1fab0 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f  d. If an IO erro
1fac0 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c 20 61 6e  r .** occurs, an
1fad0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
1fae0 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 72 2c 20  s returned. Or, 
1faf0 69 66 20 74 68 65 20 45 58 43 4c 55 53 49 56 45  if the EXCLUSIVE
1fb00 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a 2a 2a 20   lock cannot.** 
1fb10 62 65 20 6f 62 74 61 69 6e 65 64 2c 20 53 51 4c  be obtained, SQL
1fb20 49 54 45 5f 42 55 53 59 20 69 73 20 72 65 74 75  ITE_BUSY is retu
1fb30 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
1fb40 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f  int pager_write_
1fb50 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a  pagelist(PgHdr *
1fb60 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20  pList){.  Pager 
1fb70 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20 20 20  *pPager;        
1fb80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
1fb90 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
1fba0 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
1fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1fbc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
1fbd0 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 69 66  rn code */..  if
1fbe0 28 20 4e 45 56 45 52 28 70 4c 69 73 74 3d 3d 30  ( NEVER(pList==0
1fbf0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
1fc00 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
1fc10 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a   pList->pPager;.
1fc20 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f  .  /* At this po
1fc30 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62 65  int there may be
1fc40 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52 56   either a RESERV
1fc50 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20  ED or EXCLUSIVE 
1fc60 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a  lock on the.  **
1fc70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1fc80 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72 65  If there is alre
1fc90 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45  ady an EXCLUSIVE
1fca0 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f   lock, the follo
1fcb0 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20 69  wing.  ** call i
1fcc0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a  s a no-op..  **.
1fcd0 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
1fce0 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
1fcf0 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
1fd00 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
1fd10 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
1fd20 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
1fd30 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
1fd40 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
1fd50 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
1fd60 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
1fd70 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
1fd80 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
1fd90 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
1fda0 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
1fdb0 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
1fdc0 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
1fdd0 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
1fde0 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
1fdf0 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
1fe00 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
1fe10 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
1fe20 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
1fe30 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
1fe40 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
1fe50 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
1fe60 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
1fe70 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
1fe80 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
1fe90 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
1fea0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
1feb0 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
1fec0 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
1fed0 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1fee0 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
1fef0 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
1ff00 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
1ff10 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
1ff20 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ff30 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
1ff40 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
1ff50 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
1ff60 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
1ff70 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
1ff80 20 20 61 73 73 65 72 74 28 20 21 70 61 67 65 72    assert( !pager
1ff90 55 73 65 57 61 6c 28 70 4c 69 73 74 2d 3e 70 50  UseWal(pList->pP
1ffa0 61 67 65 72 29 20 29 3b 0a 20 20 61 73 73 65 72  ager) );.  asser
1ffb0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
1ffc0 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
1ffd0 20 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72   );.  rc = pager
1ffe0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
1fff0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
20000 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  LOCK);..  /* If 
20010 74 68 65 20 66 69 6c 65 20 69 73 20 61 20 74 65  the file is a te
20020 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  mp-file has not 
20030 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c  yet been opened,
20040 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e 20 49 74   open it now. It
20050 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20 70 6f 73  .  ** is not pos
20060 73 69 62 6c 65 20 66 6f 72 20 72 63 20 74 6f 20  sible for rc to 
20070 62 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53 51  be other than SQ
20080 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68 69 73 20  LITE_OK if this 
20090 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69 73 20 74  branch.  ** is t
200a0 61 6b 65 6e 2c 20 61 73 20 70 61 67 65 72 5f 77  aken, as pager_w
200b0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29 20 69 73  ait_on_lock() is
200c0 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 74 65 6d   a no-op for tem
200d0 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f 0a 20 20  p-files..  */.  
200e0 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
200f0 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20 61  er->fd) ){.    a
20100 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 74  ssert( pPager->t
20110 65 6d 70 46 69 6c 65 20 26 26 20 72 63 3d 3d 53  empFile && rc==S
20120 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
20130 72 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65  rc = pagerOpente
20140 6d 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  mp(pPager, pPage
20150 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 76  r->fd, pPager->v
20160 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d 0a 0a 20  fsFlags);.  }.. 
20170 20 2f 2a 20 42 65 66 6f 72 65 20 74 68 65 20 66   /* Before the f
20180 69 72 73 74 20 77 72 69 74 65 2c 20 67 69 76 65  irst write, give
20190 20 74 68 65 20 56 46 53 20 61 20 68 69 6e 74 20   the VFS a hint 
201a0 6f 66 20 77 68 61 74 20 74 68 65 20 66 69 6e 61  of what the fina
201b0 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 73 69 7a 65  l.  ** file size
201c0 20 77 69 6c 6c 20 62 65 2e 0a 20 20 2a 2f 0a 20   will be..  */. 
201d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
201e0 69 7a 65 20 3e 20 28 70 50 61 67 65 72 2d 3e 64  ize > (pPager->d
201f0 62 4f 72 69 67 53 69 7a 65 2b 31 29 20 26 26 20  bOrigSize+1) && 
20200 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
20210 64 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  d) ){.    sqlite
20220 33 5f 69 6e 74 36 34 20 73 7a 46 69 6c 65 20 3d  3_int64 szFile =
20230 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
20240 65 20 2a 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  e * (sqlite3_int
20250 36 34 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  64)pPager->dbSiz
20260 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  e;.    sqlite3Os
20270 46 69 6c 65 43 6f 6e 74 72 6f 6c 28 70 50 61 67  FileControl(pPag
20280 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45 5f 46  er->fd, SQLITE_F
20290 43 4e 54 4c 5f 53 49 5a 45 5f 48 49 4e 54 2c 20  CNTL_SIZE_HINT, 
202a0 26 73 7a 46 69 6c 65 29 3b 0a 20 20 7d 0a 0a 20  &szFile);.  }.. 
202b0 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
202c0 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73 74 20 29  TE_OK && pList )
202d0 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20  {.    Pgno pgno 
202e0 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3b 0a 0a  = pList->pgno;..
202f0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
20300 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73 20  are dirty pages 
20310 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
20320 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62  e with page numb
20330 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20 20  ers greater.    
20340 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62  ** than Pager.db
20350 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  Size, this means
20360 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72 75   sqlite3PagerTru
20370 6e 63 61 74 65 49 6d 61 67 65 28 29 20 77 61 73  ncateImage() was
20380 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a   called to.    *
20390 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20  * make the file 
203a0 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61  smaller (presuma
203b0 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75  bly by auto-vacu
203c0 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74  um code). Do not
203d0 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e   write.    ** an
203e0 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20  y such pages to 
203f0 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a  the file..    **
20400 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c 20 64 6f  .    ** Also, do
20410 20 6e 6f 74 20 77 72 69 74 65 20 6f 75 74 20 61   not write out a
20420 6e 79 20 70 61 67 65 20 74 68 61 74 20 68 61 73  ny page that has
20430 20 74 68 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f   the PGHDR_DONT_
20440 57 52 49 54 45 20 66 6c 61 67 0a 20 20 20 20 2a  WRITE flag.    *
20450 2a 20 73 65 74 20 28 73 65 74 20 62 79 20 73 71  * set (set by sq
20460 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72  lite3PagerDontWr
20470 69 74 65 28 29 29 2e 0a 20 20 20 20 2a 2f 0a 20  ite())..    */. 
20480 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70 50 61     if( pgno<=pPa
20490 67 65 72 2d 3e 64 62 53 69 7a 65 20 26 26 20 30  ger->dbSize && 0
204a0 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61 67 73 26  ==(pList->flags&
204b0 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
204c0 29 20 29 7b 0a 20 20 20 20 20 20 69 36 34 20 6f  ) ){.      i64 o
204d0 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29  ffset = (pgno-1)
204e0 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
204f0 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20 4f 66 66  geSize;   /* Off
20500 73 65 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a  set to write */.
20510 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
20520 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
20530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20540 20 20 20 20 20 2f 2a 20 44 61 74 61 20 74 6f 20       /* Data to 
20550 77 72 69 74 65 20 2a 2f 20 20 20 20 0a 0a 20 20  write */    ..  
20560 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65 20 74 68      /* Encode th
20570 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  e database */.  
20580 20 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65      CODEC2(pPage
20590 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c  r, pList->pData,
205a0 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74 75 72 6e   pgno, 6, return
205b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70   SQLITE_NOMEM, p
205c0 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Data);..      /*
205d0 20 57 72 69 74 65 20 6f 75 74 20 74 68 65 20 70   Write out the p
205e0 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a 20 20 20  age data. */.   
205f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
20600 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
20610 64 2c 20 70 44 61 74 61 2c 20 70 50 61 67 65 72  d, pData, pPager
20620 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
20630 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  et);..      /* I
20640 66 20 70 61 67 65 20 31 20 77 61 73 20 6a 75 73  f page 1 was jus
20650 74 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74  t written, updat
20660 65 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  e Pager.dbFileVe
20670 72 73 20 74 6f 20 6d 61 74 63 68 0a 20 20 20 20  rs to match.    
20680 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6e    ** the value n
20690 6f 77 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65  ow stored in the
206a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
206b0 49 66 20 77 72 69 74 69 6e 67 20 74 68 69 73 20  If writing this 
206c0 0a 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20 63  .      ** page c
206d0 61 75 73 65 64 20 74 68 65 20 64 61 74 61 62 61  aused the databa
206e0 73 65 20 66 69 6c 65 20 74 6f 20 67 72 6f 77 2c  se file to grow,
206f0 20 75 70 64 61 74 65 20 64 62 46 69 6c 65 53 69   update dbFileSi
20700 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ze. .      */.  
20710 20 20 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20      if( pgno==1 
20720 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  ){.        memcp
20730 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  y(&pPager->dbFil
20740 65 56 65 72 73 2c 20 26 70 44 61 74 61 5b 32 34  eVers, &pData[24
20750 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  ], sizeof(pPager
20760 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
20770 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20780 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ( pgno>pPager->d
20790 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20  bFileSize ){.   
207a0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46       pPager->dbF
207b0 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a  ileSize = pgno;.
207c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
207d0 2a 20 55 70 64 61 74 65 20 61 6e 79 20 62 61 63  * Update any bac
207e0 6b 75 70 20 6f 62 6a 65 63 74 73 20 63 6f 70 79  kup objects copy
207f0 69 6e 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ing the contents
20800 20 6f 66 20 74 68 69 73 20 70 61 67 65 72 2e 20   of this pager. 
20810 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
20820 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
20830 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
20840 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73 74 2d 3e  no, (u8*)pList->
20850 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
20860 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
20870 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
20880 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
20890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
208a0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
208b0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
208c0 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
208d0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
208e0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
208f0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
20900 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
20910 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
20920 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
20930 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
20940 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
20950 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20960 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
20970 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
20980 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
20990 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
209a0 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
209b0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
209c0 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
209d0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
209e0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
209f0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
20a00 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
20a10 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
20a20 0a 0a 2f 2a 0a 2a 2a 20 45 6e 73 75 72 65 20 74  ../*.** Ensure t
20a30 68 61 74 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  hat the sub-jour
20a40 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
20a50 2e 20 49 66 20 69 74 20 69 73 20 61 6c 72 65 61  . If it is alrea
20a60 64 79 20 6f 70 65 6e 2c 20 74 68 69 73 20 0a 2a  dy open, this .*
20a70 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  * function is a 
20a80 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c  no-op..**.** SQL
20a90 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
20aa0 65 64 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  ed if everything
20ab0 20 67 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20   goes according 
20ac0 74 6f 20 70 6c 61 6e 2e 20 41 6e 20 0a 2a 2a 20  to plan. An .** 
20ad0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58  SQLITE_IOERR_XXX
20ae0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
20af0 65 74 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c  eturned if a cal
20b00 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4f 70  l to sqlite3OsOp
20b10 65 6e 28 29 20 0a 2a 2a 20 66 61 69 6c 73 2e 0a  en() .** fails..
20b20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70  */.static int op
20b30 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67  enSubJournal(Pag
20b40 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
20b50 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
20b60 4b 3b 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  K;.  if( !isOpen
20b70 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29  (pPager->sjfd) )
20b80 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
20b90 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50  ->journalMode==P
20ba0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
20bb0 5f 4d 45 4d 4f 52 59 20 7c 7c 20 70 50 61 67 65  _MEMORY || pPage
20bc0 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
20bd0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20be0 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70  MemJournalOpen(p
20bf0 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a 20 20  Pager->sjfd);.  
20c00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
20c10 63 20 3d 20 70 61 67 65 72 4f 70 65 6e 74 65 6d  c = pagerOpentem
20c20 70 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  p(pPager, pPager
20c30 2d 3e 73 6a 66 64 2c 20 53 51 4c 49 54 45 5f 4f  ->sjfd, SQLITE_O
20c40 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
20c50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
20c60 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20c70 20 41 70 70 65 6e 64 20 61 20 72 65 63 6f 72 64   Append a record
20c80 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
20c90 73 74 61 74 65 20 6f 66 20 70 61 67 65 20 70 50  state of page pP
20ca0 67 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  g to the sub-jou
20cb0 72 6e 61 6c 2e 20 0a 2a 2a 20 49 74 20 69 73 20  rnal. .** It is 
20cc0 74 68 65 20 63 61 6c 6c 65 72 73 20 72 65 73 70  the callers resp
20cd0 6f 6e 73 69 62 69 6c 69 74 79 20 74 6f 20 75 73  onsibility to us
20ce0 65 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  e subjRequiresPa
20cf0 67 65 28 29 20 74 6f 20 63 68 65 63 6b 20 0a 2a  ge() to check .*
20d00 2a 20 74 68 61 74 20 69 74 20 69 73 20 72 65 61  * that it is rea
20d10 6c 6c 79 20 72 65 71 75 69 72 65 64 20 62 65 66  lly required bef
20d20 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
20d30 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
20d40 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
20d50 73 65 74 20 74 68 65 20 62 69 74 20 63 6f 72 72  set the bit corr
20d60 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 70 50 67  esponding to pPg
20d70 2d 3e 70 67 6e 6f 20 69 6e 20 74 68 65 20 62 69  ->pgno in the bi
20d80 74 76 65 63 73 0a 2a 2a 20 66 6f 72 20 61 6c 6c  tvecs.** for all
20d90 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73   open savepoints
20da0 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e   before returnin
20db0 67 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  g..**.** This fu
20dc0 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
20dd0 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
20de0 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73  ything is succes
20df0 73 66 75 6c 2c 20 61 6e 20 49 4f 0a 2a 2a 20 65  sful, an IO.** e
20e00 72 72 6f 72 20 63 6f 64 65 20 69 66 20 74 68 65  rror code if the
20e10 20 61 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74   attempt to writ
20e20 65 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75  e to the sub-jou
20e30 72 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a  rnal fails, or .
20e40 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  ** SQLITE_NOMEM 
20e50 69 66 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  if a malloc fail
20e60 73 20 77 68 69 6c 65 20 73 65 74 74 69 6e 67 20  s while setting 
20e70 61 20 62 69 74 20 69 6e 20 61 20 73 61 76 65 70  a bit in a savep
20e80 6f 69 6e 74 0a 2a 2a 20 62 69 74 76 65 63 2e 0a  oint.** bitvec..
20e90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 75  */.static int su
20ea0 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 50 67 48  bjournalPage(PgH
20eb0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20  dr *pPg){.  int 
20ec0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
20ed0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
20ee0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
20ef0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
20f00 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
20f10 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
20f20 29 7b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20  ){..    /* Open 
20f30 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2c  the sub-journal,
20f40 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20 61   if it has not a
20f50 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e  lready been open
20f60 65 64 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74  ed */.    assert
20f70 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  ( pPager->useJou
20f80 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73 65  rnal );.    asse
20f90 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
20fa0 72 2d 3e 6a 66 64 29 20 7c 7c 20 70 61 67 65 72  r->jfd) || pager
20fb0 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
20fc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
20fd0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
20fe0 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 53  d) || pPager->nS
20ff0 75 62 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  ubRec==0 );.    
21000 61 73 73 65 72 74 28 20 70 61 67 65 72 55 73 65  assert( pagerUse
21010 57 61 6c 28 70 50 61 67 65 72 29 20 0a 20 20 20  Wal(pPager) .   
21020 20 20 20 20 20 20 7c 7c 20 70 61 67 65 49 6e 4a        || pageInJ
21030 6f 75 72 6e 61 6c 28 70 50 67 29 20 0a 20 20 20  ournal(pPg) .   
21040 20 20 20 20 20 20 7c 7c 20 70 50 67 2d 3e 70 67        || pPg->pg
21050 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  no>pPager->dbOri
21060 67 53 69 7a 65 20 0a 20 20 20 20 29 3b 0a 20 20  gSize .    );.  
21070 20 20 72 63 20 3d 20 6f 70 65 6e 53 75 62 4a 6f    rc = openSubJo
21080 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 0a  urnal(pPager);..
21090 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 75      /* If the su
210a0 62 2d 6a 6f 75 72 6e 61 6c 20 77 61 73 20 6f 70  b-journal was op
210b0 65 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  ened successfull
210c0 79 20 28 6f 72 20 77 61 73 20 61 6c 72 65 61 64  y (or was alread
210d0 79 20 6f 70 65 6e 29 2c 0a 20 20 20 20 2a 2a 20  y open),.    ** 
210e0 77 72 69 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  write the journa
210f0 6c 20 72 65 63 6f 72 64 20 69 6e 74 6f 20 74 68  l record into th
21100 65 20 66 69 6c 65 2e 20 20 2a 2f 0a 20 20 20 20  e file.  */.    
21110 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21120 4b 20 29 7b 0a 20 20 20 20 20 20 76 6f 69 64 20  K ){.      void 
21130 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
21140 61 74 61 3b 0a 20 20 20 20 20 20 69 36 34 20 6f  ata;.      i64 o
21150 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
21160 6e 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65  nSubRec*(4+pPage
21170 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
21180 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
21190 3b 0a 20 20 0a 20 20 20 20 20 20 43 4f 44 45 43  ;.  .      CODEC
211a0 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
211b0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
211c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
211d0 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
211e0 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
211f0 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
21200 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
21210 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
21220 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20  ->pgno));.      
21230 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
21240 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 6f  (pPager->sjfd, o
21250 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  ffset, pPg->pgno
21260 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
21270 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
21280 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21290 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
212a0 2d 3e 73 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  ->sjfd, pData2, 
212b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
212c0 2c 20 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 20  , offset+4);.   
212d0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
212e0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
212f0 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  OK ){.    pPager
21300 2d 3e 6e 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20  ->nSubRec++;.   
21310 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
21320 3e 6e 53 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b  >nSavepoint>0 );
21330 0a 20 20 20 20 72 63 20 3d 20 61 64 64 54 6f 53  .    rc = addToS
21340 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73 28  avepointBitvecs(
21350 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
21360 6f 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  o);.  }.  return
21370 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
21380 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
21390 61 6c 6c 65 64 20 62 79 20 74 68 65 20 70 63 61  alled by the pca
213a0 63 68 65 20 6c 61 79 65 72 20 77 68 65 6e 20 69  che layer when i
213b0 74 20 68 61 73 20 72 65 61 63 68 65 64 20 73 6f  t has reached so
213c0 6d 65 0a 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72  me.** soft memor
213d0 79 20 6c 69 6d 69 74 2e 20 54 68 65 20 66 69 72  y limit. The fir
213e0 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61  st argument is a
213f0 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61   pointer to a Pa
21400 67 65 72 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63  ger object.** (c
21410 61 73 74 20 61 73 20 61 20 76 6f 69 64 2a 29 2e  ast as a void*).
21420 20 54 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   The pager is al
21430 77 61 79 73 20 27 70 75 72 67 65 61 62 6c 65 27  ways 'purgeable'
21440 20 28 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f   (not an in-memo
21450 72 79 0a 2a 2a 20 64 61 74 61 62 61 73 65 29 2e  ry.** database).
21460 20 54 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   The second argu
21470 6d 65 6e 74 20 69 73 20 61 20 72 65 66 65 72 65  ment is a refere
21480 6e 63 65 20 74 6f 20 61 20 70 61 67 65 20 74 68  nce to a page th
21490 61 74 20 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e  at is .** curren
214a0 74 6c 79 20 64 69 72 74 79 20 62 75 74 20 68 61  tly dirty but ha
214b0 73 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67  s no outstanding
214c0 20 72 65 66 65 72 65 6e 63 65 73 2e 20 54 68 65   references. The
214d0 20 70 61 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61   page.** is alwa
214e0 79 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ys associated wi
214f0 74 68 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a  th the Pager obj
21500 65 63 74 20 70 61 73 73 65 64 20 61 73 20 74 68  ect passed as th
21510 65 20 66 69 72 73 74 20 0a 2a 2a 20 61 72 67 75  e first .** argu
21520 6d 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ment..**.** The 
21530 6a 6f 62 20 6f 66 20 74 68 69 73 20 66 75 6e 63  job of this func
21540 74 69 6f 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20  tion is to make 
21550 70 50 67 20 63 6c 65 61 6e 20 62 79 20 77 72 69  pPg clean by wri
21560 74 69 6e 67 20 69 74 73 20 63 6f 6e 74 65 6e 74  ting its content
21570 73 0a 2a 2a 20 6f 75 74 20 74 6f 20 74 68 65 20  s.** out to the 
21580 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69  database file, i
21590 66 20 70 6f 73 73 69 62 6c 65 2e 20 54 68 69 73  f possible. This
215a0 20 6d 61 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e   may involve syn
215b0 63 69 6e 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  cing the.** jour
215c0 6e 61 6c 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a  nal file. .**.**
215d0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
215e0 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b  sqlite3PcacheMak
215f0 65 43 6c 65 61 6e 28 29 20 69 73 20 63 61 6c 6c  eClean() is call
21600 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65 20 61  ed on the page a
21610 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
21620 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 20  returned. If an 
21630 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
21640 77 68 69 6c 65 20 74 72 79 69 6e 67 20 74 6f 20  while trying to 
21650 6d 61 6b 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  make the.** page
21660 20 63 6c 65 61 6e 2c 20 74 68 65 20 49 4f 20 65   clean, the IO e
21670 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
21680 75 72 6e 65 64 2e 20 49 66 20 74 68 65 20 70 61  urned. If the pa
21690 67 65 20 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20  ge cannot be.** 
216a0 6d 61 64 65 20 63 6c 65 61 6e 20 66 6f 72 20 73  made clean for s
216b0 6f 6d 65 20 6f 74 68 65 72 20 72 65 61 73 6f 6e  ome other reason
216c0 2c 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f  , but no error o
216d0 63 63 75 72 73 2c 20 74 68 65 6e 20 53 51 4c 49  ccurs, then SQLI
216e0 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
216f0 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  rned by sqlite3P
21700 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29  cacheMakeClean()
21710 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a   is not called..
21720 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
21730 67 65 72 53 74 72 65 73 73 28 76 6f 69 64 20 2a  gerStress(void *
21740 70 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  p, PgHdr *pPg){.
21750 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
21760 3d 20 28 50 61 67 65 72 20 2a 29 70 3b 0a 20 20  = (Pager *)p;.  
21770 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21780 4f 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  OK;..  assert( p
21790 50 67 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67  Pg->pPager==pPag
217a0 65 72 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  er );.  assert( 
217b0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
217c0 5f 44 49 52 54 59 20 29 3b 0a 0a 20 20 70 50 67  _DIRTY );..  pPg
217d0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
217e0 69 66 28 20 70 61 67 65 72 55 73 65 57 61 6c 28  if( pagerUseWal(
217f0 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 2f  pPager) ){.    /
21800 2a 20 57 72 69 74 65 20 61 20 73 69 6e 67 6c 65  * Write a single
21810 20 66 72 61 6d 65 20 66 6f 72 20 74 68 69 73 20   frame for this 
21820 70 61 67 65 20 74 6f 20 74 68 65 20 6c 6f 67 2e  page to the log.
21830 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
21840 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
21850 29 20 29 7b 20 0a 20 20 20 20 20 20 72 63 20 3d  ) ){ .      rc =
21860 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
21870 70 50 67 29 3b 20 0a 20 20 20 20 7d 0a 20 20 20  pPg); .    }.   
21880 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21890 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
218a0 20 70 61 67 65 72 57 61 6c 46 72 61 6d 65 73 28   pagerWalFrames(
218b0 70 50 61 67 65 72 2c 20 70 50 67 2c 20 30 2c 20  pPager, pPg, 0, 
218c0 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  0, 0);.    }.  }
218d0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
218e0 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20   doNotSync flag 
218f0 69 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71  is set by the sq
21900 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
21910 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  ) function while
21920 20 69 74 0a 20 20 20 20 2a 2a 20 69 73 20 6a 6f   it.    ** is jo
21930 75 72 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20  urnalling a set 
21940 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64  of two or more d
21950 61 74 61 62 61 73 65 20 70 61 67 65 73 20 74 68  atabase pages th
21960 61 74 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20  at are stored.  
21970 20 20 2a 2a 20 6f 6e 20 74 68 65 20 73 61 6d 65    ** on the same
21980 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 79   disk sector. Sy
21990 6e 63 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  ncing the journa
219a0 6c 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  l is not allowed
219b0 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20 74 68   while.    ** th
219c0 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  is is happening 
219d0 61 73 20 69 74 20 69 73 20 69 6d 70 6f 72 74 61  as it is importa
219e0 6e 74 20 74 68 61 74 20 61 6c 6c 20 6d 65 6d 62  nt that all memb
219f0 65 72 73 20 6f 66 20 73 75 63 68 20 61 0a 20 20  ers of such a.  
21a00 20 20 2a 2a 20 73 65 74 20 6f 66 20 70 61 67 65    ** set of page
21a10 73 20 61 72 65 20 73 79 6e 63 65 64 20 74 6f 20  s are synced to 
21a20 64 69 73 6b 20 74 6f 67 65 74 68 65 72 2e 20 53  disk together. S
21a30 6f 2c 20 69 66 20 74 68 65 20 70 61 67 65 20 74  o, if the page t
21a40 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20  his function.   
21a50 20 2a 2a 20 69 73 20 74 72 79 69 6e 67 20 74 6f   ** is trying to
21a60 20 6d 61 6b 65 20 63 6c 65 61 6e 20 77 69 6c 6c   make clean will
21a70 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
21a80 61 6c 20 73 79 6e 63 20 61 6e 64 20 74 68 65 20  al sync and the 
21a90 64 6f 4e 6f 74 53 79 6e 63 0a 20 20 20 20 2a 2a  doNotSync.    **
21aa0 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 72 65   flag is set, re
21ab0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 6f 69  turn without doi
21ac0 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 54 68 65  ng anything. The
21ad0 20 70 63 61 63 68 65 20 6c 61 79 65 72 20 77 69   pcache layer wi
21ae0 6c 6c 0a 20 20 20 20 2a 2a 20 6a 75 73 74 20 68  ll.    ** just h
21af0 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61 64 20  ave to go ahead 
21b00 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e  and allocate a n
21b10 65 77 20 70 61 67 65 20 62 75 66 66 65 72 20 69  ew page buffer i
21b20 6e 73 74 65 61 64 20 6f 66 0a 20 20 20 20 2a 2a  nstead of.    **
21b30 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20   reusing pPg..  
21b40 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 53 69 6d 69    **.    ** Simi
21b50 6c 61 72 6c 79 2c 20 69 66 20 74 68 65 20 70 61  larly, if the pa
21b60 67 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20  ger has already 
21b70 65 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f  entered the erro
21b80 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 0a  r state, do not.
21b90 20 20 20 20 2a 2a 20 74 72 79 20 74 6f 20 77 72      ** try to wr
21ba0 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ite the contents
21bb0 20 6f 66 20 70 50 67 20 74 6f 20 64 69 73 6b 2e   of pPg to disk.
21bc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
21bd0 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e 65 72  NEVER(pPager->er
21be0 72 43 6f 64 65 29 0a 20 20 20 20 20 7c 7c 20 28  rCode).     || (
21bf0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
21c00 63 20 26 26 20 70 50 67 2d 3e 66 6c 61 67 73 26  c && pPg->flags&
21c10 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
21c20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
21c30 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21c40 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
21c50 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
21c60 20 66 69 6c 65 20 69 66 20 72 65 71 75 69 72 65   file if require
21c70 64 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  d. */.    if( pP
21c80 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
21c90 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
21ca0 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
21cb0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
21cc0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21cd0 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 66  _OK && pPager->f
21ce0 75 6c 6c 53 79 6e 63 20 26 26 20 0a 20 20 20 20  ullSync && .    
21cf0 20 20 20 20 21 28 70 50 61 67 65 72 2d 3e 6a 6f      !(pPager->jo
21d00 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
21d10 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
21d20 4f 52 59 29 20 26 26 0a 20 20 20 20 20 20 20 20  ORY) &&.        
21d30 21 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  !(sqlite3OsDevic
21d40 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
21d50 28 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c  (pPager->fd)&SQL
21d60 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
21d70 50 50 45 4e 44 29 0a 20 20 20 20 20 20 29 7b 0a  PPEND).      ){.
21d80 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
21d90 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
21da0 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72    rc = writeJour
21db0 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
21dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
21dd0 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70  .    /* If the p
21de0 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 74 68  age number of th
21df0 69 73 20 70 61 67 65 20 69 73 20 6c 61 72 67 65  is page is large
21e00 72 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65  r than the curre
21e10 6e 74 20 73 69 7a 65 20 6f 66 0a 20 20 20 20 2a  nt size of.    *
21e20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  * the database i
21e30 6d 61 67 65 2c 20 69 74 20 6d 61 79 20 6e 65 65  mage, it may nee
21e40 64 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  d to be written 
21e50 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
21e60 61 6c 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  al..    ** This 
21e70 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20 63  is because the c
21e80 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72 69  all to pager_wri
21e90 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62 65  te_pagelist() be
21ea0 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 20  low will not.   
21eb0 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
21ec0 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
21ed0 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
21ee0 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
21ef0 43 6f 6e 73 69 64 65 72 20 74 68 65 20 66 6f 6c  Consider the fol
21f00 6c 6f 77 69 6e 67 20 73 65 71 75 65 6e 63 65 20  lowing sequence 
21f10 6f 66 20 65 76 65 6e 74 73 3a 0a 20 20 20 20 2a  of events:.    *
21f20 2a 0a 20 20 20 20 2a 2a 20 20 20 42 45 47 49 4e  *.    **   BEGIN
21f30 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  ;.    **     <jo
21f40 75 72 6e 61 6c 20 70 61 67 65 20 58 3e 0a 20 20  urnal page X>.  
21f50 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64 69 66 79    **     <modify
21f60 20 70 61 67 65 20 58 3e 0a 20 20 20 20 2a 2a 20   page X>.    ** 
21f70 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73 70      SAVEPOINT sp
21f80 3b 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 3c  ;.    **       <
21f90 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
21fa0 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
21fb0 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 20 70 61  .    **       pa
21fc0 67 65 72 53 74 72 65 73 73 28 70 61 67 65 20 58  gerStress(page X
21fd0 29 0a 20 20 20 20 2a 2a 20 20 20 20 20 52 4f 4c  ).    **     ROL
21fe0 4c 42 41 43 4b 20 54 4f 20 73 70 3b 0a 20 20 20  LBACK TO sp;.   
21ff0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 28 58   **.    ** If (X
22000 3e 59 29 2c 20 74 68 65 6e 20 77 68 65 6e 20 70  >Y), then when p
22010 61 67 65 72 53 74 72 65 73 73 20 69 73 20 63 61  agerStress is ca
22020 6c 6c 65 64 20 70 61 67 65 20 58 20 77 69 6c 6c  lled page X will
22030 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 0a   not be written.
22040 20 20 20 20 2a 2a 20 6f 75 74 20 74 6f 20 74 68      ** out to th
22050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
22060 20 62 75 74 20 77 69 6c 6c 20 62 65 20 64 72 6f   but will be dro
22070 70 70 65 64 20 66 72 6f 6d 20 74 68 65 20 63 61  pped from the ca
22080 63 68 65 2e 20 54 68 65 6e 2c 0a 20 20 20 20 2a  che. Then,.    *
22090 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20  * following the 
220a0 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22  "ROLLBACK TO sp"
220b0 20 73 74 61 74 65 6d 65 6e 74 2c 20 72 65 61 64   statement, read
220c0 69 6e 67 20 70 61 67 65 20 58 20 77 69 6c 6c 20  ing page X will 
220d0 72 65 61 64 0a 20 20 20 20 2a 2a 20 64 61 74 61  read.    ** data
220e0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
220f0 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77 69  se file. This wi
22100 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20 6f  ll be the copy o
22110 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a 20  f page X as it. 
22120 20 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74     ** was when t
22130 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
22140 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
22150 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
22160 50 4f 49 4e 54 20 73 70 22 0a 20 20 20 20 2a 2a  POINT sp".    **
22170 20 77 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20   was executed.. 
22180 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65     **.    ** The
22190 20 73 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20   solution is to 
221a0 77 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  write the curren
221b0 74 20 64 61 74 61 20 66 6f 72 20 70 61 67 65 20  t data for page 
221c0 58 20 69 6e 74 6f 20 74 68 65 20 0a 20 20 20 20  X into the .    
221d0 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  ** sub-journal f
221e0 69 6c 65 20 6e 6f 77 20 28 69 66 20 69 74 20 69  ile now (if it i
221f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 74 68  s not already th
22200 65 72 65 29 2c 20 73 6f 20 74 68 61 74 20 69 74  ere), so that it
22210 20 77 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20   will.    ** be 
22220 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
22230 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 77 68  current value wh
22240 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
22250 20 54 4f 20 73 70 22 20 69 73 20 0a 20 20 20 20   TO sp" is .    
22260 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20  ** executed..   
22270 20 2a 2f 0a 20 20 20 20 69 66 28 20 4e 45 56 45   */.    if( NEVE
22280 52 28 0a 20 20 20 20 20 20 20 20 72 63 3d 3d 53  R(.        rc==S
22290 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d  QLITE_OK && pPg-
222a0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
222b0 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75  Size && subjRequ
222c0 69 72 65 73 50 61 67 65 28 70 50 67 29 0a 20 20  iresPage(pPg).  
222d0 20 20 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20    ) ){.      rc 
222e0 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65  = subjournalPage
222f0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  (pPg);.    }.  .
22300 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65      /* Write the
22310 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65   contents of the
22320 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74 68 65   page out to the
22330 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
22340 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
22350 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
22360 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
22370 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
22380 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
22390 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20  * Mark the page 
223a0 61 73 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69  as clean. */.  i
223b0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
223c0 20 29 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41   ){.    PAGERTRA
223d0 43 45 28 28 22 53 54 52 45 53 53 20 25 64 20 70  CE(("STRESS %d p
223e0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
223f0 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
22400 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c  >pgno));.    sql
22410 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
22420 65 61 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20  ean(pPg);.  }.. 
22430 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
22440 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
22450 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  .}.../*.** Alloc
22460 61 74 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69  ate and initiali
22470 7a 65 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f  ze a new Pager o
22480 62 6a 65 63 74 20 61 6e 64 20 70 75 74 20 61 20  bject and put a 
22490 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a  pointer to it.**
224a0 20 69 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68   in *ppPager. Th
224b0 65 20 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65  e pager should e
224c0 76 65 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65  ventually be fre
224d0 65 64 20 62 79 20 70 61 73 73 69 6e 67 20 69 74  ed by passing it
224e0 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61  .** to sqlite3Pa
224f0 67 65 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a  gerClose()..**.*
22500 2a 20 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20  * The zFilename 
22510 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20  argument is the 
22520 70 61 74 68 20 74 6f 20 74 68 65 20 64 61 74 61  path to the data
22530 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
22540 6e 2e 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  n..** If zFilena
22550 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
22560 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
22570 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
22580 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
22590 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
225a0 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
225b0 20 54 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   Temporary files
225c0 20 61 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a   are be deleted.
225d0 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ** automatically
225e0 20 77 68 65 6e 20 74 68 65 79 20 61 72 65 20 63   when they are c
225f0 6c 6f 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e  losed. If zFilen
22600 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a  ame is ":memory:
22610 22 20 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69  " then .** all i
22620 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
22630 6c 64 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20  ld in cache. It 
22640 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
22650 20 74 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68   to disk. .** Th
22660 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
22670 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69  o implement an i
22680 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
22690 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78  e..**.** The nEx
226a0 74 72 61 20 70 61 72 61 6d 65 74 65 72 20 73 70  tra parameter sp
226b0 65 63 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62  ecifies the numb
226c0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73  er of bytes of s
226d0 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a  pace allocated.*
226e0 2a 20 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63  * along with eac
226f0 68 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  h page reference
22700 2e 20 54 68 69 73 20 73 70 61 63 65 20 69 73 20  . This space is 
22710 61 76 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65  available to the
22720 20 75 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65   user.** via the
22730 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
22740 45 78 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a  Extra() API..**.
22750 2a 2a 20 54 68 65 20 66 6c 61 67 73 20 61 72 67  ** The flags arg
22760 75 6d 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f  ument is used to
22770 20 73 70 65 63 69 66 79 20 70 72 6f 70 65 72 74   specify propert
22780 69 65 73 20 74 68 61 74 20 61 66 66 65 63 74 20  ies that affect 
22790 74 68 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  the.** operation
227a0 20 6f 66 20 74 68 65 20 70 61 67 65 72 2e 20 49   of the pager. I
227b0 74 20 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73  t should be pass
227c0 65 64 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20  ed some bitwise 
227d0 63 6f 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f  combination.** o
227e0 66 20 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54  f the PAGER_OMIT
227f0 5f 4a 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47  _JOURNAL and PAG
22800 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66  ER_NO_READLOCK f
22810 6c 61 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  lags..**.** The 
22820 76 66 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74  vfsFlags paramet
22830 65 72 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20  er is a bitmask 
22840 74 6f 20 70 61 73 73 20 74 6f 20 74 68 65 20 66  to pass to the f
22850 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a  lags parameter.*
22860 2a 20 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29  * of the xOpen()
22870 20 6d 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73   method of the s
22880 75 70 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e  upplied VFS when
22890 20 6f 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20   opening files. 
228a0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
228b0 67 65 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c  ger object is al
228c0 6c 6f 63 61 74 65 64 20 61 6e 64 20 74 68 65 20  located and the 
228d0 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f  specified file o
228e0 70 65 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73  pened .** succes
228f0 73 66 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f  sfully, SQLITE_O
22900 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  K is returned an
22910 64 20 2a 70 70 50 61 67 65 72 20 73 65 74 20 74  d *ppPager set t
22920 6f 20 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68  o point to.** th
22930 65 20 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65  e new pager obje
22940 63 74 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ct. If an error 
22950 6f 63 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72  occurs, *ppPager
22960 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a   is set to NULL.
22970 2a 2a 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64  ** and error cod
22980 65 20 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73  e returned. This
22990 20 66 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65   function may re
229a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
229b0 4d 0a 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c  M.** (sqlite3Mal
229c0 6c 6f 63 28 29 20 69 73 20 75 73 65 64 20 74 6f  loc() is used to
229d0 20 61 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   allocate memory
229e0 29 2c 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50  ), SQLITE_CANTOP
229f0 45 4e 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75  EN or .** variou
22a00 73 20 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20  s SQLITE_IO_XXX 
22a10 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
22a20 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28  qlite3PagerOpen(
22a30 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
22a40 70 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54  pVfs,       /* T
22a50 68 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20  he virtual file 
22a60 73 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f  system to use */
22a70 0a 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67  .  Pager **ppPag
22a80 65 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  er,         /* O
22a90 55 54 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50  UT: Return the P
22aa0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 68  ager structure h
22ab0 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ere */.  const c
22ac0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20  har *zFilename, 
22ad0 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
22ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
22af0 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20  o open */.  int 
22b00 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20 20 20  nExtra,         
22b10 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79       /* Extra by
22b20 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61  tes append to ea
22b30 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  ch in-memory pag
22b40 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73  e */.  int flags
22b50 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
22b60 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c  /* flags control
22b70 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a  ling this file *
22b80 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73  /.  int vfsFlags
22b90 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
22ba0 66 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72  flags passed thr
22bb0 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f  ough to sqlite3_
22bc0 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20  vfs.xOpen() */. 
22bd0 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
22be0 28 44 62 50 61 67 65 2a 29 20 2f 2a 20 46 75 6e  (DbPage*) /* Fun
22bf0 63 74 69 6f 6e 20 74 6f 20 72 65 69 6e 69 74 69  ction to reiniti
22c00 61 6c 69 7a 65 20 70 61 67 65 73 20 2a 2f 0a 29  alize pages */.)
22c10 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20  {.  u8 *pPtr;.  
22c20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
22c30 30 3b 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65  0;       /* Page
22c40 72 20 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f  r object to allo
22c50 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
22c60 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
22c70 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a  LITE_OK;      /*
22c80 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
22c90 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
22ca0 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
22cb0 75 65 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65  ue for temp file
22cc0 73 20 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f  s (incl. in-memo
22cd0 72 79 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69  ry files) */.  i
22ce0 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20  nt memDb = 0;   
22cf0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
22d00 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
22d10 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a  -memory file */.
22d20 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
22d30 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72   0;        /* Tr
22d40 75 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  ue if this is a 
22d50 72 65 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a  read-only file *
22d60 2f 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46  /.  int journalF
22d70 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20  ileSize;     /* 
22d80 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74  Bytes to allocat
22d90 65 20 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e  e for each journ
22da0 61 6c 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20  al fd */.  char 
22db0 2a 7a 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20  *zPathname = 0; 
22dc0 20 20 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68      /* Full path
22dd0 20 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c   to database fil
22de0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68  e */.  int nPath
22df0 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20  name = 0;       
22e00 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
22e10 65 73 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20  es in zPathname 
22e20 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
22e30 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
22e40 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
22e50 4c 29 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20  L)==0; /* False 
22e60 74 6f 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20  to omit journal 
22e70 2a 2f 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  */.  int noReadl
22e80 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
22e90 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
22ea0 29 21 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74  )!=0;  /* True t
22eb0 6f 20 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b  o omit read-lock
22ec0 20 2a 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65   */.  int pcache
22ed0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63  Size = sqlite3Pc
22ee0 61 63 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20  acheSize();     
22ef0 20 20 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c    /* Bytes to al
22f00 6c 6f 63 61 74 65 20 66 6f 72 20 50 43 61 63 68  locate for PCach
22f10 65 20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67  e */.  u16 szPag
22f20 65 44 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44  eDflt = SQLITE_D
22f30 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
22f40 3b 20 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61  ;  /* Default pa
22f50 67 65 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a  ge size */..  /*
22f60 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
22f70 6d 75 63 68 20 73 70 61 63 65 20 69 73 20 72 65  much space is re
22f80 71 75 69 72 65 64 20 66 6f 72 20 65 61 63 68 20  quired for each 
22f90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e  journal file-han
22fa0 64 6c 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20  dle.  ** (there 
22fb0 61 72 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c  are two of them,
22fc0 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
22fd0 6c 20 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f  l and the sub-jo
22fe0 75 72 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a  urnal). This.  *
22ff0 2a 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  * is the maximum
23000 20 73 70 61 63 65 20 72 65 71 75 69 72 65 64 20   space required 
23010 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
23020 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61   journal file ha
23030 6e 64 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61  ndle .  ** and a
23040 20 72 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c   regular journal
23050 20 66 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f   file-handle. No
23060 74 65 20 74 68 61 74 20 61 20 22 72 65 67 75 6c  te that a "regul
23070 61 72 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c  ar journal-handl
23080 65 22 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61  e".  ** may be a
23090 20 77 72 61 70 70 65 72 20 63 61 70 61 62 6c 65   wrapper capable
230a0 20 6f 66 20 63 61 63 68 69 6e 67 20 74 68 65 20   of caching the 
230b0 66 69 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66  first portion of
230c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a   the journal.  *
230d0 2a 20 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79  * file in memory
230e0 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68   to implement th
230f0 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
23100 70 74 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65  ptimization (see
23110 20 0a 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69   .  ** source fi
23120 6c 65 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20  le journal.c).. 
23130 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
23140 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66  3JournalSize(pVf
23150 73 29 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75  s)>sqlite3MemJou
23160 72 6e 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20  rnalSize() ){.  
23170 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
23180 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74  e = ROUND8(sqlit
23190 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56  e3JournalSize(pV
231a0 66 73 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fs));.  }else{. 
231b0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
231c0 7a 65 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69  ze = ROUND8(sqli
231d0 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a  te3MemJournalSiz
231e0 65 28 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e());.  }..  /* 
231f0 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20 76  Set the output v
23200 61 72 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20  ariable to NULL 
23210 69 6e 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72  in case an error
23220 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70   occurs. */.  *p
23230 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f  pPager = 0;..  /
23240 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74  * Compute and st
23250 6f 72 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74  ore the full pat
23260 68 6e 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f  hname in an allo
23270 63 61 74 65 64 20 62 75 66 66 65 72 20 70 6f 69  cated buffer poi
23280 6e 74 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20  nted.  ** to by 
23290 7a 50 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74  zPathname, lengt
232a0 68 20 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c  h nPathname. Or,
232b0 20 69 66 20 74 68 69 73 20 69 73 20 61 20 74 65   if this is a te
232c0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20  mporary file,.  
232d0 2a 2a 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50  ** leave both nP
232e0 61 74 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74  athname and zPat
232f0 68 6e 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a  hname set to 0..
23300 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65    */.  if( zFile
23310 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
23320 65 5b 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74  e[0] ){.    nPat
23330 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
23340 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20  Pathname+1;.    
23350 7a 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  zPathname = sqli
23360 74 65 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e  te3Malloc(nPathn
23370 61 6d 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20  ame*2);.    if( 
23380 7a 50 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a  zPathname==0 ){.
23390 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
233a0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
233b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
233c0 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20  OMIT_MEMORYDB.  
233d0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
233e0 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a  lename,":memory:
233f0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  ")==0 ){.      m
23400 65 6d 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20  emDb = 1;.      
23410 7a 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30  zPathname[0] = 0
23420 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
23430 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
23440 50 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b  Pathname[0] = 0;
23450 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e   /* Make sure in
23460 69 74 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69  itialized even i
23470 66 20 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29  f FullPathname()
23480 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
23490 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75  rc = sqlite3OsFu
234a0 6c 6c 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c  llPathname(pVfs,
234b0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74   zFilename, nPat
234c0 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
234d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50  );.    }..    nP
234e0 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
234f0 33 53 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e  3Strlen30(zPathn
23500 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ame);.    if( rc
23510 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e  ==SQLITE_OK && n
23520 50 61 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d  Pathname+8>pVfs-
23530 3e 6d 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  >mxPathname ){. 
23540 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61       /* This bra
23550 6e 63 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65  nch is taken whe
23560 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  n the journal pa
23570 74 68 20 72 65 71 75 69 72 65 64 20 62 79 0a 20  th required by. 
23580 20 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61       ** the data
23590 62 61 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65  base being opene
235a0 64 20 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74  d will be more t
235b0 68 61 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  han pVfs->mxPath
235c0 6e 61 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79  name.      ** by
235d0 74 65 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54  tes in length. T
235e0 68 69 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61  his means the da
235f0 74 61 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65  tabase cannot be
23600 20 6f 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a   opened,.      *
23610 2a 20 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74  * as it will not
23620 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
23630 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
23640 20 66 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20   file or even.  
23650 20 20 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72      ** check for
23660 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62   a hot-journal b
23670 65 66 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20  efore reading.. 
23680 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63       */.      rc
23690 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50   = SQLITE_CANTOP
236a0 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20 7d 0a 20  EN_BKPT;.    }. 
236b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
236c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
236d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68  lite3_free(zPath
236e0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74  name);.      ret
236f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
23700 7d 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  }..  /* Allocate
23710 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
23720 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 2c  Pager structure,
23730 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 2c 20   PCache object, 
23740 74 68 65 0a 20 20 2a 2a 20 74 68 72 65 65 20 66  the.  ** three f
23750 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 2c  ile descriptors,
23760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23770 6c 65 20 6e 61 6d 65 20 61 6e 64 20 74 68 65 20  le name and the 
23780 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69  journal .  ** fi
23790 6c 65 20 6e 61 6d 65 2e 20 54 68 65 20 6c 61 79  le name. The lay
237a0 6f 75 74 20 69 6e 20 6d 65 6d 6f 72 79 20 69 73  out in memory is
237b0 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
237c0 2a 0a 20 20 2a 2a 20 20 20 20 20 50 61 67 65 72  *.  **     Pager
237d0 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
237e0 20 20 20 20 20 20 20 20 20 20 20 28 73 69 7a 65             (size
237f0 6f 66 28 50 61 67 65 72 29 20 62 79 74 65 73 29  of(Pager) bytes)
23800 0a 20 20 2a 2a 20 20 20 20 20 50 43 61 63 68 65  .  **     PCache
23810 20 6f 62 6a 65 63 74 20 20 20 20 20 20 20 20 20   object         
23820 20 20 20 20 20 20 20 20 20 20 28 73 71 6c 69 74            (sqlit
23830 65 33 50 63 61 63 68 65 53 69 7a 65 28 29 20 62  e3PcacheSize() b
23840 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 44  ytes).  **     D
23850 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 6e  atabase file han
23860 64 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 28  dle            (
23870 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 62  pVfs->szOsFile b
23880 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 53  ytes).  **     S
23890 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ub-journal file 
238a0 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20 20 28  handle         (
238b0 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
238c0 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20  bytes).  **     
238d0 4d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  Main journal fil
238e0 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20 20 20  e handle        
238f0 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65  (journalFileSize
23900 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
23910 20 44 61 74 61 62 61 73 65 20 66 69 6c 65 20 6e   Database file n
23920 61 6d 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ame             
23930 20 28 6e 50 61 74 68 6e 61 6d 65 2b 31 20 62 79   (nPathname+1 by
23940 74 65 73 29 0a 20 20 2a 2a 20 20 20 20 20 4a 6f  tes).  **     Jo
23950 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
23960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e                (n
23970 50 61 74 68 6e 61 6d 65 2b 38 2b 31 20 62 79 74  Pathname+8+1 byt
23980 65 73 29 0a 20 20 2a 2f 0a 20 20 70 50 74 72 20  es).  */.  pPtr 
23990 3d 20 28 75 38 20 2a 29 73 71 6c 69 74 65 33 4d  = (u8 *)sqlite3M
239a0 61 6c 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 52  allocZero(.    R
239b0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
239c0 61 67 65 72 29 29 20 2b 20 20 20 20 20 20 2f 2a  ager)) +      /*
239d0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
239e0 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
239f0 63 61 63 68 65 53 69 7a 65 29 20 2b 20 20 20 20  cacheSize) +    
23a00 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68 65         /* PCache
23a10 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20 52   object */.    R
23a20 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f 73  OUND8(pVfs->szOs
23a30 46 69 6c 65 29 20 2b 20 20 20 20 20 20 20 2f 2a  File) +       /*
23a40 20 54 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c   The main db fil
23a50 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c  e */.    journal
23a60 46 69 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20  FileSize * 2 +  
23a70 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74          /* The t
23a80 77 6f 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  wo journal files
23a90 20 2a 2f 20 0a 20 20 20 20 6e 50 61 74 68 6e 61   */ .    nPathna
23aa0 6d 65 20 2b 20 31 20 2b 20 20 20 20 20 20 20 20  me + 1 +        
23ab0 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
23ac0 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 6e 50 61 74  name */.    nPat
23ad0 68 6e 61 6d 65 20 2b 20 38 20 2b 20 31 20 20 20  hname + 8 + 1   
23ae0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 4a             /* zJ
23af0 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 29 3b 0a 20  ournal */.  );. 
23b00 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
23b10 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 53 51  YTE_ALIGNMENT(SQ
23b20 4c 49 54 45 5f 49 4e 54 5f 54 4f 5f 50 54 52 28  LITE_INT_TO_PTR(
23b30 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29  journalFileSize)
23b40 29 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72  ) );.  if( !pPtr
23b50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
23b60 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b  free(zPathname);
23b70 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
23b80 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
23b90 70 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20  pPager =        
23ba0 20 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70        (Pager*)(p
23bb0 50 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Ptr);.  pPager->
23bc0 70 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43  pPCache =    (PC
23bd0 61 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 52  ache*)(pPtr += R
23be0 4f 55 4e 44 38 28 73 69 7a 65 6f 66 28 2a 70 50  OUND8(sizeof(*pP
23bf0 61 67 65 72 29 29 29 3b 0a 20 20 70 50 61 67 65  ager)));.  pPage
23c00 72 2d 3e 66 64 20 3d 20 20 20 28 73 71 6c 69 74  r->fd =   (sqlit
23c10 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
23c20 3d 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53  = ROUND8(pcacheS
23c30 69 7a 65 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  ize));.  pPager-
23c40 3e 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33  >sjfd = (sqlite3
23c50 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20  _file*)(pPtr += 
23c60 52 4f 55 4e 44 38 28 70 56 66 73 2d 3e 73 7a 4f  ROUND8(pVfs->szO
23c70 73 46 69 6c 65 29 29 3b 0a 20 20 70 50 61 67 65  sFile));.  pPage
23c80 72 2d 3e 6a 66 64 20 3d 20 20 28 73 71 6c 69 74  r->jfd =  (sqlit
23c90 65 33 5f 66 69 6c 65 2a 29 28 70 50 74 72 20 2b  e3_file*)(pPtr +
23ca0 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  = journalFileSiz
23cb0 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
23cc0 69 6c 65 6e 61 6d 65 20 3d 20 20 20 20 28 63 68  ilename =    (ch
23cd0 61 72 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75  ar*)(pPtr += jou
23ce0 72 6e 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20  rnalFileSize);. 
23cf0 20 61 73 73 65 72 74 28 20 45 49 47 48 54 5f 42   assert( EIGHT_B
23d00 59 54 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70 50  YTE_ALIGNMENT(pP
23d10 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20  ager->jfd) );.. 
23d20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 74 68 65 20   /* Fill in the 
23d30 50 61 67 65 72 2e 7a 46 69 6c 65 6e 61 6d 65 20  Pager.zFilename 
23d40 61 6e 64 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e  and Pager.zJourn
23d50 61 6c 20 62 75 66 66 65 72 73 2c 20 69 66 20 72  al buffers, if r
23d60 65 71 75 69 72 65 64 2e 20 2a 2f 0a 20 20 69 66  equired. */.  if
23d70 28 20 7a 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ( zPathname ){. 
23d80 20 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72     pPager->zJour
23d90 6e 61 6c 20 3d 20 20 20 28 63 68 61 72 2a 29 28  nal =   (char*)(
23da0 70 50 74 72 20 2b 3d 20 6e 50 61 74 68 6e 61 6d  pPtr += nPathnam
23db0 65 20 2b 20 31 29 3b 0a 20 20 20 20 6d 65 6d 63  e + 1);.    memc
23dc0 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  py(pPager->zFile
23dd0 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c  name, zPathname,
23de0 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20   nPathname);.   
23df0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
23e00 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 50 61 74 68 6e  zJournal, zPathn
23e10 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b  ame, nPathname);
23e20 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
23e30 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
23e40 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72  athname], "-jour
23e50 6e 61 6c 22 2c 20 38 29 3b 0a 20 20 20 20 69 66  nal", 8);.    if
23e60 28 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  ( pPager->zFilen
23e70 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 70 50 61 67  ame[0]==0 ) pPag
23e80 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 30 5d 20  er->zJournal[0] 
23e90 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
23ea0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
23eb0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
23ec0 70 56 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70  pVfs = pVfs;.  p
23ed0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20  Pager->vfsFlags 
23ee0 3d 20 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f  = vfsFlags;..  /
23ef0 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72  * Open the pager
23f00 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   file..  */.  if
23f10 28 20 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a  ( zFilename && z
23f20 46 69 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21  Filename[0] && !
23f30 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74  memDb ){.    int
23f40 20 66 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20   fout = 0;      
23f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23f60 20 56 46 53 20 66 6c 61 67 73 20 72 65 74 75 72   VFS flags retur
23f70 6e 65 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a  ned by xOpen() *
23f80 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
23f90 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
23fa0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
23fb0 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66  , pPager->fd, vf
23fc0 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
23fd0 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
23fe0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
23ff0 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
24000 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
24010 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79  was successfully
24020 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64   opened for read
24030 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20  /write access,. 
24040 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
24050 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
24060 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
24070 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
24080 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66     ** database f
24090 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74  ile. The default
240a0 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68   page size is th
240b0 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20  e maximum of:.  
240c0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b    **.    **    +
240d0 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f   SQLITE_DEFAULT_
240e0 50 41 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a  PAGE_SIZE,.    *
240f0 2a 20 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65  *    + The value
24100 20 72 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c   returned by sql
24110 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
24120 28 29 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  ().    **    + T
24130 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
24140 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
24150 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
24160 6c 6c 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  lly..    */.    
24170 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24180 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29  K && !readOnly )
24190 7b 0a 20 20 20 20 20 20 73 65 74 53 65 63 74 6f  {.      setSecto
241a0 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20  rSize(pPager);. 
241b0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
241c0 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
241d0 53 49 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  SIZE<=SQLITE_MAX
241e0 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
241f0 5a 45 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  ZE);.      if( s
24200 7a 50 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72  zPageDflt<pPager
24210 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a  ->sectorSize ){.
24220 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
24230 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53  er->sectorSize>S
24240 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
24250 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
24260 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65 44           szPageD
24270 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58  flt = SQLITE_MAX
24280 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
24290 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ZE;.        }els
242a0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50  e{.          szP
242b0 61 67 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70  ageDflt = (u16)p
242c0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
242d0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
242e0 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49     }.#ifdef SQLI
242f0 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43  TE_ENABLE_ATOMIC
24300 5f 57 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20  _WRITE.      {. 
24310 20 20 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d         int iDc =
24320 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
24330 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
24340 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
24350 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
24360 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
24370 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
24380 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
24390 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53 51         assert(SQ
243a0 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
243b0 43 36 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29  C64K==(65536>>8)
243c0 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
243d0 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
243e0 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
243f0 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
24400 66 6f 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c  for(ii=szPageDfl
24410 74 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41  t; ii<=SQLITE_MA
24420 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
24430 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20  IZE; ii=ii*2){. 
24440 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
24450 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
24460 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
24470 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 7a  {.            sz
24480 50 61 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20  PageDflt = ii;. 
24490 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
244a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e     }.      }.#en
244b0 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  dif.    }.  }els
244c0 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  e{.    /* If a t
244d0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
244e0 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
244f0 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
24500 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
24510 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
24520 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
24530 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
24540 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
24550 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
24560 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
24570 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
24580 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
24590 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62  **.    ** This b
245a0 72 61 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75  ranch is also ru
245b0 6e 20 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f  n for an in-memo
245c0 72 79 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20  ry database. An 
245d0 69 6e 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a  in-memory.    **
245e0 20 64 61 74 61 62 61 73 65 20 69 73 20 74 68 65   database is the
245f0 20 73 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d   same as a temp-
24600 66 69 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76  file that is nev
24610 65 72 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74  er written out t
24620 6f 0a 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e  o.    ** disk an
24630 64 20 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d  d uses an in-mem
24640 6f 72 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ory rollback jou
24650 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20  rnal..    */ .  
24660 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a    tempFile = 1;.
24670 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
24680 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
24690 49 56 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c  IVE;.    readOnl
246a0 79 20 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51  y = (vfsFlags&SQ
246b0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
246c0 4c 59 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54  LY);.  }..  /* T
246d0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c  he following cal
246e0 6c 20 74 6f 20 50 61 67 65 72 53 65 74 50 61 67  l to PagerSetPag
246f0 65 73 69 7a 65 28 29 20 73 65 72 76 65 73 20 74  esize() serves t
24700 6f 20 73 65 74 20 74 68 65 20 76 61 6c 75 65 20  o set the value 
24710 6f 66 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70  of .  ** Pager.p
24720 61 67 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61  ageSize and to a
24730 6c 6c 6f 63 61 74 65 20 74 68 65 20 50 61 67 65  llocate the Page
24740 72 2e 70 54 6d 70 53 70 61 63 65 20 62 75 66 66  r.pTmpSpace buff
24750 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72  er..  */.  if( r
24760 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
24770 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
24780 65 72 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a  er->memDb==0 );.
24790 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
247a0 50 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65  PagerSetPagesize
247b0 28 70 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65  (pPager, &szPage
247c0 44 66 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74  Dflt, -1);.    t
247d0 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
247e0 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20  ITE_OK );.  }.. 
247f0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
24800 6f 63 63 75 72 72 65 64 20 69 6e 20 65 69 74 68  occurred in eith
24810 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
24820 20 61 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65   above, free the
24830 20 0a 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72   .  ** Pager str
24840 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
24850 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a   the file..  */.
24860 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
24870 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  _OK ){.    asser
24880 74 28 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70  t( !pPager->pTmp
24890 53 70 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c  Space );.    sql
248a0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
248b0 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c  er->fd);.    sql
248c0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
248d0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
248e0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74  ;.  }..  /* Init
248f0 69 61 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68  ialize the PCach
24900 65 20 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61  e object. */.  a
24910 73 73 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30  ssert( nExtra<10
24920 30 30 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d  00 );.  nExtra =
24930 20 52 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b   ROUND8(nExtra);
24940 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
24950 4f 70 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c  Open(szPageDflt,
24960 20 6e 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c   nExtra, !memDb,
24970 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24980 20 20 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65       !memDb?page
24990 72 53 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64  rStress:0, (void
249a0 20 2a 29 70 50 61 67 65 72 2c 20 70 50 61 67 65   *)pPager, pPage
249b0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20  r->pPCache);..  
249c0 50 41 47 45 52 54 52 41 43 45 28 28 22 4f 50 45  PAGERTRACE(("OPE
249d0 4e 20 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45  N %d %s\n", FILE
249e0 48 41 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d  HANDLEID(pPager-
249f0 3e 66 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46  >fd), pPager->zF
24a00 69 6c 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54  ilename));.  IOT
24a10 52 41 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25  RACE(("OPEN %p %
24a20 73 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  s\n", pPager, pP
24a30 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
24a40 29 0a 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  )..  pPager->use
24a50 4a 6f 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73  Journal = (u8)us
24a60 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67  eJournal;.  pPag
24a70 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d  er->noReadlock =
24a80 20 28 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20   (noReadlock && 
24a90 72 65 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a  readOnly) ?1:0;.
24aa0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
24ab0 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20  tOpen = 0; */.  
24ac0 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  /* pPager->stmtI
24ad0 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nUse = 0; */.  /
24ae0 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d  * pPager->nRef =
24af0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
24b00 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 28  >dbSizeValid = (
24b10 75 38 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70  u8)memDb;.  /* p
24b20 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
24b30 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
24b40 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
24b50 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
24b60 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
24b70 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67  /.  pPager->mxPg
24b80 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f  no = SQLITE_MAX_
24b90 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a  PAGE_COUNT;.  /*
24ba0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
24bb0 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a   PAGER_UNLOCK; *
24bc0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
24bd0 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65  er->state == (te
24be0 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45  mpFile ? PAGER_E
24bf0 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52  XCLUSIVE : PAGER
24c00 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a  _UNLOCK) );.  /*
24c10 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
24c20 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
24c30 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75  r->tempFile = (u
24c40 38 29 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73  8)tempFile;.  as
24c50 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d  sert( tempFile==
24c60 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
24c70 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20  E_NORMAL .      
24c80 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d      || tempFile=
24c90 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
24ca0 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a  DE_EXCLUSIVE );.
24cb0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
24cc0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c  LOCKINGMODE_EXCL
24cd0 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50  USIVE==1 );.  pP
24ce0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
24cf0 6f 64 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ode = (u8)tempFi
24d00 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63  le; .  pPager->c
24d10 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
24d20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
24d30 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  e;.  pPager->mem
24d40 44 62 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a  Db = (u8)memDb;.
24d50 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
24d60 6c 79 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c  ly = (u8)readOnl
24d70 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
24d80 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f  needSync = 0; */
24d90 0a 20 20 61 73 73 65 72 74 28 20 75 73 65 4a 6f  .  assert( useJo
24da0 75 72 6e 61 6c 20 7c 7c 20 70 50 61 67 65 72 2d  urnal || pPager-
24db0 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 70  >tempFile );.  p
24dc0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
24dd0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
24de0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
24df0 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 6e  Sync = pPager->n
24e00 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20 70 50  oSync ?0:1;.  pP
24e10 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
24e20 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e   = SQLITE_SYNC_N
24e30 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67  ORMAL;.  /* pPag
24e40 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20  er->pFirst = 0; 
24e50 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
24e60 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
24e70 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
24e80 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a  ->pLast = 0; */.
24e90 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
24ea0 20 3d 20 28 75 31 36 29 6e 45 78 74 72 61 3b 0a   = (u16)nExtra;.
24eb0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
24ec0 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c  lSizeLimit = SQL
24ed0 49 54 45 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52  ITE_DEFAULT_JOUR
24ee0 4e 41 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a  NAL_SIZE_LIMIT;.
24ef0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
24f00 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
24f10 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 73 65  tempFile );.  se
24f20 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
24f30 65 72 29 3b 0a 20 20 69 66 28 20 21 75 73 65 4a  er);.  if( !useJ
24f40 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 70 50  ournal ){.    pP
24f50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
24f60 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41  e = PAGER_JOURNA
24f70 4c 4d 4f 44 45 5f 4f 46 46 3b 0a 20 20 7d 65 6c  LMODE_OFF;.  }el
24f80 73 65 20 69 66 28 20 6d 65 6d 44 62 20 29 7b 0a  se if( memDb ){.
24f90 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
24fa0 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52 5f  nalMode = PAGER_
24fb0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
24fc0 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  RY;.  }.  /* pPa
24fd0 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65  ger->xBusyHandle
24fe0 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  r = 0; */.  /* p
24ff0 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
25000 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a 20  lerArg = 0; */. 
25010 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
25020 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 20 20  er = xReinit;.  
25030 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72  /* memset(pPager
25040 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65  ->aHash, 0, size
25050 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  of(pPager->aHash
25060 29 29 3b 20 2a 2f 0a 0a 20 20 2a 70 70 50 61 67  )); */..  *ppPag
25070 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72  er = pPager;.  r
25080 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
25090 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  .}..../*.** This
250a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
250b0 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73 69  led after transi
250c0 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41 47  tioning from PAG
250d0 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20  ER_UNLOCK to.** 
250e0 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74 61  PAGER_SHARED sta
250f0 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66 20  te. It tests if 
25100 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20 6a  there is a hot j
25110 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20 69  ournal present i
25120 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79  n.** the file-sy
25130 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69 76  stem for the giv
25140 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74 20  en pager. A hot 
25150 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
25160 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74 6f  hat .** needs to
25170 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   be played back.
25180 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   According to th
25190 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 68  is function, a h
251a0 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  ot-journal.** fi
251b0 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68 65  le exists if the
251c0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69 74 65   following crite
251d0 72 69 61 20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a  ria are met:.**.
251e0 2a 2a 20 20 20 2a 20 54 68 65 20 6a 6f 75 72 6e  **   * The journ
251f0 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 69  al file exists i
25200 6e 20 74 68 65 20 66 69 6c 65 20 73 79 73 74 65  n the file syste
25210 6d 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f  m, and.**   * No
25220 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
25230 20 52 45 53 45 52 56 45 44 20 6f 72 20 67 72 65   RESERVED or gre
25240 61 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  ater lock on the
25250 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
25260 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 64  and.**   * The d
25270 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 74 73  atabase file its
25280 65 6c 66 20 69 73 20 67 72 65 61 74 65 72 20 74  elf is greater t
25290 68 61 6e 20 30 20 62 79 74 65 73 20 69 6e 20 73  han 0 bytes in s
252a0 69 7a 65 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ize, and.**   * 
252b0 54 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  The first byte o
252c0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
252d0 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
252e0 20 6e 6f 74 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a   not 0x00..**.**
252f0 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   If the current 
25300 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61  size of the data
25310 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20 62  base file is 0 b
25320 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ut a journal fil
25330 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68 61  e.** exists, tha
25340 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61 6e  t is probably an
25350 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65 66   old journal lef
25360 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70 72  t over from a pr
25370 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  ior.** database 
25380 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e 61  with the same na
25390 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  me. In this case
253a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
253b0 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65 6c  e is.** just del
253c0 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65 6c  eted using OsDel
253d0 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ete, *pExists is
253e0 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
253f0 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65  LITE_OK.** is re
25400 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  turned..**.** Th
25410 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73 20  is routine does 
25420 6e 6f 74 20 63 68 65 63 6b 20 69 66 20 74 68 65  not check if the
25430 72 65 20 69 73 20 61 20 6d 61 73 74 65 72 20 6a  re is a master j
25440 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 0a  ournal filename.
25450 2a 2a 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ** at the end of
25460 20 74 68 65 20 66 69 6c 65 2e 20 49 66 20 74 68   the file. If th
25470 65 72 65 20 69 73 2c 20 61 6e 64 20 74 68 61 74  ere is, and that
25480 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
25490 66 69 6c 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74  file.** does not
254a0 20 65 78 69 73 74 2c 20 74 68 65 6e 20 74 68 65   exist, then the
254b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
254c0 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 2e   not really hot.
254d0 20 49 6e 20 74 68 69 73 0a 2a 2a 20 63 61 73 65   In this.** case
254e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69   this routine wi
254f0 6c 6c 20 72 65 74 75 72 6e 20 61 20 66 61 6c 73  ll return a fals
25500 65 2d 70 6f 73 69 74 69 76 65 2e 20 54 68 65 20  e-positive. The 
25510 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
25520 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  .** routine will
25530 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
25540 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
25550 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f  is not really ho
25560 74 20 61 6e 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e  t and .** will n
25570 6f 74 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  ot roll it back.
25580 20 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74   .**.** If a hot
25590 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73  -journal file is
255a0 20 66 6f 75 6e 64 20 74 6f 20 65 78 69 73 74 2c   found to exist,
255b0 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
255c0 20 74 6f 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51   to 1 and .** SQ
255d0 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
255e0 2e 20 49 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72  . If no hot-jour
255f0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
25600 65 6e 74 2c 20 2a 70 45 78 69 73 74 73 20 69 73  ent, *pExists is
25610 0a 2a 2a 20 73 65 74 20 74 6f 20 30 20 61 6e 64  .** set to 0 and
25620 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
25630 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ned. If an IO er
25640 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
25650 20 74 72 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65   trying.** to de
25660 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
25670 6f 72 20 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75  or not a hot-jou
25680 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73  rnal file exists
25690 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a  , the IO error.*
256a0 2a 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  * code is return
256b0 65 64 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  ed and the value
256c0 20 6f 66 20 2a 70 45 78 69 73 74 73 20 69 73 20   of *pExists is 
256d0 75 6e 64 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74  undefined..*/.st
256e0 61 74 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a  atic int hasHotJ
256f0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
25700 61 67 65 72 2c 20 69 6e 74 20 2a 70 45 78 69 73  ager, int *pExis
25710 74 73 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  ts){.  sqlite3_v
25720 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73 20  fs * const pVfs 
25730 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
25740 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
25750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25760 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
25770 2f 0a 20 20 69 6e 74 20 65 78 69 73 74 73 3b 20  /.  int exists; 
25780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25790 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6a    /* True if a j
257a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 70  ournal file is p
257b0 72 65 73 65 6e 74 20 2a 2f 0a 0a 20 20 61 73 73  resent */..  ass
257c0 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
257d0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
257e0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29  er->useJournal )
257f0 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  ;.  assert( isOp
25800 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29  en(pPager->fd) )
25810 3b 0a 20 20 61 73 73 65 72 74 28 20 21 69 73 4f  ;.  assert( !isO
25820 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
25830 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25840 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d 20 50  ager->state <= P
25850 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a  AGER_SHARED );..
25860 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b 0a    *pExists = 0;.
25870 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
25880 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61  Access(pVfs, pPa
25890 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53  ger->zJournal, S
258a0 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
258b0 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20  STS, &exists);. 
258c0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
258d0 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b 0a  OK && exists ){.
258e0 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b 20      int locked; 
258f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25900 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65 20  /* True if some 
25910 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61 20  process holds a 
25920 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a 2f  RESERVED lock */
25930 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63 6f  ..    /* Race co
25940 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20 41  ndition here:  A
25950 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
25960 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20 68  ight have been h
25970 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20 2a  olding the.    *
25980 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c  * the RESERVED l
25990 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20 6a  ock and have a j
259a0 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20 74  ournal open at t
259b0 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  he sqlite3OsAcce
259c0 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61 6c  ss() .    ** cal
259d0 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68 65  l above, but the
259e0 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  n delete the jou
259f0 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74 68  rnal and drop th
25a00 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20 20  e lock before.  
25a10 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20 74    ** we get to t
25a20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71 6c  he following sql
25a30 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72  ite3OsCheckReser
25a40 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e 20  vedLock() call. 
25a50 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20   If that.    ** 
25a60 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68 69  is the case, thi
25a70 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
25a80 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20 61  think there is a
25a90 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65   hot journal whe
25aa0 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63 74  n.    ** in fact
25ab0 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e 20   there is none. 
25ac0 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69 6e   This results in
25ad0 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76   a false-positiv
25ae0 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20 20  e which will.   
25af0 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69 74   ** be dealt wit
25b00 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61 63  h by the playbac
25b10 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63 6b  k routine.  Tick
25b20 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a 2f  et #3883..    */
25b30 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
25b40 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
25b50 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
25b60 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
25b70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
25b80 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
25b90 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a       int nPage;.
25ba0 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20  .      /* Check 
25bb0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
25bc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
25bd0 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f 66  f it consists of
25be0 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20 20   0 pages,.      
25bf0 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20 74  ** then delete t
25c00 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
25c10 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72 20   See the header 
25c20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66 6f  comment above fo
25c30 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  r .      ** the 
25c40 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e 20  reasoning here. 
25c50 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73 6f   Delete the obso
25c60 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  lete journal fil
25c70 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a 2a  e under.      **
25c80 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
25c90 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20 63   to avoid race c
25ca0 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74 6f  onditions and to
25cb0 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e 67   avoid violating
25cc0 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30 32  .      ** [H3302
25cd0 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  0]..      */.   
25ce0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25cf0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
25d00 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
25d10 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
25d20 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
25d30 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20 29    if( nPage==0 )
25d40 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
25d50 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61  te3BeginBenignMa
25d60 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20 20  lloc();.        
25d70 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 4c    if( sqlite3OsL
25d80 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
25d90 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3d 3d  RESERVED_LOCK)==
25da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25db0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
25dc0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
25dd0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
25de0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
25df0 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
25e00 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  (pPager->fd, SHA
25e10 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  RED_LOCK);.     
25e20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25e30 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69 67   sqlite3EndBenig
25e40 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20  nMalloc();.     
25e50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
25e60 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e      /* The journ
25e70 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 20 61  al file exists a
25e80 6e 64 20 6e 6f 20 6f 74 68 65 72 20 63 6f 6e 6e  nd no other conn
25e90 65 63 74 69 6f 6e 20 68 61 73 20 61 20 72 65 73  ection has a res
25ea0 65 72 76 65 64 0a 20 20 20 20 20 20 20 20 20 20  erved.          
25eb0 2a 2a 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f  ** or greater lo
25ec0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
25ed0 73 65 20 66 69 6c 65 2e 20 4e 6f 77 20 63 68 65  se file. Now che
25ee0 63 6b 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ck that there is
25ef0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 74  .          ** at
25f00 20 6c 65 61 73 74 20 6f 6e 65 20 6e 6f 6e 2d 7a   least one non-z
25f10 65 72 6f 20 62 79 74 65 73 20 61 74 20 74 68 65  ero bytes at the
25f20 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
25f30 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
25f40 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 72        ** If ther
25f50 65 20 69 73 2c 20 74 68 65 6e 20 77 65 20 63 6f  e is, then we co
25f60 6e 73 69 64 65 72 20 74 68 69 73 20 6a 6f 75 72  nsider this jour
25f70 6e 61 6c 20 74 6f 20 62 65 20 68 6f 74 2e 20 49  nal to be hot. I
25f80 66 20 6e 6f 74 2c 20 0a 20 20 20 20 20 20 20 20  f not, .        
25f90 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 69    ** it can be i
25fa0 67 6e 6f 72 65 64 2e 0a 20 20 20 20 20 20 20 20  gnored..        
25fb0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
25fc0 6e 74 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50  nt f = SQLITE_OP
25fd0 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
25fe0 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
25ff0 52 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20  RNAL;.          
26000 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
26010 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
26020 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
26030 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 29 3b 0a  r->jfd, f, &f);.
26040 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
26050 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26060 20 20 20 20 20 20 20 20 20 20 20 75 38 20 66 69             u8 fi
26070 72 73 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  rst = 0;.       
26080 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26090 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
260a0 6a 66 64 2c 20 28 76 6f 69 64 20 2a 29 26 66 69  jfd, (void *)&fi
260b0 72 73 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  rst, 1, 0);.    
260c0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
260d0 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
260e0 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
260f0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
26100 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20  LITE_OK;.       
26110 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
26120 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
26130 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
26140 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78              *pEx
26150 69 73 74 73 20 3d 20 28 66 69 72 73 74 21 3d 30  ists = (first!=0
26160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
26170 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  se if( rc==SQLIT
26180 45 5f 43 41 4e 54 4f 50 45 4e 20 29 7b 0a 20 20  E_CANTOPEN ){.  
26190 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
261a0 77 65 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74  we cannot open t
261b0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
261c0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 6f 72 64 65  nal file in orde
261d0 72 20 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20  r to see if.    
261e0 20 20 20 20 20 20 20 20 2a 2a 20 69 74 73 20 68          ** its h
261f0 61 73 20 61 20 7a 65 72 6f 20 68 65 61 64 65 72  as a zero header
26200 2c 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20  , that might be 
26210 64 75 65 20 74 6f 20 61 6e 20 49 2f 4f 20 65 72  due to an I/O er
26220 72 6f 72 2c 20 6f 72 0a 20 20 20 20 20 20 20 20  ror, or.        
26230 20 20 20 20 2a 2a 20 69 74 20 6d 69 67 68 74 20      ** it might 
26240 62 65 20 64 75 65 20 74 6f 20 74 68 65 20 72 61  be due to the ra
26250 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  ce condition des
26260 63 72 69 62 65 64 20 61 62 6f 76 65 20 61 6e 64  cribed above and
26270 20 69 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20   in.            
26280 2a 2a 20 74 69 63 6b 65 74 20 23 33 38 38 33 2e  ** ticket #3883.
26290 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 61 73    Either way, as
262a0 73 75 6d 65 20 74 68 61 74 20 74 68 65 20 6a 6f  sume that the jo
262b0 75 72 6e 61 6c 20 69 73 20 68 6f 74 2e 0a 20 20  urnal is hot..  
262c0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 54 68 69            ** Thi
262d0 73 20 6d 69 67 68 74 20 62 65 20 61 20 66 61 6c  s might be a fal
262e0 73 65 20 70 6f 73 69 74 69 76 65 2e 20 20 42 75  se positive.  Bu
262f0 74 20 69 66 20 69 74 20 69 73 2c 20 74 68 65 6e  t if it is, then
26300 20 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 20   the.           
26310 20 2a 2a 20 61 75 74 6f 6d 61 74 69 63 20 6a 6f   ** automatic jo
26320 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 20 61  urnal playback a
26330 6e 64 20 72 65 63 6f 76 65 72 79 20 6d 65 63 68  nd recovery mech
26340 61 6e 69 73 6d 20 77 69 6c 6c 20 64 65 61 6c 0a  anism will deal.
26350 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 77              ** w
26360 69 74 68 20 69 74 20 75 6e 64 65 72 20 61 6e 20  ith it under an 
26370 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 77  EXCLUSIVE lock w
26380 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 6e  here we do not n
26390 65 65 64 20 74 6f 0a 20 20 20 20 20 20 20 20 20  eed to.         
263a0 20 20 20 2a 2a 20 77 6f 72 72 79 20 73 6f 20 6d     ** worry so m
263b0 75 63 68 20 77 69 74 68 20 72 61 63 65 20 63 6f  uch with race co
263c0 6e 64 69 74 69 6f 6e 73 2e 0a 20 20 20 20 20 20  nditions..      
263d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
263e0 20 20 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20       *pExists = 
263f0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  1;.            r
26400 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
26410 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
26420 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
26430 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
26440 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
26450 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
26460 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20  alled to obtain 
26470 61 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e  a shared lock on
26480 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
26490 6c 65 2e 0a 2a 2a 20 49 74 20 69 73 20 69 6c 6c  le..** It is ill
264a0 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 73 71 6c  egal to call sql
264b0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
264c0 28 29 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74  () until after t
264d0 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  his function.** 
264e0 68 61 73 20 62 65 65 6e 20 73 75 63 63 65 73 73  has been success
264f0 66 75 6c 6c 79 20 63 61 6c 6c 65 64 2e 20 49 66  fully called. If
26500 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69   a shared-lock i
26510 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64 20 77  s already held w
26520 68 65 6e 0a 2a 2a 20 74 68 69 73 20 66 75 6e 63  hen.** this func
26530 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20  tion is called, 
26540 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  it is a no-op..*
26550 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
26560 6e 67 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 72  ng operations ar
26570 65 20 61 6c 73 6f 20 70 65 72 66 6f 72 6d 65 64  e also performed
26580 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
26590 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 66  n..**.**   1) If
265a0 20 74 68 65 20 70 61 67 65 72 20 69 73 20 63 75   the pager is cu
265b0 72 72 65 6e 74 6c 79 20 69 6e 20 50 41 47 45 52  rrently in PAGER
265c0 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20 28 6e  _UNLOCK state (n
265d0 6f 20 6c 6f 63 6b 20 68 65 6c 64 0a 2a 2a 20 20  o lock held.**  
265e0 20 20 20 20 6f 6e 20 74 68 65 20 64 61 74 61 62      on the datab
265f0 61 73 65 20 66 69 6c 65 29 2c 20 74 68 65 6e 20  ase file), then 
26600 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  an attempt is ma
26610 64 65 20 74 6f 20 6f 62 74 61 69 6e 20 61 0a 2a  de to obtain a.*
26620 2a 20 20 20 20 20 20 53 48 41 52 45 44 20 6c 6f  *      SHARED lo
26630 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
26640 73 65 20 66 69 6c 65 2e 20 49 6d 6d 65 64 69 61  se file. Immedia
26650 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69  tely after obtai
26660 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65  ning.**      the
26670 20 53 48 41 52 45 44 20 6c 6f 63 6b 2c 20 74 68   SHARED lock, th
26680 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 69 73  e file-system is
26690 20 63 68 65 63 6b 65 64 20 66 6f 72 20 61 20 68   checked for a h
266a0 6f 74 2d 6a 6f 75 72 6e 61 6c 2c 0a 2a 2a 20 20  ot-journal,.**  
266b0 20 20 20 20 77 68 69 63 68 20 69 73 20 70 6c 61      which is pla
266c0 79 65 64 20 62 61 63 6b 20 69 66 20 70 72 65 73  yed back if pres
266d0 65 6e 74 2e 20 46 6f 6c 6c 6f 77 69 6e 67 20 61  ent. Following a
266e0 6e 79 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 0a  ny hot-journal .
266f0 2a 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b  **      rollback
26700 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
26710 66 20 74 68 65 20 63 61 63 68 65 20 61 72 65 20  f the cache are 
26720 76 61 6c 69 64 61 74 65 64 20 62 79 20 63 68 65  validated by che
26730 63 6b 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68  cking.**      th
26740 65 20 27 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  e 'change-counte
26750 72 27 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  r' field of the 
26760 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 65  database file he
26770 61 64 65 72 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ader and.**     
26780 20 64 69 73 63 61 72 64 65 64 20 69 66 20 74 68   discarded if th
26790 65 79 20 61 72 65 20 66 6f 75 6e 64 20 74 6f 20  ey are found to 
267a0 62 65 20 69 6e 76 61 6c 69 64 2e 0a 2a 2a 0a 2a  be invalid..**.*
267b0 2a 20 20 20 32 29 20 49 66 20 74 68 65 20 70 61  *   2) If the pa
267c0 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69  ger is running i
267d0 6e 20 65 78 63 6c 75 73 69 76 65 2d 6d 6f 64 65  n exclusive-mode
267e0 2c 20 61 6e 64 20 74 68 65 72 65 20 61 72 65 20  , and there are 
267f0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
26800 20 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67    no outstanding
26810 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
26820 6e 79 20 70 61 67 65 73 2c 20 61 6e 64 20 69 73  ny pages, and is
26830 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
26840 61 74 65 2c 0a 2a 2a 20 20 20 20 20 20 74 68 65  ate,.**      the
26850 6e 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  n an attempt is 
26860 6d 61 64 65 20 74 6f 20 63 6c 65 61 72 20 74 68  made to clear th
26870 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 62 79  e error state by
26880 20 64 69 73 63 61 72 64 69 6e 67 0a 2a 2a 20 20   discarding.**  
26890 20 20 20 20 74 68 65 20 63 6f 6e 74 65 6e 74 73      the contents
268a0 20 6f 66 20 74 68 65 20 70 61 67 65 20 63 61 63   of the page cac
268b0 68 65 20 61 6e 64 20 72 6f 6c 6c 69 6e 67 20 62  he and rolling b
268c0 61 63 6b 20 61 6e 79 20 6f 70 65 6e 20 6a 6f 75  ack any open jou
268d0 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 66 69 6c  rnal.**      fil
268e0 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
268f0 6f 70 65 72 61 74 69 6f 6e 20 64 65 73 63 72 69  operation descri
26900 62 65 64 20 62 79 20 28 32 29 20 61 62 6f 76 65  bed by (2) above
26910 20 69 73 20 6e 6f 74 20 61 74 74 65 6d 70 74 65   is not attempte
26920 64 2c 20 61 6e 64 20 69 66 20 74 68 65 0a 2a 2a  d, and if the.**
26930 20 70 61 67 65 72 20 69 73 20 69 6e 20 61 6e 20   pager is in an 
26940 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
26950 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
26960 4c 4c 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  LL when this is 
26970 63 61 6c 6c 65 64 2c 0a 2a 2a 20 74 68 65 20 65  called,.** the e
26980 72 72 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72  rror state error
26990 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
269a0 64 2e 20 49 74 20 69 73 20 70 65 72 6d 69 74 74  d. It is permitt
269b0 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 0a 2a  ed to read the.*
269c0 2a 20 64 61 74 61 62 61 73 65 20 77 68 65 6e 20  * database when 
269d0 69 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 65  in SQLITE_FULL e
269e0 72 72 6f 72 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a  rror state..**.*
269f0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
26a00 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73 75  everything is su
26a10 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
26a20 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
26a30 20 49 66 20 61 6e 0a 2a 2a 20 49 4f 20 65 72 72   If an.** IO err
26a40 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20  or occurs while 
26a50 6c 6f 63 6b 69 6e 67 20 74 68 65 20 64 61 74 61  locking the data
26a60 62 61 73 65 2c 20 63 68 65 63 6b 69 6e 67 20 66  base, checking f
26a70 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
26a80 0a 2a 2a 20 66 69 6c 65 20 6f 72 20 72 6f 6c 6c  .** file or roll
26a90 69 6e 67 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e  ing back a journ
26aa0 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 49 4f 20  al file, the IO 
26ab0 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
26ac0 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
26ad0 71 6c 69 74 65 33 50 61 67 65 72 53 68 61 72 65  qlite3PagerShare
26ae0 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  dLock(Pager *pPa
26af0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
26b00 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
26b10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
26b20 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
26b30 6e 74 20 69 73 45 72 72 6f 72 52 65 73 65 74 20  nt isErrorReset 
26b40 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
26b50 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 63    /* True if rec
26b60 6f 76 65 72 69 6e 67 20 66 72 6f 6d 20 65 72 72  overing from err
26b70 6f 72 20 73 74 61 74 65 20 2a 2f 0a 0a 20 20 2f  or state */..  /
26b80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
26b90 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72  s only called fr
26ba0 6f 6d 20 62 2d 74 72 65 65 20 61 6e 64 20 6f 6e  om b-tree and on
26bb0 6c 79 20 77 68 65 6e 20 74 68 65 72 65 20 61 72  ly when there ar
26bc0 65 20 6e 6f 0a 20 20 2a 2a 20 6f 75 74 73 74 61  e no.  ** outsta
26bd0 6e 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20  nding pages */. 
26be0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
26bf0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
26c00 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
26c10 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56 45  =0 );.  if( NEVE
26c20 52 28 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  R(MEMDB && pPage
26c30 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 7b 20 72  r->errCode) ){ r
26c40 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
26c50 72 43 6f 64 65 3b 20 7d 0a 0a 20 20 2f 2a 20 49  rCode; }..  /* I
26c60 66 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20  f this database 
26c70 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73  is in an error-s
26c80 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 61 20 63  tate, now is a c
26c90 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72 0a 20  hance to clear. 
26ca0 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e 20 44   ** the error. D
26cb0 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65  iscard the conte
26cc0 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
26cd0 2d 63 61 63 68 65 20 61 6e 64 20 72 6f 6c 6c 62  -cache and rollb
26ce0 61 63 6b 0a 20 20 2a 2a 20 61 6e 79 20 68 6f 74  ack.  ** any hot
26cf0 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 74 68 65 20   journal in the 
26d00 66 69 6c 65 2d 73 79 73 74 65 6d 2e 0a 20 20 2a  file-system..  *
26d10 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
26d20 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  errCode ){.    i
26d30 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
26d40 2d 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72  ->jfd) || pPager
26d50 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  ->zJournal ){.  
26d60 20 20 20 20 69 73 45 72 72 6f 72 52 65 73 65 74      isErrorReset
26d70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
26d80 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
26d90 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
26da0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
26db0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
26dc0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
26dd0 67 65 72 29 20 29 7b 0a 20 20 20 20 72 63 20 3d  ger) ){.    rc =
26de0 20 70 61 67 65 72 42 65 67 69 6e 52 65 61 64 54   pagerBeginReadT
26df0 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
26e00 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
26e10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
26e20 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69  AGER_UNLOCK || i
26e30 73 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20  sErrorReset ){. 
26e40 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
26e50 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
26e60 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
26e70 69 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c  int isHotJournal
26e80 20 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74   = 0;.    assert
26e90 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20  ( !MEMDB );.    
26ea0 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50  assert( sqlite3P
26eb0 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
26ec0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d  ager->pPCache)==
26ed0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
26ee0 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
26ef0 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
26f00 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
26f10 79 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  y );.      pPage
26f20 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
26f30 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 65 6c  _SHARED;.    }el
26f40 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
26f50 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
26f60 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
26f70 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66  _LOCK);.      if
26f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26f90 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
26fa0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
26fb0 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
26fc0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26fd0 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
26fe0 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
26ff0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  }.    }.    asse
27000 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
27010 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
27020 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
27030 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
27040 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
27050 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
27060 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
27070 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
27080 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
27090 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
270a0 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
270b0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
270c0 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29   !isErrorReset )
270d0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
270e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3c 3d  pPager->state <=
270f0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b   PAGER_SHARED );
27100 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73 48  .      rc = hasH
27110 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
27120 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 29  , &isHotJournal)
27130 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
27140 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27150 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
27160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
27170 20 20 20 20 69 66 28 20 69 73 45 72 72 6f 72 52      if( isErrorR
27180 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f 75  eset || isHotJou
27190 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f 2a  rnal ){.      /*
271a0 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   Get an EXCLUSIV
271b0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
271c0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20  tabase file. At 
271d0 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73  this point it is
271e0 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74  .      ** import
271f0 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52  ant that a RESER
27200 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
27210 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20  obtained on the 
27220 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20  way to the.     
27230 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
27240 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
27250 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
27260 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
27270 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
27280 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
27290 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
272a0 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
272b0 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  at the.      ** 
272c0 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66 65  database is safe
272d0 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20 74   to read while t
272e0 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20 73  his process is s
272f0 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68 65  till rolling the
27300 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a   .      ** hot-j
27310 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20 20  ournal back..   
27320 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a 20     ** .      ** 
27330 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74 65  Because the inte
27340 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56 45  rmediate RESERVE
27350 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65  D lock is not re
27360 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20 20  quested, any.   
27370 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f 63     ** other proc
27380 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ess attempting t
27390 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61 74  o access the dat
273a0 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c 20  abase file will 
273b0 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a 2a  get to .      **
273c0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
273d0 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
273e0 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   to obtain its o
273f0 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
27400 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  k .      ** on t
27410 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
27420 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
27430 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
27440 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  te<EXCLUSIVE_LOC
27450 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
27460 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
27470 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
27480 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
27490 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
274a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
274b0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
274c0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
274d0 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  ;.          goto
274e0 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20   failed;.       
274f0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
27500 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
27510 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20  _EXCLUSIVE;.    
27520 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20 4f    }. .      /* O
27530 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
27540 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20 61  for read/write a
27550 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20 62  ccess. This is b
27560 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20 20  ecause in .     
27570 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63   ** exclusive-ac
27580 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69  cess mode the fi
27590 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69  le descriptor wi
275a0 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20  ll be kept open 
275b0 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f 73  and.      ** pos
275c0 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61  sibly used for a
275d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74   transaction lat
275e0 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73  er on. On some s
275f0 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20  ystems, the.    
27600 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28    ** OsTruncate(
27610 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65  ) call used in e
27620 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
27630 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72  mode also requir
27640 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72 65  es.      ** a re
27650 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68 61  ad/write file ha
27660 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ndle..      */. 
27670 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e       if( !isOpen
27680 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
27690 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65 73  .        int res
276a0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
276b0 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
276c0 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  Vfs,pPager->zJou
276d0 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43 45  rnal,SQLITE_ACCE
276e0 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29 3b  SS_EXISTS,&res);
276f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
27700 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
27710 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73 20          if( res 
27720 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
27730 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
27740 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20 3d           int f =
27750 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
27760 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
27770 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b  EN_MAIN_JOURNAL;
27780 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
27790 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74 65  ert( !pPager->te
277a0 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20 20  mpFile );.      
277b0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
277c0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
277d0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
277e0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
277f0 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20 20   &fout);.       
27800 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
27810 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73  =SQLITE_OK || is
27820 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27830 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ) );.           
27840 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27850 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49 54  OK && fout&SQLIT
27860 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20  E_OPEN_READONLY 
27870 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
27880 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41 4e   rc = SQLITE_CAN
27890 54 4f 50 45 4e 5f 42 4b 50 54 3b 0a 20 20 20 20  TOPEN_BKPT;.    
278a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
278b0 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
278c0 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20  >jfd);.         
278d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
278e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
278f0 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72    /* If the jour
27900 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  nal does not exi
27910 73 74 2c 20 69 74 20 75 73 75 61 6c 6c 79 20 6d  st, it usually m
27920 65 61 6e 73 20 74 68 61 74 20 73 6f 6d 65 20 0a  eans that some .
27930 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f              ** o
27940 74 68 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  ther connection 
27950 6d 61 6e 61 67 65 64 20 74 6f 20 67 65 74 20 69  managed to get i
27960 6e 20 61 6e 64 20 72 6f 6c 6c 20 69 74 20 62 61  n and roll it ba
27970 63 6b 20 62 65 66 6f 72 65 20 0a 20 20 20 20 20  ck before .     
27980 20 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20 63         ** this c
27990 6f 6e 6e 65 63 74 69 6f 6e 20 6f 62 74 61 69 6e  onnection obtain
279a0 65 64 20 74 68 65 20 65 78 63 6c 75 73 69 76 65  ed the exclusive
279b0 20 6c 6f 63 6b 20 61 62 6f 76 65 2e 20 4f 72 2c   lock above. Or,
279c0 20 69 74 20 0a 20 20 20 20 20 20 20 20 20 20 20   it .           
279d0 20 2a 2a 20 6d 61 79 20 6d 65 61 6e 20 74 68 61   ** may mean tha
279e0 74 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  t the pager was 
279f0 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
27a00 74 65 20 77 68 65 6e 20 74 68 69 73 0a 20 20 20  te when this.   
27a10 20 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63           ** func
27a20 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 20  tion was called 
27a30 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  and the journal 
27a40 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78  file does not ex
27a50 69 73 74 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  ist.  */.       
27a60 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
27a70 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
27a80 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
27a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
27aa0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
27ab0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27ac0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
27ad0 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
27ae0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 52 65 73 65  }..      /* Rese
27af0 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 74  t the journal st
27b00 61 74 75 73 20 66 69 65 6c 64 73 20 74 6f 20 69  atus fields to i
27b10 6e 64 69 63 61 74 65 73 20 74 68 61 74 20 77 65  ndicates that we
27b20 20 68 61 76 65 20 6e 6f 0a 20 20 20 20 20 20 2a   have no.      *
27b30 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
27b40 61 6c 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  al at this time.
27b50 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72   */.      pPager
27b60 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
27b70 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67   = 0;.      pPag
27b80 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
27b90 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
27ba0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
27bb0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
27bc0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
27bd0 0a 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73  .      /* Make s
27be0 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ure the journal 
27bf0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79  file has been sy
27c00 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20 2a 2f  nced to disk. */
27c10 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  . .      /* Play
27c20 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
27c30 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
27c40 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
27c50 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a 20 6c  write.      ** l
27c60 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
27c70 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
27c80 20 50 75 72 67 65 20 74 68 65 20 63 61 63 68 65   Purge the cache
27c90 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20 2a 2a   before.      **
27ca0 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68   playing back th
27cb0 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 73 6f  e hot-journal so
27cc0 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74 20 65   that we don't e
27cd0 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20 20 20  nd up with.     
27ce0 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74   ** an inconsist
27cf0 65 6e 74 20 63 61 63 68 65 2e 20 20 53 79 6e 63  ent cache.  Sync
27d00 20 74 68 65 20 68 6f 74 20 6a 6f 75 72 6e 61 6c   the hot journal
27d10 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e 67 0a   before playing.
27d20 20 20 20 20 20 20 2a 2a 20 69 74 20 62 61 63 6b        ** it back
27d30 20 73 69 6e 63 65 20 74 68 65 20 70 72 6f 63 65   since the proce
27d40 73 73 20 74 68 61 74 20 63 72 61 73 68 65 64 20  ss that crashed 
27d50 61 6e 64 20 6c 65 66 74 20 74 68 65 20 68 6f 74  and left the hot
27d60 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a   journal.      *
27d70 2a 20 70 72 6f 62 61 62 6c 79 20 64 69 64 20 6e  * probably did n
27d80 6f 74 20 73 79 6e 63 20 69 74 20 61 6e 64 20 77  ot sync it and w
27d90 65 20 61 72 65 20 72 65 71 75 69 72 65 64 20 74  e are required t
27da0 6f 20 61 6c 77 61 79 73 20 73 79 6e 63 0a 20 20  o always sync.  
27db0 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
27dc0 61 6c 20 62 65 66 6f 72 65 20 70 6c 61 79 69 6e  al before playin
27dd0 67 20 69 74 20 62 61 63 6b 2e 0a 20 20 20 20 20  g it back..     
27de0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73   */.      if( is
27df0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
27e00 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  ) ){.        rc 
27e10 3d 20 70 61 67 65 72 53 79 6e 63 48 6f 74 4a 6f  = pagerSyncHotJo
27e20 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
27e30 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
27e40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27e50 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
27e60 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
27e70 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 1);.        }.
27e80 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
27e90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
27ea0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
27eb0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
27ec0 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  rc);.          g
27ed0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
27ee0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
27ef0 20 20 20 20 61 73 73 65 72 74 28 20 28 70 50 61      assert( (pPa
27f00 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
27f10 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
27f20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d       || (pPager-
27f30 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26  >exclusiveMode &
27f40 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  & pPager->state>
27f50 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20  PAGER_SHARED).  
27f60 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 0a 20 20      );.    }..  
27f70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
27f80 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69 74 65 33  ackup || sqlite3
27f90 50 63 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28  PcachePagecount(
27fa0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
27fb0 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54  >0 ){.      /* T
27fc0 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
27fd0 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
27fe0 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
27ff0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
28000 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20 61 72   ** and there ar
28010 65 20 61 6c 72 65 61 64 79 20 70 61 67 65 73 20  e already pages 
28020 69 6e 20 74 68 65 20 63 61 63 68 65 20 28 66 72  in the cache (fr
28030 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a 20 20  om a previous.  
28040 20 20 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77      ** read or w
28050 72 69 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  rite transaction
28060 29 2e 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65  ).  Check to see
28070 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
28080 0a 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65  .      ** has be
28090 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
280a0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
280b0 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
280c0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63 61   the.      ** ca
280d0 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  che..      **.  
280e0 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20      ** Database 
280f0 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63  changes is detec
28100 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ted by looking a
28110 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e  t 15 bytes begin
28120 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20 61 74  ning.      ** at
28130 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
28140 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
28150 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
28160 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
28170 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
28180 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
28190 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
281a0 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
281b0 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74 68 65 72  e.      ** other
281c0 20 62 79 74 65 73 20 63 68 61 6e 67 65 20 72 61   bytes change ra
281d0 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61 63 68  ndomly with each
281e0 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77 68 65   file change whe
281f0 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64  n.      ** a cod
28200 65 63 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20  ec is in use..  
28210 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
28220 20 54 68 65 72 65 20 69 73 20 61 20 76 61 6e 69   There is a vani
28230 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68  shingly small ch
28240 61 6e 63 65 20 74 68 61 74 20 61 20 63 68 61 6e  ance that a chan
28250 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a  ge will not be .
28260 20 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65        ** detecte
28270 64 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f  d.  The chance o
28280 66 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20  f an undetected 
28290 63 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61  change is so sma
282a0 6c 6c 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  ll that.      **
282b0 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65   it can be negle
282c0 63 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cted..      */. 
282d0 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a       int nPage;.
282e0 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c        char dbFil
282f0 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61  eVers[sizeof(pPa
28300 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
28310 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ];.      sqlite3
28320 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
28330 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
28340 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
28350 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
28360 20 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65        rc = pPage
28370 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
28380 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
28390 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
283a0 69 66 28 20 6e 50 61 67 65 3e 30 20 29 7b 0a 20  if( nPage>0 ){. 
283b0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
283c0 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
283d0 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
283e0 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
283f0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
28400 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
28410 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65  r->fd, &dbFileVe
28420 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c  rs, sizeof(dbFil
28430 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20  eVers), 24);.   
28440 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
28460 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b      goto failed;
28470 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
28490 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72  memset(dbFileVer
284a0 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46  s, 0, sizeof(dbF
284b0 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
284c0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 65   }..      if( me
284d0 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
284e0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
284f0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
28500 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
28510 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73         pager_res
28520 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  et(pPager);.    
28530 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73    }.    }.    as
28540 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78  sert( pPager->ex
28550 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
28560 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
28570 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20  GER_SHARED );.. 
28580 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 69     /* If there i
28590 73 20 61 20 57 41 4c 20 66 69 6c 65 20 69 6e 20  s a WAL file in 
285a0 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
285b0 20 6f 70 65 6e 20 74 68 69 73 20 64 61 74 61 62   open this datab
285c0 61 73 65 20 69 6e 20 57 41 4c 0a 20 20 20 20 2a  ase in WAL.    *
285d0 2a 20 6d 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  * mode. Otherwis
285e0 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
285f0 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 69   function call i
28600 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a  s a no-op..    *
28610 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
28620 4f 70 65 6e 57 61 6c 49 66 50 72 65 73 65 6e 74  OpenWalIfPresent
28630 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
28640 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63  failed:.  if( rc
28650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
28660 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f     /* pager_unlo
28670 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20  ck() is a no-op 
28680 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f  for exclusive mo
28690 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79  de and in-memory
286a0 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20   databases. */. 
286b0 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
286c0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
286d0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
286e0 2a 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65  ** If the refere
286f0 6e 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65  nce count has re
28700 61 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c  ached zero, roll
28710 62 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a  back any active.
28720 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  ** transaction a
28730 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61  nd unlock the pa
28740 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70  ger..**.** Excep
28750 74 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  t, in locking_mo
28760 64 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65  de=EXCLUSIVE whe
28770 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69  n there is nothi
28780 6e 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20  ng to in.** the 
28790 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
287a0 2c 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20  , the unlock is 
287b0 6e 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e  not performed an
287c0 64 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f  d there is.** no
287d0 74 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63  thing to rollbac
287e0 6b 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69  k, so this routi
287f0 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
28800 2f 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  / .static void p
28810 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
28820 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
28830 29 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65  ){.  if( (sqlite
28840 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
28850 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
28860 3d 3d 30 29 0a 20 20 20 26 26 20 28 21 70 50 61  ==0).   && (!pPa
28870 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
28880 64 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  de || pPager->jo
28890 75 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29  urnalOff>0) .  )
288a0 7b 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63  {.    pagerUnloc
288b0 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
288c0 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
288d0 2a 2a 20 41 63 71 75 69 72 65 20 61 20 72 65 66  ** Acquire a ref
288e0 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20 6e  erence to page n
288f0 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e 20 70 61  umber pgno in pa
28900 67 65 72 20 70 50 61 67 65 72 20 28 61 20 70 61  ger pPager (a pa
28910 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 20  ge.** reference 
28920 68 61 73 20 74 79 70 65 20 44 62 50 61 67 65 2a  has type DbPage*
28930 29 2e 20 49 66 20 74 68 65 20 72 65 71 75 65 73  ). If the reques
28940 74 65 64 20 72 65 66 65 72 65 6e 63 65 20 69 73  ted reference is
28950 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c   .** successfull
28960 79 20 6f 62 74 61 69 6e 65 64 2c 20 69 74 20 69  y obtained, it i
28970 73 20 63 6f 70 69 65 64 20 74 6f 20 2a 70 70 50  s copied to *ppP
28980 61 67 65 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  age and SQLITE_O
28990 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  K returned..**.*
289a0 2a 20 49 66 20 74 68 65 20 72 65 71 75 65 73 74  * If the request
289b0 65 64 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  ed page is alrea
289c0 64 79 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c  dy in the cache,
289d0 20 69 74 20 69 73 20 72 65 74 75 72 6e 65 64 2e   it is returned.
289e0 20 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20   .** Otherwise, 
289f0 61 20 6e 65 77 20 70 61 67 65 20 6f 62 6a 65 63  a new page objec
28a00 74 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61  t is allocated a
28a10 6e 64 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  nd populated wit
28a20 68 20 64 61 74 61 0a 2a 2a 20 72 65 61 64 20 66  h data.** read f
28a30 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65  rom the database
28a40 20 66 69 6c 65 2e 20 49 6e 20 73 6f 6d 65 20 63   file. In some c
28a50 61 73 65 73 2c 20 74 68 65 20 70 63 61 63 68 65  ases, the pcache
28a60 20 6d 6f 64 75 6c 65 20 6d 61 79 0a 2a 2a 20 63   module may.** c
28a70 68 6f 6f 73 65 20 6e 6f 74 20 74 6f 20 61 6c 6c  hoose not to all
28a80 6f 63 61 74 65 20 61 20 6e 65 77 20 70 61 67 65  ocate a new page
28a90 20 6f 62 6a 65 63 74 20 61 6e 64 20 6d 61 79 20   object and may 
28aa0 72 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e  reuse an existin
28ab0 67 0a 2a 2a 20 6f 62 6a 65 63 74 20 77 69 74 68  g.** object with
28ac0 20 6e 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20   no outstanding 
28ad0 72 65 66 65 72 65 6e 63 65 73 2e 0a 2a 2a 0a 2a  references..**.*
28ae0 2a 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61  * The extra data
28af0 20 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70   appended to a p
28b00 61 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e  age is always in
28b10 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
28b20 6f 73 20 74 68 65 20 0a 2a 2a 20 66 69 72 73 74  os the .** first
28b30 20 74 69 6d 65 20 61 20 70 61 67 65 20 69 73 20   time a page is 
28b40 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f  loaded into memo
28b50 72 79 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ry. If the page 
28b60 72 65 71 75 65 73 74 65 64 20 69 73 20 0a 2a 2a  requested is .**
28b70 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
28b80 63 61 63 68 65 20 77 68 65 6e 20 74 68 69 73 20  cache when this 
28b90 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
28ba0 65 64 2c 20 74 68 65 6e 20 74 68 65 20 65 78 74  ed, then the ext
28bb0 72 61 0a 2a 2a 20 64 61 74 61 20 69 73 20 6c 65  ra.** data is le
28bc0 66 74 20 61 73 20 69 74 20 77 61 73 20 77 68 65  ft as it was whe
28bd0 6e 20 74 68 65 20 70 61 67 65 20 6f 62 6a 65 63  n the page objec
28be0 74 20 77 61 73 20 6c 61 73 74 20 75 73 65 64 2e  t was last used.
28bf0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61  .**.** If the da
28c00 74 61 62 61 73 65 20 69 6d 61 67 65 20 69 73 20  tabase image is 
28c10 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
28c20 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
28c30 6f 72 20 69 66 20 61 20 0a 2a 2a 20 6e 6f 6e 2d  or if a .** non-
28c40 7a 65 72 6f 20 76 61 6c 75 65 20 69 73 20 70 61  zero value is pa
28c50 73 73 65 64 20 61 73 20 74 68 65 20 6e 6f 43 6f  ssed as the noCo
28c60 6e 74 65 6e 74 20 70 61 72 61 6d 65 74 65 72 20  ntent parameter 
28c70 61 6e 64 20 74 68 65 20 0a 2a 2a 20 72 65 71 75  and the .** requ
28c80 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
28c90 74 20 61 6c 72 65 61 64 79 20 73 74 6f 72 65 64  t already stored
28ca0 20 69 6e 20 74 68 65 20 63 61 63 68 65 2c 20 74   in the cache, t
28cb0 68 65 6e 20 6e 6f 20 0a 2a 2a 20 61 63 74 75 61  hen no .** actua
28cc0 6c 20 64 69 73 6b 20 72 65 61 64 20 6f 63 63 75  l disk read occu
28cd0 72 73 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  rs. In this case
28ce0 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
28cf0 65 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61 67  e of the .** pag
28d00 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64  e is initialized
28d10 20 74 6f 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 0a   to all zeros. .
28d20 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
28d30 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d  nt is true, it m
28d40 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20  eans that we do 
28d50 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74  not care about t
28d60 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f  he contents.** o
28d70 66 20 74 68 65 20 70 61 67 65 2e 20 54 68 69 73  f the page. This
28d80 20 6f 63 63 75 72 73 20 69 6e 20 74 77 6f 20 73   occurs in two s
28d90 65 70 65 72 61 74 65 20 73 63 65 6e 61 72 69 6f  eperate scenario
28da0 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 29 20 57 68  s:.**.**   a) Wh
28db0 65 6e 20 72 65 61 64 69 6e 67 20 61 20 66 72 65  en reading a fre
28dc0 65 2d 6c 69 73 74 20 6c 65 61 66 20 70 61 67 65  e-list leaf page
28dd0 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
28de0 73 65 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  se, and.**.**   
28df0 62 29 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f  b) When a savepo
28e00 69 6e 74 20 69 73 20 62 65 69 6e 67 20 72 6f 6c  int is being rol
28e10 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 77 65 20  led back and we 
28e20 6e 65 65 64 20 74 6f 20 6c 6f 61 64 0a 2a 2a 20  need to load.** 
28e30 20 20 20 20 20 61 20 6e 65 77 20 70 61 67 65 20       a new page 
28e40 69 6e 74 6f 20 74 68 65 20 63 61 63 68 65 20 74  into the cache t
28e50 6f 20 62 65 20 66 69 6c 6c 65 64 20 77 69 74 68  o be filled with
28e60 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
28e70 2a 20 20 20 20 20 20 66 72 6f 6d 20 74 68 65 20  *      from the 
28e80 73 61 76 65 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  savepoint journa
28e90 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f  l..**.** If noCo
28ea0 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74  ntent is true, t
28eb0 68 65 6e 20 74 68 65 20 64 61 74 61 20 72 65 74  hen the data ret
28ec0 75 72 6e 65 64 20 69 73 20 7a 65 72 6f 65 64 20  urned is zeroed 
28ed0 69 6e 73 74 65 61 64 20 6f 66 0a 2a 2a 20 62 65  instead of.** be
28ee0 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 74 68  ing read from th
28ef0 65 20 64 61 74 61 62 61 73 65 2e 20 41 64 64 69  e database. Addi
28f00 74 69 6f 6e 61 6c 6c 79 2c 20 74 68 65 20 62 69  tionally, the bi
28f10 74 73 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  ts corresponding
28f20 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20 69 6e 20 50  .** to pgno in P
28f30 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
28f40 28 62 69 74 76 65 63 20 6f 66 20 70 61 67 65 73  (bitvec of pages
28f50 20 61 6c 72 65 61 64 79 20 77 72 69 74 74 65 6e   already written
28f60 20 74 6f 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e   to the.** journ
28f70 61 6c 20 66 69 6c 65 29 20 61 6e 64 20 74 68 65  al file) and the
28f80 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
28f90 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69 74  pInSavepoint bit
28fa0 76 65 63 73 20 6f 66 20 61 6e 79 20 6f 70 65 6e  vecs of any open
28fb0 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 73 20 61  .** savepoints a
28fc0 72 65 20 73 65 74 2e 20 54 68 69 73 20 6d 65 61  re set. This mea
28fd0 6e 73 20 69 66 20 74 68 65 20 70 61 67 65 20 69  ns if the page i
28fe0 73 20 6d 61 64 65 20 77 72 69 74 61 62 6c 65 20  s made writable 
28ff0 61 74 20 61 6e 79 0a 2a 2a 20 70 6f 69 6e 74 20  at any.** point 
29000 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20 75  in the future, u
29010 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f 20 73  sing a call to s
29020 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
29030 28 29 2c 20 69 74 73 20 63 6f 6e 74 65 6e 74 73  (), its contents
29040 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  .** will not be 
29050 6a 6f 75 72 6e 61 6c 65 64 2e 20 54 68 69 73 20  journaled. This 
29060 73 61 76 65 73 20 49 4f 2e 0a 2a 2a 0a 2a 2a 20  saves IO..**.** 
29070 54 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20  The acquisition 
29080 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73  might fail for s
29090 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20  everal reasons. 
290a0 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a   In all cases,.*
290b0 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
290c0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
290d0 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50  eturned and *ppP
290e0 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55  age is set to NU
290f0 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  LL..**.** See al
29100 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  so sqlite3PagerL
29110 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
29120 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
29130 4c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74  Lookup() attempt
29140 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61  .** to find a pa
29150 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  ge in the in-mem
29160 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e  ory cache first.
29170 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73    If the page is
29180 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20   not already.** 
29190 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20  in memory, this 
291a0 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20  routine goes to 
291b0 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20  disk to read it 
291c0 69 6e 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75  in whereas Looku
291d0 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
291e0 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
291f0 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
29200 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
29210 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
29220 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
29230 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
29240 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
29250 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
29260 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
29270 4c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  Lookup() never g
29280 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
29290 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
292a0 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
292b0 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
292c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
292d0 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  PagerAcquire(.  
292e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
292f0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
29300 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
29310 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
29320 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
29330 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
29340 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
29350 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
29360 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
29370 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
29380 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
29390 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
293a0 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
293b0 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
293c0 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
293d0 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  true */.){.  int
293e0 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
293f0 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 61 73  g;..  assert( as
29400 73 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65  sert_pager_state
29410 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 61 73  (pPager) );.  as
29420 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
29430 61 74 65 3e 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  ate>PAGER_UNLOCK
29440 20 29 3b 0a 0a 20 20 69 66 28 20 70 67 6e 6f 3d   );..  if( pgno=
29450 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
29460 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f   SQLITE_CORRUPT_
29470 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  BKPT;.  }..  /* 
29480 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
29490 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  in the error sta
294a0 74 65 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72  te, return an er
294b0 72 6f 72 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e  ror immediately.
294c0 20 0a 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65   .  ** Otherwise
294d0 2c 20 72 65 71 75 65 73 74 20 74 68 65 20 70 61  , request the pa
294e0 67 65 20 66 72 6f 6d 20 74 68 65 20 50 43 61 63  ge from the PCac
294f0 68 65 20 6c 61 79 65 72 2e 20 2a 2f 0a 20 20 69  he layer. */.  i
29500 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
29510 64 65 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  de!=SQLITE_OK &&
29520 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
29530 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
29540 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72  .    rc = pPager
29550 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 65 6c  ->errCode;.  }el
29560 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
29570 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68 28  ite3PcacheFetch(
29580 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c  pPager->pPCache,
29590 20 70 67 6e 6f 2c 20 31 2c 20 70 70 50 61 67 65   pgno, 1, ppPage
295a0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
295b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
295c0 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
295d0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
295e0 50 63 61 63 68 65 46 65 74 63 68 28 29 20 72 65  PcacheFetch() re
295f0 74 75 72 6e 65 64 20 61 6e 20 65 72 72 6f 72 20  turned an error 
29600 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 70 61  or the.    ** pa
29610 67 65 72 20 77 61 73 20 61 6c 72 65 61 64 79 20  ger was already 
29620 69 6e 20 74 68 65 20 65 72 72 6f 72 2d 73 74 61  in the error-sta
29630 74 65 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e  te when this fun
29640 63 74 69 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64  ction was called
29650 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 70 50 67  ..    ** Set pPg
29660 20 74 6f 20 30 20 61 6e 64 20 6a 75 6d 70 20 74   to 0 and jump t
29670 6f 20 74 68 65 20 65 78 63 65 70 74 69 6f 6e 20  o the exception 
29680 68 61 6e 64 6c 65 72 2e 20 20 2a 2f 0a 20 20 20  handler.  */.   
29690 20 70 50 67 20 3d 20 30 3b 0a 20 20 20 20 67 6f   pPg = 0;.    go
296a0 74 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65  to pager_acquire
296b0 5f 65 72 72 3b 0a 20 20 7d 0a 20 20 61 73 73 65  _err;.  }.  asse
296c0 72 74 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70  rt( (*ppPage)->p
296d0 67 6e 6f 3d 3d 70 67 6e 6f 20 29 3b 0a 20 20 61  gno==pgno );.  a
296e0 73 73 65 72 74 28 20 28 2a 70 70 50 61 67 65 29  ssert( (*ppPage)
296f0 2d 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72  ->pPager==pPager
29700 20 7c 7c 20 28 2a 70 70 50 61 67 65 29 2d 3e 70   || (*ppPage)->p
29710 50 61 67 65 72 3d 3d 30 20 29 3b 0a 0a 20 20 69  Pager==0 );..  i
29720 66 28 20 28 2a 70 70 50 61 67 65 29 2d 3e 70 50  f( (*ppPage)->pP
29730 61 67 65 72 20 26 26 20 21 6e 6f 43 6f 6e 74 65  ager && !noConte
29740 6e 74 20 29 7b 0a 20 20 20 20 2f 2a 20 49 6e 20  nt ){.    /* In 
29750 74 68 69 73 20 63 61 73 65 20 74 68 65 20 70 63  this case the pc
29760 61 63 68 65 20 61 6c 72 65 61 64 79 20 63 6f 6e  ache already con
29770 74 61 69 6e 73 20 61 6e 20 69 6e 69 74 69 61 6c  tains an initial
29780 69 7a 65 64 20 63 6f 70 79 20 6f 66 0a 20 20 20  ized copy of.   
29790 20 2a 2a 20 74 68 65 20 70 61 67 65 2e 20 52 65   ** the page. Re
297a0 74 75 72 6e 20 77 69 74 68 6f 75 74 20 66 75 72  turn without fur
297b0 74 68 65 72 20 61 64 6f 2e 20 20 2a 2f 0a 20 20  ther ado.  */.  
297c0 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 3c 3d    assert( pgno<=
297d0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 26  PAGER_MAX_PGNO &
297e0 26 20 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a  & pgno!=PAGER_MJ
297f0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b  _PGNO(pPager) );
29800 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
29810 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20  pPager->nHit);. 
29820 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
29830 5f 4f 4b 3b 0a 0a 20 20 7d 65 6c 73 65 7b 0a 20  _OK;..  }else{. 
29840 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
29850 63 61 63 68 65 20 68 61 73 20 63 72 65 61 74 65  cache has create
29860 64 20 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74  d a new page. It
29870 73 20 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20  s content needs 
29880 74 6f 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e  to .    ** be in
29890 69 74 69 61 6c 69 7a 65 64 2e 20 20 2a 2f 0a 20  itialized.  */. 
298a0 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 0a 20 20     int nMax;..  
298b0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
298c0 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
298d0 20 70 50 67 20 3d 20 2a 70 70 50 61 67 65 3b 0a   pPg = *ppPage;.
298e0 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20      pPg->pPager 
298f0 3d 20 70 50 61 67 65 72 3b 0a 0a 20 20 20 20 2f  = pPager;..    /
29900 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
29910 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
29920 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
29930 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
29940 67 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ge.    ** number
29950 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
29960 69 73 2c 20 6f 72 20 74 68 65 20 75 6e 75 73 65  is, or the unuse
29970 64 20 6c 6f 63 6b 69 6e 67 2d 70 61 67 65 2c 20  d locking-page, 
29980 69 73 20 72 65 71 75 65 73 74 65 64 2e 20 2a 2f  is requested. */
29990 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  .    if( pgno>PA
299a0 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
299b0 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
299c0 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
299d0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
299e0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
299f0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
29a00 61 63 71 75 69 72 65 5f 65 72 72 3b 0a 20 20 20  acquire_err;.   
29a10 20 7d 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   }..    rc = sql
29a20 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
29a30 6e 74 28 70 50 61 67 65 72 2c 20 26 6e 4d 61 78  nt(pPager, &nMax
29a40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
29a50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
29a60 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 63 71    goto pager_acq
29a70 75 69 72 65 5f 65 72 72 3b 0a 20 20 20 20 7d 0a  uire_err;.    }.
29a80 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 7c  .    if( MEMDB |
29a90 7c 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f  | nMax<(int)pgno
29aa0 20 7c 7c 20 6e 6f 43 6f 6e 74 65 6e 74 20 7c 7c   || noContent ||
29ab0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
29ac0 3e 66 64 29 20 29 7b 0a 20 20 20 20 20 20 69 66  >fd) ){.      if
29ad0 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
29ae0 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
29af0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
29b00 4c 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  L;.        goto 
29b10 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f 65 72  pager_acquire_er
29b20 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
29b30 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
29b40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
29b50 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
29b60 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
29b70 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
29b80 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
29b90 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
29ba0 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
29bb0 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
29bc0 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
29bd0 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
29be0 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
29bf0 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
29c00 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
29c10 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
29c20 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
29c30 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
29c40 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
29c50 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
29c60 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
29c70 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
29c80 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
29c90 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
29ca0 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
29cb0 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
29cc0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
29cd0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
29ce0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
29cf0 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
29d00 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
29d10 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
29d20 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
29d30 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
29d40 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
29d50 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
29d60 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
29d70 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
29d80 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
29d90 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
29da0 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
29db0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
29dc0 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
29dd0 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
29de0 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 0a  lloc();.      }.
29df0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67        memset(pPg
29e00 2d 3e 70 44 61 74 61 2c 20 30 2c 20 70 50 61 67  ->pData, 0, pPag
29e10 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
29e20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a       IOTRACE(("Z
29e30 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERO %p %d\n", pP
29e40 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ager, pgno));.  
29e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
29e60 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67  ssert( pPg->pPag
29e70 65 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20  er==pPager );.  
29e80 20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50      rc = readDbP
29e90 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
29ea0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
29eb0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74  K ){.        got
29ec0 6f 20 70 61 67 65 72 5f 61 63 71 75 69 72 65 5f  o pager_acquire_
29ed0 65 72 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  err;.      }.   
29ee0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
29ef0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
29f00 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
29f10 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
29f20 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
29f30 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
29f40 45 5f 4f 4b 3b 0a 0a 70 61 67 65 72 5f 61 63 71  E_OK;..pager_acq
29f50 75 69 72 65 5f 65 72 72 3a 0a 20 20 61 73 73 65  uire_err:.  asse
29f60 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
29f70 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 67 20 29  K );.  if( pPg )
29f80 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61  {.    sqlite3Pca
29f90 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
29fa0 7d 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 49  }.  pagerUnlockI
29fb0 66 55 6e 75 73 65 64 28 70 50 61 67 65 72 29 3b  fUnused(pPager);
29fc0 0a 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ..  *ppPage = 0;
29fd0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29fe0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
29ff0 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
2a000 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
2a010 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
2a020 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
2a030 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
2a040 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
2a050 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
2a060 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
2a070 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
2a080 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74  cache. Also, ret
2a090 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a 2a  urn 0 if the .**
2a0a0 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
2a0b0 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
2a0c0 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
2a0d0 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  on is called,.**
2a0e0 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72   or if the pager
2a0f0 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20   is in an error 
2a100 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e  state other than
2a110 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a   SQLITE_FULL..**
2a120 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
2a130 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
2a140 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
2a150 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
2a160 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
2a170 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
2a180 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
2a190 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
2a1a0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
2a1b0 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
2a1c0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
2a1d0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
2a1e0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
2a1f0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
2a200 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
2a210 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
2a220 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
2a230 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
2a240 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
2a250 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
2a260 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
2a270 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
2a280 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
2a290 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
2a2a0 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
2a2b0 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 61  ( pgno!=0 );.  a
2a2c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
2a2d0 50 43 61 63 68 65 21 3d 30 20 29 3b 0a 20 20 61  PCache!=0 );.  a
2a2e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
2a2f0 74 61 74 65 20 3e 20 50 41 47 45 52 5f 55 4e 4c  tate > PAGER_UNL
2a300 4f 43 4b 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  OCK );.  sqlite3
2a310 50 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67  PcacheFetch(pPag
2a320 65 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e  er->pPCache, pgn
2a330 6f 2c 20 30 2c 20 26 70 50 67 29 3b 0a 20 20 72  o, 0, &pPg);.  r
2a340 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a  eturn pPg;.}../*
2a350 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
2a360 67 65 20 72 65 66 65 72 65 6e 63 65 2e 0a 2a 2a  ge reference..**
2a370 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
2a380 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
2a390 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
2a3a0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
2a3b0 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
2a3c0 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
2a3d0 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
2a3e0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
2a3f0 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
2a400 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
2a410 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
2a420 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
2a430 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
2a440 6f 76 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  oved..*/.void sq
2a450 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2a460 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
2a470 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 50  if( pPg ){.    P
2a480 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2a490 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
2a4a0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
2a4b0 65 61 73 65 28 70 50 67 29 3b 0a 20 20 20 20 70  ease(pPg);.    p
2a4c0 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73  agerUnlockIfUnus
2a4d0 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ed(pPager);.  }.
2a4e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
2a4f0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2a500 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
2a510 20 65 76 65 72 79 20 77 72 69 74 65 20 74 72 61   every write tra
2a520 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65  nsaction..** The
2a530 72 65 20 6d 75 73 74 20 61 6c 72 65 61 64 79 20  re must already 
2a540 62 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  be a RESERVED or
2a550 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
2a560 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
2a570 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20 74 68  .** file when th
2a580 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
2a590 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e  lled..**.** Open
2a5a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2a5b0 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
2a5c0 65 72 20 61 6e 64 20 77 72 69 74 65 20 61 20 6a  er and write a j
2a5d0 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
2a5e0 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
2a5f0 20 69 74 2e 20 49 66 20 74 68 65 72 65 20 61 72   it. If there ar
2a600 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f 69  e active savepoi
2a610 6e 74 73 2c 20 6f 70 65 6e 20 74 68 65 20 73 75  nts, open the su
2a620 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20  b-journal.** as 
2a630 77 65 6c 6c 2e 20 54 68 69 73 20 66 75 6e 63 74  well. This funct
2a640 69 6f 6e 20 69 73 20 6f 6e 6c 79 20 75 73 65 64  ion is only used
2a650 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
2a660 6c 20 66 69 6c 65 20 69 73 20 62 65 69 6e 67 20  l file is being 
2a670 0a 2a 2a 20 6f 70 65 6e 65 64 20 74 6f 20 77 72  .** opened to wr
2a680 69 74 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c  ite a rollback l
2a690 6f 67 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  og for a transac
2a6a0 74 69 6f 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20  tion. It is not 
2a6b0 75 73 65 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70  used .** when op
2a6c0 65 6e 69 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72  ening a hot jour
2a6d0 6e 61 6c 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c  nal file to roll
2a6e0 20 69 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20   it back..**.** 
2a6f0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
2a700 69 6c 65 20 69 73 20 61 6c 72 65 61 64 79 20 6f  ile is already o
2a710 70 65 6e 20 28 61 73 20 69 74 20 6d 61 79 20 62  pen (as it may b
2a720 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  e in exclusive m
2a730 6f 64 65 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  ode),.** then th
2a740 69 73 20 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74  is function just
2a750 20 77 72 69 74 65 73 20 61 20 6a 6f 75 72 6e 61   writes a journa
2a760 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
2a770 73 74 61 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20  start of the.** 
2a780 61 6c 72 65 61 64 79 20 6f 70 65 6e 20 66 69 6c  already open fil
2a790 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65  e. .**.** Whethe
2a7a0 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75  r or not the jou
2a7b0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
2a7c0 6e 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  ned by this func
2a7d0 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67  tion, the.** Pag
2a7e0 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69  er.pInJournal bi
2a7f0 74 76 65 63 20 73 74 72 75 63 74 75 72 65 20 69  tvec structure i
2a800 73 20 61 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a  s allocated..**.
2a810 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
2a820 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e  _OK if everythin
2a830 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  g is successful.
2a840 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75   Otherwise, retu
2a850 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f  rn .** SQLITE_NO
2a860 4d 45 4d 20 69 66 20 74 68 65 20 61 74 74 65 6d  MEM if the attem
2a870 70 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50  pt to allocate P
2a880 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ager.pInJournal 
2a890 66 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e  fails, or .** an
2a8a0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2a8b0 66 20 6f 70 65 6e 69 6e 67 20 6f 72 20 77 72 69  f opening or wri
2a8c0 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ting the journal
2a8d0 20 66 69 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a   file fails..*/.
2a8e0 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
2a8f0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
2a900 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2a910 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2a920 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
2a930 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2a940 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
2a950 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
2a960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a970 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
2a980 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 66 69  e of database fi
2a990 6c 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  le */.  sqlite3_
2a9a0 76 66 73 20 2a 20 63 6f 6e 73 74 20 70 56 66 73  vfs * const pVfs
2a9b0 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b   = pPager->pVfs;
2a9c0 20 20 20 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68     /* Local cach
2a9d0 65 20 6f 66 20 76 66 73 20 70 6f 69 6e 74 65 72  e of vfs pointer
2a9e0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
2a9f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
2aa00 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
2aa10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2aa20 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
2aa30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2aa40 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2aa50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2aa60 5f 4f 46 46 20 29 3b 0a 20 20 61 73 73 65 72 74  _OFF );.  assert
2aa70 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  ( pPager->pInJou
2aa80 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 0a 20 20  rnal==0 );.  .  
2aa90 2f 2a 20 49 66 20 61 6c 72 65 61 64 79 20 69 6e  /* If already in
2aaa0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
2aab0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
2aac0 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 20 42 75 74  is a no-op.  But
2aad0 20 6f 6e 0a 20 20 2a 2a 20 74 68 65 20 6f 74 68   on.  ** the oth
2aae0 65 72 20 68 61 6e 64 2c 20 74 68 69 73 20 72 6f  er hand, this ro
2aaf0 75 74 69 6e 65 20 69 73 20 6e 65 76 65 72 20 63  utine is never c
2ab00 61 6c 6c 65 64 20 69 66 20 77 65 20 61 72 65 20  alled if we are 
2ab10 61 6c 72 65 61 64 79 20 69 6e 0a 20 20 2a 2a 20  already in.  ** 
2ab20 61 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20  an error state. 
2ab30 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
2ab40 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20  Pager->errCode) 
2ab50 29 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d  ) return pPager-
2ab60 3e 65 72 72 43 6f 64 65 3b 0a 0a 20 20 74 65 73  >errCode;..  tes
2ab70 74 63 61 73 65 28 20 70 50 61 67 65 72 2d 3e 64  tcase( pPager->d
2ab80 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20 29 3b  bSizeValid==0 );
2ab90 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50  .  rc = sqlite3P
2aba0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
2abb0 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a 20  ager, &nPage);. 
2abc0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
2abd0 20 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70   rc;.  pPager->p
2abe0 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  InJournal = sqli
2abf0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
2ac00 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 70 50  nPage);.  if( pP
2ac10 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2ac20 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
2ac30 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
2ac40 20 20 7d 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74    }..  /* Open t
2ac50 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2ac60 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
2ac70 65 61 64 79 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20  eady open. */.  
2ac80 69 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67  if( !isOpen(pPag
2ac90 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
2aca0 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
2acb0 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
2acc0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52  OURNALMODE_MEMOR
2acd0 59 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Y ){.      sqlit
2ace0 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e  e3MemJournalOpen
2acf0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
2ad00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ad10 63 6f 6e 73 74 20 69 6e 74 20 66 6c 61 67 73 20  const int flags 
2ad20 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  =               
2ad30 20 20 20 20 2f 2a 20 56 46 53 20 66 6c 61 67 73      /* VFS flags
2ad40 20 74 6f 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c   to open journal
2ad50 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20   file */.       
2ad60 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
2ad70 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
2ad80 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20 20 20  EN_CREATE|.     
2ad90 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70     (pPager->temp
2ada0 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20 20 20  File ? .        
2adb0 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44    (SQLITE_OPEN_D
2adc0 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
2add0 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
2ade0 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20 20 20  URNAL):.        
2adf0 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d    (SQLITE_OPEN_M
2ae00 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20 20 20  AIN_JOURNAL).   
2ae10 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66 20 53       );.#ifdef S
2ae20 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
2ae30 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
2ae40 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
2ae50 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20 20 20  nalOpen(.       
2ae60 20 20 20 70 56 66 73 2c 20 70 50 61 67 65 72 2d     pVfs, pPager-
2ae70 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
2ae80 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 6a  r->jfd, flags, j
2ae90 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 70 50  rnlBufferSize(pP
2aea0 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b 0a 23  ager).      );.#
2aeb0 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20  else.      rc = 
2aec0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
2aed0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
2aee0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
2aef0 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
2af00 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 61  ndif.    }.    a
2af10 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
2af20 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
2af30 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
2af40 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20   }...  /* Write 
2af50 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61  the first journa
2af60 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68 65 20  l header to the 
2af70 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
2af80 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68 65 20   open .  ** the 
2af90 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 6e  sub-journal if n
2afa0 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f 0a 20  ecessary..  */. 
2afb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
2afc0 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 4f 44  OK ){.    /* TOD
2afd0 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c 6c 20  O: Check if all 
2afe0 6f 66 20 74 68 65 73 65 20 61 72 65 20 72 65 61  of these are rea
2aff0 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20 2a 2f  lly required. */
2b000 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 4f  .    pPager->dbO
2b010 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67 65 72  rigSize = pPager
2b020 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 70 50  ->dbSize;.    pP
2b030 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
2b040 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 70 50  rted = 0;.    pP
2b050 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
2b060 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
2b070 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  nRec = 0;.    pP
2b080 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2b090 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
2b0a0 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
2b0b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
2b0c0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 20  rnalHdr = 0;.   
2b0d0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
2b0e0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
2b0f0 20 7d 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51   }..  if( rc!=SQ
2b100 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2b110 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
2b120 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
2b130 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
2b140 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
2b150 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
2b160 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42  n rc;.}../*.** B
2b170 65 67 69 6e 20 61 20 77 72 69 74 65 2d 74 72 61  egin a write-tra
2b180 6e 73 61 63 74 69 6f 6e 20 6f 6e 20 74 68 65 20  nsaction on the 
2b190 73 70 65 63 69 66 69 65 64 20 70 61 67 65 72 20  specified pager 
2b1a0 6f 62 6a 65 63 74 2e 20 49 66 20 61 20 0a 2a 2a  object. If a .**
2b1b0 20 77 72 69 74 65 2d 74 72 61 6e 73 61 63 74 69   write-transacti
2b1c0 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  on has already b
2b1d0 65 65 6e 20 6f 70 65 6e 65 64 2c 20 74 68 69 73  een opened, this
2b1e0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2b1f0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  o-op..**.** If t
2b200 68 65 20 65 78 46 6c 61 67 20 61 72 67 75 6d 65  he exFlag argume
2b210 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
2b220 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c 65 61  n acquire at lea
2b230 73 74 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  st a RESERVED.**
2b240 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
2b250 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 65  abase file. If e
2b260 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74  xFlag is true, t
2b270 68 65 6e 20 61 63 71 75 69 72 65 20 61 74 20 6c  hen acquire at l
2b280 65 61 73 74 0a 2a 2a 20 61 6e 20 45 58 43 4c 55  east.** an EXCLU
2b290 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 73 75  SIVE lock. If su
2b2a0 63 68 20 61 20 6c 6f 63 6b 20 69 73 20 61 6c 72  ch a lock is alr
2b2b0 65 61 64 79 20 68 65 6c 64 2c 20 6e 6f 20 6c 6f  eady held, no lo
2b2c0 63 6b 69 6e 67 20 0a 2a 2a 20 66 75 6e 63 74 69  cking .** functi
2b2d0 6f 6e 73 20 6e 65 65 64 20 62 65 20 63 61 6c 6c  ons need be call
2b2e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  ed..**.** If thi
2b2f0 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
2b300 72 61 72 79 20 6f 72 20 69 6e 2d 6d 65 6d 6f 72  rary or in-memor
2b310 79 20 66 69 6c 65 20 61 6e 64 2c 20 74 68 65 20  y file and, the 
2b320 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
2b330 0a 2a 2a 20 6f 70 65 6e 65 64 20 69 66 20 69 74  .** opened if it
2b340 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 61 6c   has not been al
2b350 72 65 61 64 79 2e 20 46 6f 72 20 61 20 74 65 6d  ready. For a tem
2b360 70 6f 72 61 72 79 20 66 69 6c 65 2c 20 74 68 65  porary file, the
2b370 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a 20 6f 66 20   opening .** of 
2b380 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2b390 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
2b3a0 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 20 61  il there is an a
2b3b0 63 74 75 61 6c 20 6e 65 65 64 20 74 6f 20 0a 2a  ctual need to .*
2b3c0 2a 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  * write to the j
2b3d0 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f 3a 20 57 68  ournal. TODO: Wh
2b3e0 79 20 68 61 6e 64 6c 65 20 74 65 6d 70 6f 72 61  y handle tempora
2b3f0 72 79 20 66 69 6c 65 73 20 64 69 66 66 65 72 65  ry files differe
2b400 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ntly?.**.** If t
2b410 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2b420 69 73 20 6f 70 65 6e 65 64 20 28 6f 72 20 69 66  is opened (or if
2b430 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 6f   it is already o
2b440 70 65 6e 29 2c 20 74 68 65 6e 20 61 0a 2a 2a 20  pen), then a.** 
2b450 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
2b460 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  s written to the
2b470 20 73 74 61 72 74 20 6f 66 20 69 74 2e 0a 2a 2a   start of it..**
2b480 0a 2a 2a 20 49 66 20 74 68 65 20 73 75 62 6a 49  .** If the subjI
2b490 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65 6e 74  nMemory argument
2b4a0 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
2b4b0 65 6e 20 61 6e 79 20 73 75 62 2d 6a 6f 75 72 6e  en any sub-journ
2b4c0 61 6c 20 6f 70 65 6e 65 64 0a 2a 2a 20 77 69 74  al opened.** wit
2b4d0 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73 61 63  hin this transac
2b4e0 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 6f 70 65  tion will be ope
2b4f0 6e 65 64 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d  ned as an in-mem
2b500 6f 72 79 20 66 69 6c 65 2e 20 54 68 69 73 0a 2a  ory file. This.*
2b510 2a 20 68 61 73 20 6e 6f 20 65 66 66 65 63 74 20  * has no effect 
2b520 69 66 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  if the sub-journ
2b530 61 6c 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70  al is already op
2b540 65 6e 65 64 20 28 61 73 20 69 74 20 6d 61 79 20  ened (as it may 
2b550 62 65 20 77 68 65 6e 0a 2a 2a 20 72 75 6e 6e 69  be when.** runni
2b560 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20  ng in exclusive 
2b570 6d 6f 64 65 29 20 6f 72 20 69 66 20 74 68 65 20  mode) or if the 
2b580 74 72 61 6e 73 61 63 74 69 6f 6e 20 64 6f 65 73  transaction does
2b590 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 0a 2a   not require a.*
2b5a0 2a 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 49  * sub-journal. I
2b5b0 66 20 74 68 65 20 73 75 62 6a 49 6e 4d 65 6d 6f  f the subjInMemo
2b5c0 72 79 20 61 72 67 75 6d 65 6e 74 20 69 73 20 7a  ry argument is z
2b5d0 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 72 65  ero, then any re
2b5e0 71 75 69 72 65 64 0a 2a 2a 20 73 75 62 2d 6a 6f  quired.** sub-jo
2b5f0 75 72 6e 61 6c 20 69 73 20 69 6d 70 6c 65 6d 65  urnal is impleme
2b600 6e 74 65 64 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  nted in-memory i
2b610 66 20 70 50 61 67 65 72 20 69 73 20 61 6e 20 69  f pPager is an i
2b620 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2b630 65 2c 20 0a 2a 2a 20 6f 72 20 75 73 69 6e 67 20  e, .** or using 
2b640 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
2b650 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 69   otherwise..*/.i
2b660 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 42  nt sqlite3PagerB
2b670 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  egin(Pager *pPag
2b680 65 72 2c 20 69 6e 74 20 65 78 46 6c 61 67 2c 20  er, int exFlag, 
2b690 69 6e 74 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79  int subjInMemory
2b6a0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2b6b0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
2b6c0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2b6d0 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
2b6e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 75 62 6a  ;.  pPager->subj
2b6f0 49 6e 4d 65 6d 6f 72 79 20 3d 20 28 75 38 29 73  InMemory = (u8)s
2b700 75 62 6a 49 6e 4d 65 6d 6f 72 79 3b 0a 0a 20 20  ubjInMemory;..  
2b710 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
2b720 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
2b730 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2b740 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2b750 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  l==0 );.    asse
2b760 72 74 28 20 21 4d 45 4d 44 42 20 26 26 20 21 70  rt( !MEMDB && !p
2b770 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
2b780 29 3b 0a 0a 20 20 20 20 69 66 28 20 70 61 67 65  );..    if( page
2b790 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20  rUseWal(pPager) 
2b7a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ){.      /* If t
2b7b0 68 65 20 70 61 67 65 72 20 69 73 20 63 6f 6e 66  he pager is conf
2b7c0 69 67 75 72 65 64 20 74 6f 20 75 73 65 20 6c 6f  igured to use lo
2b7d0 63 6b 69 6e 67 5f 6d 6f 64 65 3d 65 78 63 6c 75  cking_mode=exclu
2b7e0 73 69 76 65 2c 20 61 6e 64 20 61 6e 0a 20 20 20  sive, and an.   
2b7f0 20 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 20     ** exclusive 
2b800 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
2b810 62 61 73 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  base is not alre
2b820 61 64 79 20 68 65 6c 64 2c 20 6f 62 74 61 69 6e  ady held, obtain
2b830 20 69 74 20 6e 6f 77 2e 0a 20 20 20 20 20 20 2a   it now..      *
2b840 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
2b850 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2b860 65 20 26 26 20 73 71 6c 69 74 65 33 57 61 6c 45  e && sqlite3WalE
2b870 78 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61  xclusiveMode(pPa
2b880 67 65 72 2d 3e 70 57 61 6c 2c 20 2d 31 29 20 29  ger->pWal, -1) )
2b890 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
2b8a0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
2b8b0 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49  ger->fd, EXCLUSI
2b8c0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
2b8d0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
2b8e0 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
2b8f0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
2b900 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2b910 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
2b920 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2b930 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 45 78      sqlite3WalEx
2b940 63 6c 75 73 69 76 65 4d 6f 64 65 28 70 50 61 67  clusiveMode(pPag
2b950 65 72 2d 3e 70 57 61 6c 2c 20 31 29 3b 0a 20 20  er->pWal, 1);.  
2b960 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
2b970 47 72 61 62 20 74 68 65 20 77 72 69 74 65 20 6c  Grab the write l
2b980 6f 63 6b 20 6f 6e 20 74 68 65 20 6c 6f 67 20 66  ock on the log f
2b990 69 6c 65 2e 20 49 66 20 73 75 63 63 65 73 73 66  ile. If successf
2b9a0 75 6c 2c 20 75 70 67 72 61 64 65 20 74 6f 0a 20  ul, upgrade to. 
2b9b0 20 20 20 20 20 2a 2a 20 50 41 47 45 52 5f 52 45       ** PAGER_RE
2b9c0 53 45 52 56 45 44 20 73 74 61 74 65 2e 20 4f 74  SERVED state. Ot
2b9d0 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
2b9e0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f  an error code to
2b9f0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 20 20 20   the caller..   
2ba00 20 20 20 2a 2a 20 54 68 65 20 62 75 73 79 2d 68     ** The busy-h
2ba10 61 6e 64 6c 65 72 20 69 73 20 6e 6f 74 20 69 6e  andler is not in
2ba20 76 6f 6b 65 64 20 69 66 20 61 6e 6f 74 68 65 72  voked if another
2ba30 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 6c 72 65   connection alre
2ba40 61 64 79 0a 20 20 20 20 20 20 2a 2a 20 68 6f 6c  ady.      ** hol
2ba50 64 73 20 74 68 65 20 77 72 69 74 65 2d 6c 6f 63  ds the write-loc
2ba60 6b 2e 20 49 66 20 70 6f 73 73 69 62 6c 65 2c 20  k. If possible, 
2ba70 74 68 65 20 75 70 70 65 72 20 6c 61 79 65 72 20  the upper layer 
2ba80 77 69 6c 6c 20 63 61 6c 6c 20 69 74 2e 0a 20 20  will call it..  
2ba90 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
2baa0 57 41 4c 20 6d 6f 64 65 20 73 65 74 73 20 50 61  WAL mode sets Pa
2bab0 67 65 72 2e 73 74 61 74 65 20 74 6f 20 50 41 47  ger.state to PAG
2bac0 45 52 5f 52 45 53 45 52 56 45 44 20 77 68 65 6e  ER_RESERVED when
2bad0 20 69 74 20 68 61 73 20 61 6e 20 6f 70 65 6e 0a   it has an open.
2bae0 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63        ** transac
2baf0 74 69 6f 6e 2c 20 62 75 74 20 6e 65 76 65 72 20  tion, but never 
2bb00 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  to PAGER_EXCLUSI
2bb10 56 45 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  VE. This is beca
2bb20 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a  use in .      **
2bb30 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
2bb40 20 73 74 61 74 65 20 74 68 65 20 63 6f 64 65 20   state the code 
2bb50 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 73 61 76  to roll back sav
2bb60 65 70 6f 69 6e 74 20 74 72 61 6e 73 61 63 74 69  epoint transacti
2bb70 6f 6e 73 0a 20 20 20 20 20 20 2a 2a 20 6d 61 79  ons.      ** may
2bb80 20 63 6f 70 79 20 64 61 74 61 20 66 72 6f 6d 20   copy data from 
2bb90 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20  the sub-journal 
2bba0 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
2bbb0 65 20 66 69 6c 65 20 61 73 20 77 65 6c 6c 0a 20  e file as well. 
2bbc0 20 20 20 20 20 2a 2a 20 61 73 20 69 6e 74 6f 20       ** as into 
2bbd0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
2bbe0 57 68 69 63 68 20 77 6f 75 6c 64 20 62 65 20 69  Which would be i
2bbf0 6e 63 6f 72 72 65 63 74 20 69 6e 20 57 41 4c 20  ncorrect in WAL 
2bc00 6d 6f 64 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mode..      */. 
2bc10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2bc20 33 57 61 6c 42 65 67 69 6e 57 72 69 74 65 54 72  3WalBeginWriteTr
2bc30 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
2bc40 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 20 20 69  ->pWal);.      i
2bc50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2bc60 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
2bc70 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d  er->dbOrigSize =
2bc80 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
2bc90 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
2bca0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
2bcb0 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20  ESERVED;.       
2bcc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2bcd0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  Off = 0;.      }
2bce0 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ..      assert( 
2bcf0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
2bd00 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
2bd10 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
2bd20 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
2bd30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc==SQLITE_OK ||
2bd40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
2bd50 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
2bd60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2bd70 20 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53   /* Obtain a RES
2bd80 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
2bd90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
2bda0 20 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70   If the exFlag p
2bdb0 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 20 2a  arameter.      *
2bdc0 2a 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  * is true, then 
2bdd0 69 6d 6d 65 64 69 61 74 65 6c 79 20 75 70 67 72  immediately upgr
2bde0 61 64 65 20 74 68 69 73 20 74 6f 20 61 6e 20 45  ade this to an E
2bdf0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
2be00 68 65 0a 20 20 20 20 20 20 2a 2a 20 62 75 73 79  he.      ** busy
2be10 2d 68 61 6e 64 6c 65 72 20 63 61 6c 6c 62 61 63  -handler callbac
2be20 6b 20 63 61 6e 20 62 65 20 75 73 65 64 20 77 68  k can be used wh
2be30 65 6e 20 75 70 67 72 61 64 69 6e 67 20 74 6f 20  en upgrading to 
2be40 74 68 65 20 45 58 43 4c 55 53 49 56 45 0a 20 20  the EXCLUSIVE.  
2be50 20 20 20 20 2a 2a 20 6c 6f 63 6b 2c 20 62 75 74      ** lock, but
2be60 20 6e 6f 74 20 77 68 65 6e 20 6f 62 74 61 69 6e   not when obtain
2be70 69 6e 67 20 74 68 65 20 52 45 53 45 52 56 45 44  ing the RESERVED
2be80 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2f 0a   lock..      */.
2be90 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2bea0 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
2beb0 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  >fd, RESERVED_LO
2bec0 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
2bed0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2bee0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
2bef0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45  state = PAGER_RE
2bf00 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20  SERVED;.        
2bf10 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20  if( exFlag ){.  
2bf20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
2bf30 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
2bf40 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
2bf50 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
2bf60 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2bf70 0a 0a 20 20 20 20 2f 2a 20 4e 6f 20 6e 65 65 64  ..    /* No need
2bf80 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f 75   to open the jou
2bf90 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 69  rnal file at thi
2bfa0 73 20 74 69 6d 65 2e 20 20 49 74 20 77 69 6c 6c  s time.  It will
2bfb0 20 62 65 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 65   be.    ** opene
2bfc0 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 77  d before it is w
2bfd0 72 69 74 74 65 6e 20 74 6f 2e 20 20 49 66 20 77  ritten to.  If w
2bfe0 65 20 64 65 66 65 72 20 6f 70 65 6e 69 6e 67 20  e defer opening 
2bff0 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 0a 20 20 20  the journal,.   
2c000 20 2a 2a 20 77 65 20 6d 69 67 68 74 20 73 61 76   ** we might sav
2c010 65 20 74 68 65 20 77 6f 72 6b 20 6f 66 20 63 72  e the work of cr
2c020 65 61 74 69 6e 67 20 61 20 66 69 6c 65 20 69 66  eating a file if
2c030 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2c040 0a 20 20 20 20 2a 2a 20 65 6e 64 73 20 75 70 20  .    ** ends up 
2c050 62 65 69 6e 67 20 61 20 6e 6f 2d 6f 70 2e 0a 20  being a no-op.. 
2c060 20 20 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66     */.  }else if
2c070 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
2c080 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d  >jfd) && pPager-
2c090 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29  >journalOff==0 )
2c0a0 7b 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61  {.    /* This ha
2c0b0 70 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70  ppens when the p
2c0c0 61 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c  ager was in excl
2c0d0 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64  usive-access mod
2c0e0 65 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a  e the last.    *
2c0f0 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f  * time a (read o
2c100 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63  r write) transac
2c110 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73  tion was success
2c120 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a  fully concluded.
2c130 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63      ** by this c
2c140 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65  onnection. Inste
2c150 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74  ad of deleting t
2c160 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2c170 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b  it was .    ** k
2c180 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74  ept open and eit
2c190 68 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65  her was truncate
2c1a0 64 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20  d to 0 bytes or 
2c1b0 69 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20  its header was. 
2c1c0 20 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65     ** overwritte
2c1d0 6e 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20  n with zeros..  
2c1e0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
2c1f0 20 70 61 67 65 72 55 73 65 57 61 6c 28 70 50 61   pagerUseWal(pPa
2c200 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  ger)==0 );.    a
2c210 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
2c220 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
2c230 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
2c240 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  OrigSize==0 );. 
2c250 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2c260 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
2c270 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
2c280 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
2c290 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
2c2a0 50 41 47 45 52 54 52 41 43 45 28 28 22 54 52 41  PAGERTRACE(("TRA
2c2b0 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20  NSACTION %d\n", 
2c2c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2c2d0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
2c2e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 73  ITE_OK ){.    as
2c2f0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 64  sert( !pPager->d
2c300 62 4d 6f 64 69 66 69 65 64 20 29 3b 0a 20 20 20  bModified );.   
2c310 20 2f 2a 20 49 67 6e 6f 72 65 20 61 6e 79 20 49   /* Ignore any I
2c320 4f 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63  O error that occ
2c330 75 72 73 20 77 69 74 68 69 6e 20 70 61 67 65 72  urs within pager
2c340 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
2c350 28 29 2e 20 54 68 65 0a 20 20 20 20 2a 2a 20 70  (). The.    ** p
2c360 75 72 70 6f 73 65 20 6f 66 20 74 68 69 73 20 63  urpose of this c
2c370 61 6c 6c 20 69 73 20 74 6f 20 72 65 73 65 74 20  all is to reset 
2c380 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
2c390 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 0a  te of the pager.
2c3a0 20 20 20 20 2a 2a 20 73 75 62 2d 73 79 73 74 65      ** sub-syste
2c3b0 6d 2e 20 49 74 20 64 6f 65 73 6e 27 74 20 6d 61  m. It doesn't ma
2c3c0 74 74 65 72 20 69 66 20 74 68 65 20 6a 6f 75 72  tter if the jour
2c3d0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
2c3e0 70 72 6f 70 65 72 6c 79 0a 20 20 20 20 2a 2a 20  properly.    ** 
2c3f0 66 69 6e 61 6c 69 7a 65 64 20 61 74 20 74 68 69  finalized at thi
2c400 73 20 70 6f 69 6e 74 20 28 73 69 6e 63 65 20 69  s point (since i
2c410 74 20 69 73 20 6e 6f 74 20 61 20 76 61 6c 69 64  t is not a valid
2c420 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
2c430 79 77 61 79 29 2e 0a 20 20 20 20 2a 2f 0a 20 20  yway)..    */.  
2c440 20 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e    pager_end_tran
2c450 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
2c460 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
2c470 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
2c480 72 6b 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61  rk a single data
2c490 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
2c4a0 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
2c4b0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
2c4c0 20 0a 2a 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   .** main journa
2c4d0 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
2c4e0 20 61 73 20 72 65 71 75 69 72 65 64 2e 20 49 66   as required. If
2c4f0 20 74 68 65 20 70 61 67 65 20 69 73 20 77 72 69   the page is wri
2c500 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 6f 6e 65  tten into.** one
2c510 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73   of the journals
2c520 2c 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  , the correspond
2c530 69 6e 67 20 62 69 74 20 69 73 20 73 65 74 20 69  ing bit is set i
2c540 6e 20 74 68 65 20 0a 2a 2a 20 50 61 67 65 72 2e  n the .** Pager.
2c550 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
2c560 63 20 61 6e 64 20 74 68 65 20 50 61 67 65 72 53  c and the PagerS
2c570 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65  avepoint.pInSave
2c580 70 6f 69 6e 74 20 62 69 74 76 65 63 73 0a 2a 2a  point bitvecs.**
2c590 20 6f 66 20 61 6e 79 20 6f 70 65 6e 20 73 61 76   of any open sav
2c5a0 65 70 6f 69 6e 74 73 20 61 73 20 61 70 70 72 6f  epoints as appro
2c5b0 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
2c5c0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
2c5d0 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  e(PgHdr *pPg){. 
2c5e0 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 70   void *pData = p
2c5f0 50 67 2d 3e 70 44 61 74 61 3b 0a 20 20 50 61 67  Pg->pData;.  Pag
2c600 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
2c610 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
2c620 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
2c630 0a 20 20 2f 2a 20 54 68 69 73 20 72 6f 75 74 69  .  /* This routi
2c640 6e 65 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  ne is not called
2c650 20 75 6e 6c 65 73 73 20 61 20 74 72 61 6e 73 61   unless a transa
2c660 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64  ction has alread
2c670 79 20 62 65 65 6e 0a 20 20 2a 2a 20 73 74 61 72  y been.  ** star
2c680 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ted..  */.  asse
2c690 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
2c6a0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
2c6b0 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e  D );..  /* If an
2c6c0 20 65 72 72 6f 72 20 68 61 73 20 62 65 65 6e 20   error has been 
2c6d0 70 72 65 76 69 6f 75 73 6c 79 20 64 65 74 65 63  previously detec
2c6e0 74 65 64 2c 20 72 65 70 6f 72 74 20 74 68 65 20  ted, report the 
2c6f0 73 61 6d 65 20 65 72 72 6f 72 0a 20 20 2a 2a 20  same error.  ** 
2c700 61 67 61 69 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66  again..  */.  if
2c710 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d 3e  ( NEVER(pPager->
2c720 65 72 72 43 6f 64 65 29 20 29 20 20 72 65 74 75  errCode) )  retu
2c730 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
2c740 64 65 3b 0a 0a 20 20 2f 2a 20 48 69 67 68 65 72  de;..  /* Higher
2c750 2d 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20  -level routines 
2c760 6e 65 76 65 72 20 63 61 6c 6c 20 74 68 69 73 20  never call this 
2c770 66 75 6e 63 74 69 6f 6e 20 69 66 20 64 61 74 61  function if data
2c780 62 61 73 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a  base is not.  **
2c790 20 77 72 69 74 61 62 6c 65 2e 20 20 42 75 74 20   writable.  But 
2c7a0 63 68 65 63 6b 20 61 6e 79 77 61 79 2c 20 6a 75  check anyway, ju
2c7b0 73 74 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  st for robustnes
2c7c0 73 2e 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45  s. */.  if( NEVE
2c7d0 52 28 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  R(pPager->readOn
2c7e0 6c 79 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ly) ) return SQL
2c7f0 49 54 45 5f 50 45 52 4d 3b 0a 0a 20 20 61 73 73  ITE_PERM;..  ass
2c800 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
2c810 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
2c820 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
2c830 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61    /* Mark the pa
2c840 67 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66  ge as dirty.  If
2c850 20 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c   the page has al
2c860 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
2c870 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a  en.  ** to the j
2c880 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63  ournal then we c
2c890 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20  an return right 
2c8a0 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c  away..  */.  sql
2c8b0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
2c8c0 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66 28 20  rty(pPg);.  if( 
2c8d0 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50  pageInJournal(pP
2c8e0 67 29 20 26 26 20 21 73 75 62 6a 52 65 71 75 69  g) && !subjRequi
2c8f0 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b 0a  resPage(pPg) ){.
2c900 20 20 20 20 61 73 73 65 72 74 28 20 21 70 61 67      assert( !pag
2c910 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72 29  erUseWal(pPager)
2c920 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
2c930 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
2c940 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a    }else{..    /*
2c950 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73 20   If we get this 
2c960 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  far, it means th
2c970 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65 64  at the page need
2c980 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77  s to be.    ** w
2c990 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72  ritten to the tr
2c9a0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
2c9b0 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f  l or the ckeckpo
2c9c0 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  int journal.    
2c9d0 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20  ** or both..    
2c9e0 2a 2a 0a 20 20 20 20 2a 2a 20 48 69 67 68 65 72  **.    ** Higher
2c9f0 20 6c 65 76 65 6c 20 72 6f 75 74 69 6e 65 73 20   level routines 
2ca00 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65  should have alre
2ca10 61 64 79 20 73 74 61 72 74 65 64 20 61 20 74 72  ady started a tr
2ca20 61 6e 73 61 63 74 69 6f 6e 2c 0a 20 20 20 20 2a  ansaction,.    *
2ca30 2a 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  * which means th
2ca40 65 79 20 68 61 76 65 20 61 63 71 75 69 72 65 64  ey have acquired
2ca50 20 74 68 65 20 6e 65 63 65 73 73 61 72 79 20 6c   the necessary l
2ca60 6f 63 6b 73 20 62 75 74 20 74 68 65 20 72 6f 6c  ocks but the rol
2ca70 6c 62 61 63 6b 0a 20 20 20 20 2a 2a 20 6a 6f 75  lback.    ** jou
2ca80 72 6e 61 6c 20 6d 69 67 68 74 20 6e 6f 74 20 79  rnal might not y
2ca90 65 74 20 62 65 20 6f 70 65 6e 2e 0a 20 20 20 20  et be open..    
2caa0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
2cab0 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 70 50  te3PagerBegin(pP
2cac0 61 67 65 72 2c 20 30 2c 20 70 50 61 67 65 72 2d  ager, 0, pPager-
2cad0 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 29 3b 0a  >subjInMemory);.
2cae0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2caf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2cb00 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
2cb10 20 20 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28      if( !isOpen(
2cb20 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20  pPager->jfd) .  
2cb30 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2cb40 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
2cb50 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2cb60 20 0a 20 20 20 20 20 26 26 20 21 70 61 67 65 72   .     && !pager
2cb70 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 0a 20  UseWal(pPager). 
2cb80 20 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65     ){.      asse
2cb90 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
2cba0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20  ournal );.      
2cbb0 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
2cbc0 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
2cbd0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
2cbe0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
2cbf0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
2cc00 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2cc10 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  ed = 1;.  .    /
2cc20 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
2cc30 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
2cc40 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
2cc50 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
2cc60 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
2cc70 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
2cc80 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
2cc90 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
2cca0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
2ccb0 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
2ccc0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
2ccd0 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
2cce0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
2ccf0 20 20 20 20 69 66 28 20 21 70 61 67 65 49 6e 4a      if( !pageInJ
2cd00 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20 69  ournal(pPg) && i
2cd10 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
2cd20 64 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  d) ){.      asse
2cd30 72 74 28 20 21 70 61 67 65 72 55 73 65 57 61 6c  rt( !pagerUseWal
2cd40 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20  (pPager) );.    
2cd50 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c    if( pPg->pgno<
2cd60 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53  =pPager->dbOrigS
2cd70 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ize ){.        u
2cd80 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20  32 cksum;.      
2cd90 20 20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a    char *pData2;.
2cda0 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73  .        /* We s
2cdb0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
2cdc0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
2cdd0 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
2cde0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 63  hat.        ** c
2cdf0 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61  ontains the data
2ce00 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65  base locks.  The
2ce10 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72   following asser
2ce20 74 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20  t verifies.     
2ce30 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f     ** that we do
2ce40 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20   not. */.       
2ce50 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
2ce60 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
2ce70 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 0a 20 20  O(pPager) );..  
2ce80 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2ce90 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
2cea0 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   <= pPager->jour
2ceb0 6e 61 6c 4f 66 66 20 29 3b 0a 20 20 20 20 20 20  nalOff );.      
2cec0 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c    CODEC2(pPager,
2ced0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
2cee0 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51 4c  o, 7, return SQL
2cef0 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74 61  ITE_NOMEM, pData
2cf00 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73 75  2);.        cksu
2cf10 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
2cf20 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
2cf30 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72 63  ta2);.        rc
2cf40 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
2cf50 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
2cf60 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20  er->journalOff, 
2cf70 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
2cf80 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2cf90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
2cfa0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2cfb0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
2cfc0 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67  fd, pData2, pPag
2cfd0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20  er->pageSize,.  
2cfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cff0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
2d000 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
2d010 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70   4);.          p
2d020 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2d030 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
2d040 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20  eSize+4;.       
2d050 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
2d060 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2d070 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
2d080 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
2d090 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
2d0a0 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75  journalOff, cksu
2d0b0 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  m);.          pP
2d0c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2d0d0 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20 7d   += 4;.        }
2d0e0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
2d0f0 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c  (("JOUT %p %d %l
2d100 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  ld %d\n", pPager
2d110 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20  , pPg->pgno, .  
2d120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2d130 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
2d140 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
2d150 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20 50  ize));.        P
2d160 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
2d170 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
2d180 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 50  ount);.        P
2d190 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55 52  AGERTRACE(("JOUR
2d1a0 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e  NAL %d page %d n
2d1b0 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28  eedSync=%d hash(
2d1c0 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
2d1d0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
2d1e0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
2d1f0 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
2d200 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47   ((pPg->flags&PG
2d210 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31  HDR_NEED_SYNC)?1
2d220 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65 68  :0), pager_pageh
2d230 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20 20  ash(pPg)));..   
2d240 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66 20       /* Even if 
2d250 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75 6c  an IO or diskful
2d260 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  l error occurred
2d270 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c 69   while journalli
2d280 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  ng the.        *
2d290 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62 6c  * page in the bl
2d2a0 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20 74  ock above, set t
2d2b0 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c 61  he need-sync fla
2d2c0 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  g for the page..
2d2d0 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72          ** Other
2d2e0 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20 74  wise, when the t
2d2f0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72 6f  ransaction is ro
2d300 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20 6c  lled back, the l
2d310 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20 20  ogic in.        
2d320 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  ** playback_one_
2d330 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69 6e  page() will thin
2d340 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  k that the page 
2d350 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73 74  needs to be rest
2d360 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ored.        ** 
2d370 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
2d380 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e 20  file. And if an 
2d390 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  IO error occurs 
2d3a0 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c 0a  while doing so,.
2d3b0 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20          ** then 
2d3c0 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20 66  corruption may f
2d3d0 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20 2a  ollow..        *
2d3e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70  /.        if( !p
2d3f0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
2d400 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e  .          pPg->
2d410 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e  flags |= PGHDR_N
2d420 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20 20  EED_SYNC;.      
2d430 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
2d440 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
2d450 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20    }..        /* 
2d460 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63 63  An error has occ
2d470 75 72 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  urred writing to
2d480 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d490 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
2d4a0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
2d4b0 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
2d4c0 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
2d4d0 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
2d4e0 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
2d4f0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2d500 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2d510 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
2d520 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
2d530 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
2d540 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
2d550 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
2d560 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2d570 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
2d580 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2d590 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
2d5a0 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
2d5b0 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
2d5c0 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2d5d0 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
2d5e0 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
2d5f0 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
2d600 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
2d610 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
2d620 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
2d630 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
2d640 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2d650 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2d660 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
2d670 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
2d680 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
2d690 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
2d6a0 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
2d6b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
2d6c0 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
2d6d0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
2d6e0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
2d6f0 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
2d700 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
2d710 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
2d720 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
2d730 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
2d740 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
2d750 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
2d760 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2d770 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
2d780 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
2d790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2d7a0 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
2d7b0 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
2d7c0 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
2d7d0 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
2d7e0 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
2d7f0 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
2d800 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
2d810 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
2d820 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
2d830 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
2d840 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
2d850 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
2d860 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
2d870 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
2d880 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
2d890 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
2d8a0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
2d8b0 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
2d8c0 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
2d8d0 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
2d8e0 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
2d8f0 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
2d900 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
2d910 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
2d920 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
2d930 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
2d940 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
2d950 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
2d960 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
2d970 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
2d980 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
2d990 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
2d9a0 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
2d9b0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
2d9c0 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
2d9d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2d9e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  ;.}../*.** Mark 
2d9f0 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
2da00 72 69 74 65 61 62 6c 65 2e 20 54 68 69 73 20 72  riteable. This r
2da10 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
2da20 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 0a 2a 2a  alled before .**
2da30 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 20   making changes 
2da40 74 6f 20 61 20 70 61 67 65 2e 20 54 68 65 20 63  to a page. The c
2da50 61 6c 6c 65 72 20 6d 75 73 74 20 63 68 65 63 6b  aller must check
2da60 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   the return valu
2da70 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73 20 66 75  e .** of this fu
2da80 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65 20 63 61  nction and be ca
2da90 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20 63 68 61  reful not to cha
2daa0 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
2dab0 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20 74 68 69  a unless .** thi
2dac0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
2dad0 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
2dae0 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
2daf0 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
2db00 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
2db10 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
2db20 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
2db30 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
2db40 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
2db50 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
2db60 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
2db70 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
2db80 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
2db90 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
2dba0 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
2dbb0 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
2dbc0 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2dbd0 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
2dbe0 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
2dbf0 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  ** If an error o
2dc00 63 63 75 72 73 2c 20 53 51 4c 49 54 45 5f 4e 4f  ccurs, SQLITE_NO
2dc10 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20 65 72 72  MEM or an IO err
2dc20 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
2dc30 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70 72 6f 70  ned.** as approp
2dc40 72 69 61 74 65 2e 20 4f 74 68 65 72 77 69 73 65  riate. Otherwise
2dc50 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a  , SQLITE_OK..*/.
2dc60 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2dc70 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
2dc80 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
2dc90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
2dca0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
2dcb0 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
2dcc0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
2dcd0 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
2dce0 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
2dcf0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
2dd00 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
2dd10 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e 50 61 67  ze);..  if( nPag
2dd20 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
2dd30 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
2dd40 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
2dd50 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
2dd60 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
2dd70 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
2dd80 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
2dd90 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2dda0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
2ddb0 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
2ddc0 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
2ddd0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
2dde0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2ddf0 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
2de00 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
2de10 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
2de20 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
2de30 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
2de40 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 69  counter */.    i
2de50 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
2de60 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2de70 20 69 66 20 61 6e 79 20 70 61 67 65 20 68 61 73   if any page has
2de80 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43   PGHDR_NEED_SYNC
2de90 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20   */..    /* Set 
2dea0 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c  the doNotSync fl
2deb0 61 67 20 74 6f 20 31 2e 20 54 68 69 73 20 69 73  ag to 1. This is
2dec0 20 62 65 63 61 75 73 65 20 77 65 20 63 61 6e 6e   because we cann
2ded0 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e  ot allow a journ
2dee0 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61 64 65 72  al.    ** header
2def0 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62   to be written b
2df00 65 74 77 65 65 6e 20 74 68 65 20 70 61 67 65 73  etween the pages
2df10 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79 20 74 68   journaled by th
2df20 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  is function..   
2df30 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
2df40 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61 73  !MEMDB );.    as
2df50 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
2df60 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20  NotSync==0 );.  
2df70 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
2df80 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20 2f 2a  ync = 1;..    /*
2df90 20 54 68 69 73 20 74 72 69 63 6b 20 61 73 73 75   This trick assu
2dfa0 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20 74 68  mes that both th
2dfb0 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e 64 20  e page-size and 
2dfc0 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72 65 0a  sector-size are.
2dfd0 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
2dfe0 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20 49 74  r power of 2. It
2dff0 20 73 65 74 73 20 76 61 72 69 61 62 6c 65 20 70   sets variable p
2e000 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e 74 69  g1 to the identi
2e010 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74  fier.    ** of t
2e020 68 65 20 66 69 72 73 74 20 70 61 67 65 20 6f 66  he first page of
2e030 20 74 68 65 20 73 65 63 74 6f 72 20 70 50 67 20   the sector pPg 
2e040 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 0a 20  is located on.. 
2e050 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20 3d 20     */.    pg1 = 
2e060 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 20 26  ((pPg->pgno-1) &
2e070 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63 74 6f   ~(nPagePerSecto
2e080 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20 20 20  r-1)) + 1;..    
2e090 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
2e0a0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
2e0b0 72 2c 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65  r, (int *)&nPage
2e0c0 43 6f 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20  Count);.    if( 
2e0d0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
2e0e0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
2e0f0 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a  o>nPageCount ){.
2e100 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70        nPage = (p
2e110 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b  Pg->pgno - pg1)+
2e120 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
2e130 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65   (pg1+nPagePerSe
2e140 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75  ctor-1)>nPageCou
2e150 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
2e160 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31  e = nPageCount+1
2e170 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  -pg1;.    }else{
2e180 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e  .      nPage = n
2e190 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20  PagePerSector;. 
2e1a0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2e1b0 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73  nPage>0);.    as
2e1c0 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70  sert(pg1<=pPg->p
2e1d0 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
2e1e0 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67  ((pg1+nPage)>pPg
2e1f0 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f  ->pgno);..    fo
2e200 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65  r(ii=0; ii<nPage
2e210 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
2e220 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  K; ii++){.      
2e230 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69  Pgno pg = pg1+ii
2e240 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  ;.      PgHdr *p
2e250 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20  Page;.      if( 
2e260 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c  pg==pPg->pgno ||
2e270 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63 54   !sqlite3BitvecT
2e280 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  est(pPager->pInJ
2e290 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20  ournal, pg) ){. 
2e2a0 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d 50         if( pg!=P
2e2b0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
2e2c0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
2e2d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
2e2e0 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 70  gerGet(pPager, p
2e2f0 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20  g, &pPage);.    
2e300 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2e310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e320 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
2e330 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a  r_write(pPage);.
2e340 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2e350 70 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48  pPage->flags&PGH
2e360 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a  DR_NEED_SYNC ){.
2e370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 65                ne
2e380 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
2e390 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2e3a0 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
2e3b0 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  c);.            
2e3c0 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  }.            sq
2e3d0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2e3e0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
2e3f0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2e400 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70      }else if( (p
2e410 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
2e420 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 29 29  kup(pPager, pg))
2e430 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
2e440 66 28 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 26  f( pPage->flags&
2e450 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
2e460 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65  ){.          nee
2e470 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
2e480 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
2e490 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
2e4a0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Page);.      }. 
2e4b0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
2e4c0 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
2e4d0 59 4e 43 20 66 6c 61 67 20 69 73 20 73 65 74 20  YNC flag is set 
2e4e0 66 6f 72 20 61 6e 79 20 6f 66 20 74 68 65 20 6e  for any of the n
2e4f0 50 61 67 65 20 70 61 67 65 73 20 0a 20 20 20 20  Page pages .    
2e500 2a 2a 20 73 74 61 72 74 69 6e 67 20 61 74 20 70  ** starting at p
2e510 67 31 2c 20 74 68 65 6e 20 69 74 20 6e 65 65 64  g1, then it need
2e520 73 20 74 6f 20 62 65 20 73 65 74 20 66 6f 72 20  s to be set for 
2e530 61 6c 6c 20 6f 66 20 74 68 65 6d 2e 20 42 65 63  all of them. Bec
2e540 61 75 73 65 0a 20 20 20 20 2a 2a 20 77 72 69 74  ause.    ** writ
2e550 69 6e 67 20 74 6f 20 61 6e 79 20 6f 66 20 74 68  ing to any of th
2e560 65 73 65 20 6e 50 61 67 65 20 70 61 67 65 73 20  ese nPage pages 
2e570 6d 61 79 20 64 61 6d 61 67 65 20 74 68 65 20 6f  may damage the o
2e580 74 68 65 72 73 2c 20 74 68 65 0a 20 20 20 20 2a  thers, the.    *
2e590 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  * journal file m
2e5a0 75 73 74 20 63 6f 6e 74 61 69 6e 20 73 79 6e 63  ust contain sync
2e5b0 28 29 65 64 20 63 6f 70 69 65 73 20 6f 66 20 61  ()ed copies of a
2e5c0 6c 6c 20 6f 66 20 74 68 65 6d 0a 20 20 20 20 2a  ll of them.    *
2e5d0 2a 20 62 65 66 6f 72 65 20 61 6e 79 20 6f 66 20  * before any of 
2e5e0 74 68 65 6d 20 63 61 6e 20 62 65 20 77 72 69 74  them can be writ
2e5f0 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
2e600 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
2e610 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
2e620 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 65  =SQLITE_OK && ne
2e630 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
2e640 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 26  assert( !MEMDB &
2e650 26 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  & pPager->noSync
2e660 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 66 6f 72  ==0 );.      for
2e670 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 3b  (ii=0; ii<nPage;
2e680 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20   ii++){.        
2e690 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20 70  PgHdr *pPage = p
2e6a0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
2e6b0 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20 20  er, pg1+ii);.   
2e6c0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20 29       if( pPage )
2e6d0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  {.          pPag
2e6e0 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  e->flags |= PGHD
2e6f0 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
2e700 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2e710 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
2e720 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2e730 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
2e740 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
2e750 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61 73  );.    }..    as
2e760 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 6f  sert( pPager->do
2e770 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20 20  NotSync==1 );.  
2e780 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53    pPager->doNotS
2e790 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ync = 0;.  }else
2e7a0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
2e7b0 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29 3b  _write(pDbPage);
2e7c0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
2e7d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2e7e0 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70 61  n TRUE if the pa
2e7f0 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ge given in the 
2e800 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72 65  argument was pre
2e810 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a 2a  viously passed.*
2e820 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
2e830 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74  rWrite().  In ot
2e840 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72  her words, retur
2e850 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73 20  n TRUE if it is 
2e860 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20  ok.** to change 
2e870 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
2e880 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 6e  he page..*/.#ifn
2e890 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20 73  def NDEBUG.int s
2e8a0 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72 69  qlite3PagerIswri
2e8b0 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a 70  teable(DbPage *p
2e8c0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
2e8d0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2e8e0 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  IRTY;.}.#endif..
2e8f0 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20  /*.** A call to 
2e900 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c  this routine tel
2e910 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61  ls the pager tha
2e920 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  t it is not nece
2e930 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74  ssary to.** writ
2e940 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f  e the informatio
2e950 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61  n on page pPg ba
2e960 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20  ck to the disk, 
2e970 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74  even though.** t
2e980 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62  hat page might b
2e990 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74  e marked as dirt
2e9a0 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  y.  This happens
2e9b0 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
2e9c0 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65 20  hen.** the page 
2e9d0 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20 61  has been added a
2e9e0 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65 20  s a leaf of the 
2e9f0 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f 20  freelist and so 
2ea00 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20 6e  its.** content n
2ea10 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72 73  o longer matters
2ea20 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
2ea30 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
2ea40 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
2ea50 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
2ea60 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
2ea70 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
2ea80 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68 65  e is unused. The
2ea90 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65   pager marks the
2eaa0 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73   page as clean s
2eab0 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65  o.** that it doe
2eac0 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65  s not get writte
2ead0 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a  n to disk..**.**
2eae0 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61 74   Tests show that
2eaf0 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69   this optimizati
2eb00 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c 65  on can quadruple
2eb10 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
2eb20 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20 6f  rge .** DELETE o
2eb30 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76 6f  perations..*/.vo
2eb40 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  id sqlite3PagerD
2eb50 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20 2a  ontWrite(PgHdr *
2eb60 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
2eb70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
2eb80 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67 2d  ger;.  if( (pPg-
2eb90 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
2eba0 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  TY) && pPager->n
2ebb0 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b 0a  Savepoint==0 ){.
2ebc0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
2ebd0 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65  "DONT_WRITE page
2ebe0 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
2ebf0 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
2ec00 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20  (pPager)));.    
2ec10 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20  IOTRACE(("CLEAN 
2ec20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
2ec30 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20  , pPg->pgno)).  
2ec40 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d 20    pPg->flags |= 
2ec50 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45  PGHDR_DONT_WRITE
2ec60 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
2ec70 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
2ec80 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
2ec90 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
2eca0 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a  Pg);.#endif.  }.
2ecb0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
2ecc0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
2ecd0 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
2ece0 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64 61   value of the da
2ecf0 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a 20  tabase file .** 
2ed00 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 20  change-counter, 
2ed10 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62 79  stored as a 4-by
2ed20 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
2ed30 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20 61  teger starting a
2ed40 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73 65  t .** byte offse
2ed50 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  t 24 of the page
2ed60 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  r file..**.** If
2ed70 20 74 68 65 20 69 73 44 69 72 65 63 74 4d 6f 64   the isDirectMod
2ed80 65 20 66 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20  e flag is zero, 
2ed90 74 68 65 6e 20 74 68 69 73 20 69 73 20 64 6f 6e  then this is don
2eda0 65 20 62 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a  e by calling .**
2edb0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2edc0 74 65 28 29 20 6f 6e 20 70 61 67 65 20 31 2c 20  te() on page 1, 
2edd0 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74  then modifying t
2ede0 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
2edf0 68 65 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e  he.** page data.
2ee00 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
2ee10 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 75  e file will be u
2ee20 70 64 61 74 65 64 20 77 68 65 6e 20 74 68 65 20  pdated when the 
2ee30 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  current.** trans
2ee40 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74  action is commit
2ee50 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69  ted..**.** The i
2ee60 73 44 69 72 65 63 74 4d 6f 64 65 20 66 6c 61 67  sDirectMode flag
2ee70 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e   may only be non
2ee80 2d 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62  -zero if the lib
2ee90 72 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65  rary was compile
2eea0 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51  d.** with the SQ
2eeb0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
2eec0 49 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64  IC_WRITE macro d
2eed0 65 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20  efined. In this 
2eee0 63 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69  case,.** if isDi
2eef0 72 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  rect is non-zero
2ef00 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62  , then the datab
2ef10 61 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61  ase file is upda
2ef20 74 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20  ted directly.** 
2ef30 62 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70  by writing an up
2ef40 64 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  dated version of
2ef50 20 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20   page 1 using a 
2ef60 63 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20  call to the .** 
2ef70 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
2ef80 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74   function..*/.st
2ef90 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
2efa0 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2efb0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
2efc0 20 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64   int isDirectMod
2efd0 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
2efe0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
2eff0 44 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74  Declare and init
2f000 69 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20  ialize constant 
2f010 69 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63  integer 'isDirec
2f020 74 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  t'. If the.  ** 
2f030 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
2f040 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61  imization is ena
2f050 62 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69  bled in this bui
2f060 6c 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63  ld, then isDirec
2f070 74 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61  t.  ** is initia
2f080 6c 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c  lized to the val
2f090 75 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  ue passed as the
2f0a0 20 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61   isDirectMode pa
2f0b0 72 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20  rameter.  ** to 
2f0c0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f  this function. O
2f0d0 74 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20  therwise, it is 
2f0e0 61 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65  always set to ze
2f0f0 72 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68  ro..  **.  ** Th
2f100 65 20 69 64 65 61 20 69 73 20 74 68 61 74 20 69  e idea is that i
2f110 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  f the atomic-wri
2f120 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  te optimization 
2f130 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62  is not.  ** enab
2f140 6c 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74  led at compile t
2f150 69 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65  ime, the compile
2f160 72 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74  r can omit the t
2f170 65 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73  ests of.  ** 'is
2f180 44 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61  Direct' below, a
2f190 73 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c  s well as the bl
2f1a0 6f 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20  ock enclosed in 
2f1b0 74 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73  the.  ** "if( is
2f1c0 44 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74  Direct )" condit
2f1d0 69 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  ion..  */.#ifnde
2f1e0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2f1f0 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 23 20 64  ATOMIC_WRITE.# d
2f200 65 66 69 6e 65 20 44 49 52 45 43 54 5f 4d 4f 44  efine DIRECT_MOD
2f210 45 20 30 0a 20 20 61 73 73 65 72 74 28 20 69 73  E 0.  assert( is
2f220 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20 29 3b  DirectMode==0 );
2f230 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
2f240 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f 64 65  TER(isDirectMode
2f250 29 3b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  );.#else.# defin
2f260 65 20 44 49 52 45 43 54 5f 4d 4f 44 45 20 69 73  e DIRECT_MODE is
2f270 44 69 72 65 63 74 4d 6f 64 65 0a 23 65 6e 64 69  DirectMode.#endi
2f280 66 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f..  assert( pPa
2f290 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
2f2a0 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
2f2b0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61  if( !pPager->cha
2f2c0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20  ngeCountDone && 
2f2d0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30  pPager->dbSize>0
2f2e0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
2f2f0 50 67 48 64 72 3b 20 20 20 20 20 20 20 20 20 20  PgHdr;          
2f300 20 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e        /* Referen
2f310 63 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a  ce to page 1 */.
2f320 20 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63      u32 change_c
2f330 6f 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20  ounter;         
2f340 20 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c    /* Initial val
2f350 75 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75  ue of change-cou
2f360 6e 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20  nter field */.. 
2f370 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
2f380 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20  er->tempFile && 
2f390 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
2f3a0 64 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70  d) );..    /* Op
2f3b0 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
2f3c0 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
2f3d0 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
2f3e0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
2f3f0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
2f400 72 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  r);.    assert( 
2f410 70 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d  pPgHdr==0 || rc=
2f420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20  =SQLITE_OK );.. 
2f430 20 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e     /* If page on
2f440 65 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75  e was fetched su
2f450 63 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20  ccessfully, and 
2f460 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
2f470 20 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72   not.    ** oper
2f480 61 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d  ating in direct-
2f490 6d 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20  mode, make page 
2f4a0 31 20 77 72 69 74 61 62 6c 65 2e 20 20 57 68 65  1 writable.  Whe
2f4b0 6e 20 6e 6f 74 20 69 6e 20 0a 20 20 20 20 2a 2a  n not in .    **
2f4c0 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20 70 61   direct mode, pa
2f4d0 67 65 20 31 20 69 73 20 61 6c 77 61 79 73 20 68  ge 1 is always h
2f4e0 65 6c 64 20 69 6e 20 63 61 63 68 65 20 61 6e 64  eld in cache and
2f4f0 20 68 65 6e 63 65 20 74 68 65 20 50 61 67 65 72   hence the Pager
2f500 47 65 74 28 29 0a 20 20 20 20 2a 2a 20 61 62 6f  Get().    ** abo
2f510 76 65 20 69 73 20 61 6c 77 61 79 73 20 73 75 63  ve is always suc
2f520 63 65 73 73 66 75 6c 20 2d 20 68 65 6e 63 65 20  cessful - hence 
2f530 74 68 65 20 41 4c 57 41 59 53 20 6f 6e 20 72 63  the ALWAYS on rc
2f540 3d 3d 53 51 4c 49 54 45 5f 4f 4b 2e 0a 20 20 20  ==SQLITE_OK..   
2f550 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 44 49 52   */.    if( !DIR
2f560 45 43 54 5f 4d 4f 44 45 20 26 26 20 41 4c 57 41  ECT_MODE && ALWA
2f570 59 53 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  YS(rc==SQLITE_OK
2f580 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
2f590 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
2f5a0 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 7d  e(pPgHdr);.    }
2f5b0 0a 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ..    if( rc==SQ
2f5c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f5d0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
2f5e0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
2f5f0 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
2f600 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
2f610 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e 67 65 5f  */.      change_
2f620 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c 69 74 65  counter = sqlite
2f630 33 47 65 74 34 62 79 74 65 28 28 75 38 2a 29 70  3Get4byte((u8*)p
2f640 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
2f650 73 29 3b 0a 20 20 20 20 20 20 63 68 61 6e 67 65  s);.      change
2f660 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20  _counter++;.    
2f670 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
2f680 61 72 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74  ar*)pPgHdr->pDat
2f690 61 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63 6f  a)+24, change_co
2f6a0 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 20 20 2f  unter);..      /
2f6b0 2a 20 41 6c 73 6f 20 73 74 6f 72 65 20 74 68 65  * Also store the
2f6c0 20 53 51 4c 69 74 65 20 76 65 72 73 69 6f 6e 20   SQLite version 
2f6d0 6e 75 6d 62 65 72 20 69 6e 20 62 79 74 65 73 20  number in bytes 
2f6e0 39 36 2e 2e 39 39 20 2a 2f 0a 20 20 20 20 20 20  96..99 */.      
2f6f0 70 75 74 33 32 62 69 74 73 28 28 28 63 68 61 72  put32bits(((char
2f700 2a 29 70 50 67 48 64 72 2d 3e 70 44 61 74 61 29  *)pPgHdr->pData)
2f710 2b 39 36 2c 20 53 51 4c 49 54 45 5f 56 45 52 53  +96, SQLITE_VERS
2f720 49 4f 4e 5f 4e 55 4d 42 45 52 29 3b 0a 0a 20 20  ION_NUMBER);..  
2f730 20 20 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e      /* If runnin
2f740 67 20 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65  g in direct mode
2f750 2c 20 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74  , write the cont
2f760 65 6e 74 73 20 6f 66 20 70 61 67 65 20 31 20 74  ents of page 1 t
2f770 6f 20 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  o the file. */. 
2f780 20 20 20 20 20 69 66 28 20 44 49 52 45 43 54 5f       if( DIRECT_
2f790 4d 4f 44 45 20 29 7b 0a 20 20 20 20 20 20 20 20  MODE ){.        
2f7a0 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75 66  const void *zBuf
2f7b0 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74 61   = pPgHdr->pData
2f7c0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2f7d0 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  ( pPager->dbFile
2f7e0 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20 20  Size>0 );.      
2f7f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2f800 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64  Write(pPager->fd
2f810 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e  , zBuf, pPager->
2f820 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20 20  pageSize, 0);.  
2f830 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2f840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2f850 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
2f860 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
2f870 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f880 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f890 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
2f8a0 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20  ountDone = 1;.  
2f8b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
2f8c0 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
2f8d0 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
2f8e0 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  */.    sqlite3Pa
2f8f0 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
2f900 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2f910 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63  c;.}../*.** Sync
2f920 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
2f930 74 6f 20 64 69 73 6b 2e 20 54 68 69 73 20 69 73  to disk. This is
2f940 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20 69 6e 2d   a no-op for in-
2f950 6d 65 6d 6f 72 79 20 66 69 6c 65 73 0a 2a 2a 20  memory files.** 
2f960 6f 72 20 70 61 67 65 73 20 77 69 74 68 20 74 68  or pages with th
2f970 65 20 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 66  e Pager.noSync f
2f980 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 49  lag set..**.** I
2f990 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 6f 72  f successful, or
2f9a0 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
2f9b0 65 72 20 66 6f 72 20 77 68 69 63 68 20 69 74 20  er for which it 
2f9c0 69 73 20 61 20 6e 6f 2d 6f 70 2c 20 74 68 69 73  is a no-op, this
2f9d0 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  .** function ret
2f9e0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  urns SQLITE_OK. 
2f9f0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 49 4f  Otherwise, an IO
2fa00 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
2fa10 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
2fa20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63  sqlite3PagerSync
2fa30 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2fa40 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
2fa50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa60 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2fa70 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 61 73 73 65  n code */.  asse
2fa80 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
2fa90 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
2faa0 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  nc ){.    rc = S
2fab0 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
2fac0 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e{.    rc = sqli
2fad0 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
2fae0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  ->fd, pPager->sy
2faf0 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20  nc_flags);.  }. 
2fb00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2fb10 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61  *.** Sync the da
2fb20 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20  tabase file for 
2fb30 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72  the pager pPager
2fb40 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73  . zMaster points
2fb50 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20   to the name.** 
2fb60 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  of a master jour
2fb70 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68  nal file that sh
2fb80 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20  ould be written 
2fb90 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64  into the individ
2fba0 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ual.** journal f
2fbb0 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79  ile. zMaster may
2fbc0 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20   be NULL, which 
2fbd0 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
2fbe0 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a  s no master.** j
2fbf0 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65  ournal (a single
2fc00 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
2fc10 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  ction)..**.** Th
2fc20 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72  is routine ensur
2fc30 65 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20  es that:.**.**  
2fc40 20 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20   * The database 
2fc50 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
2fc60 74 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a  ter is updated,.
2fc70 2a 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e  **   * the journ
2fc80 61 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e  al is synced (un
2fc90 6c 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d  less the atomic-
2fca0 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
2fcb0 6f 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20  on is used),.** 
2fcc0 20 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61    * all dirty pa
2fcd0 67 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  ges are written 
2fce0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2fcf0 66 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68  file, .**   * th
2fd00 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
2fd10 69 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66  is truncated (if
2fd20 20 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a   required), and.
2fd30 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
2fd40 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
2fd50 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79   .**.** The only
2fd60 20 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61   thing that rema
2fd70 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
2fd80 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
2fd90 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a   to finalize .**
2fda0 20 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61   (delete, trunca
2fdb0 74 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66  te or zero the f
2fdc0 69 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68  irst part of) th
2fdd0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
2fde0 6f 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68  or .** delete th
2fdf0 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
2fe00 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69   file if specifi
2fe10 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20  ed)..**.** Note 
2fe20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d  that if zMaster=
2fe30 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73  =NULL, this does
2fe40 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61   not overwrite a
2fe50 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a   previous value.
2fe60 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20  ** passed to an 
2fe70 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
2fe80 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c  itPhaseOne() cal
2fe90 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  l..**.** If the 
2fea0 66 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20  final parameter 
2feb0 2d 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72  - noSync - is tr
2fec0 75 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74  ue, then the dat
2fed0 61 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c  abase file itsel
2fee0 66 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63  f.** is not sync
2fef0 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
2ff00 75 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  ust call sqlite3
2ff10 50 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65  PagerSync() dire
2ff20 63 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20  ctly to.** sync 
2ff30 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2ff40 65 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67  e before calling
2ff50 20 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28   CommitPhaseTwo(
2ff60 29 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a  ) to delete the.
2ff70 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
2ff80 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f  in this case..*/
2ff90 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2ffa0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
2ffb0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2ffc0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ffd0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
2ffe0 63 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ct */.  const ch
2fff0 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20  ar *zMaster,    
30000 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f          /* If no
30010 74 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74  t NULL, the mast
30020 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
30030 2a 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20  */.  int noSync 
30040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30050 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
30060 6f 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f  omit the xSync o
30070 6e 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f  n the db file */
30080 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
30090 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20  QLITE_OK;       
300a0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
300b0 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68  code */..  /* Th
300c0 65 20 64 62 4f 72 69 67 53 69 7a 65 20 69 73 20  e dbOrigSize is 
300d0 6e 65 76 65 72 20 73 65 74 20 69 66 20 6a 6f 75  never set if jou
300e0 72 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 20 2a 2f  rnal_mode=OFF */
300f0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
30100 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
30110 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
30120 45 5f 4f 46 46 20 7c 7c 20 70 50 61 67 65 72 2d  E_OFF || pPager-
30130 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29  >dbOrigSize==0 )
30140 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 20 70 72 69  ;..  /* If a pri
30150 6f 72 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  or error occurre
30160 64 2c 20 72 65 70 6f 72 74 20 74 68 61 74 20 65  d, report that e
30170 72 72 6f 72 20 61 67 61 69 6e 2e 20 2a 2f 0a 20  rror again. */. 
30180 20 69 66 28 20 4e 45 56 45 52 28 70 50 61 67 65   if( NEVER(pPage
30190 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20 72 65  r->errCode) ) re
301a0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
301b0 43 6f 64 65 3b 0a 0a 20 20 50 41 47 45 52 54 52  Code;..  PAGERTR
301c0 41 43 45 28 28 22 44 41 54 41 42 41 53 45 20 53  ACE(("DATABASE S
301d0 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61  YNC: File=%s zMa
301e0 73 74 65 72 3d 25 73 20 6e 53 69 7a 65 3d 25 64  ster=%s nSize=%d
301f0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67  \n", .      pPag
30200 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
30210 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e  Master, pPager->
30220 64 62 53 69 7a 65 29 29 3b 0a 0a 20 20 69 66 28  dbSize));..  if(
30230 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72   MEMDB && pPager
30240 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a  ->dbModified ){.
30250 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
30260 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
30270 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
30280 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
30290 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 20   to, or this.   
302a0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
302b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
302c0 6c 6c 65 64 2c 20 69 74 20 69 73 20 6d 6f 73 74  lled, it is most
302d0 6c 79 20 61 20 6e 6f 2d 6f 70 2e 20 20 48 6f 77  ly a no-op.  How
302e0 65 76 65 72 2c 20 61 6e 79 0a 20 20 20 20 2a 2a  ever, any.    **
302f0 20 62 61 63 6b 75 70 20 69 6e 20 70 72 6f 67 72   backup in progr
30300 65 73 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ess needs to be 
30310 72 65 73 74 61 72 74 65 64 2e 0a 20 20 20 20 2a  restarted..    *
30320 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  /.    sqlite3Bac
30330 6b 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65  kupRestart(pPage
30340 72 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d  r->pBackup);.  }
30350 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
30360 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59  >state!=PAGER_SY
30370 4e 43 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e  NCED && pPager->
30380 64 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 20 20  dbModified ){.  
30390 20 20 69 66 28 20 70 61 67 65 72 55 73 65 57 61    if( pagerUseWa
303a0 6c 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  l(pPager) ){.   
303b0 20 20 20 50 67 48 64 72 20 2a 70 4c 69 73 74 20     PgHdr *pList 
303c0 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
303d0 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
303e0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 20  >pPCache);.     
303f0 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a 20 20   if( pList ){.  
30400 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
30410 57 61 6c 46 72 61 6d 65 73 28 70 50 61 67 65 72  WalFrames(pPager
30420 2c 20 70 4c 69 73 74 2c 20 70 50 61 67 65 72 2d  , pList, pPager-
30430 3e 64 62 53 69 7a 65 2c 20 31 2c 20 0a 20 20 20  >dbSize, 1, .   
30440 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72           (pPager
30450 2d 3e 66 75 6c 6c 53 79 6e 63 20 3f 20 70 50 61  ->fullSync ? pPa
30460 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20  ger->sync_flags 
30470 3a 20 30 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  : 0).        );.
30480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
30490 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
304a0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
304b0 65 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c  e3PcacheCleanAll
304c0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
304d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
304e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 54  else{.      /* T
304f0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
30500 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ck updates the c
30510 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45  hange-counter. E
30520 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20  xactly how it.  
30530 20 20 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73      ** does this
30540 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
30550 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
30560 74 6f 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74  tomic-update opt
30570 69 6d 69 7a 61 74 69 6f 6e 0a 20 20 20 20 20 20  imization.      
30580 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64 20 61  ** was enabled a
30590 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20  t compile time, 
305a0 61 6e 64 20 69 66 20 74 68 69 73 20 74 72 61 6e  and if this tran
305b0 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20 74 68  saction meets th
305c0 65 20 0a 20 20 20 20 20 20 2a 2a 20 72 75 6e 74  e .      ** runt
305d0 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20  ime criteria to 
305e0 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f  use the operatio
305f0 6e 3a 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  n: .      **.   
30600 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 65 20 66     **    * The f
30610 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f  ile-system suppo
30620 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  rts the atomic-w
30630 72 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f  rite property fo
30640 72 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 20 20  r.      **      
30650 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
30660 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 20 0a 20  age-size, and . 
30670 20 20 20 20 20 2a 2a 20 20 20 20 2a 20 54 68 69       **    * Thi
30680 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20  s commit is not 
30690 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d  part of a multi-
306a0 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  file transaction
306b0 2c 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 20  , and.      **  
306c0 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    * Exactly one 
306d0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
306e0 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
306f0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
30700 66 69 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  file..      **. 
30710 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 6f       ** If the o
30720 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61 73 20  ptimization was 
30730 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74 20 63  not enabled at c
30740 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68 65  ompile time, the
30750 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 70  n the.      ** p
30760 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
30770 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69  counter() functi
30780 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
30790 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
307a0 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 75 6e 74  e.      ** count
307b0 65 72 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d  er in 'indirect-
307c0 6d 6f 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70  mode'. If the op
307d0 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f  timization is co
307e0 6d 70 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20  mpiled in but.  
307f0 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20 61 70      ** is not ap
30800 70 6c 69 63 61 62 6c 65 20 74 6f 20 74 68 69 73  plicable to this
30810 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 63 61   transaction, ca
30820 6c 6c 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61  ll sqlite3Journa
30830 6c 43 72 65 61 74 65 28 29 0a 20 20 20 20 20 20  lCreate().      
30840 2a 2a 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ** to make sure 
30850 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
30860 20 68 61 73 20 61 63 74 75 61 6c 6c 79 20 62 65   has actually be
30870 65 6e 20 63 72 65 61 74 65 64 2c 20 74 68 65 6e  en created, then
30880 20 63 61 6c 6c 0a 20 20 20 20 20 20 2a 2a 20 70   call.      ** p
30890 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
308a0 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75 70 64  counter() to upd
308b0 61 74 65 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ate the change-c
308c0 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69 72 65  ounter in indire
308d0 63 74 0a 20 20 20 20 20 20 2a 2a 20 6d 6f 64 65  ct.      ** mode
308e0 2e 20 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  . .      **.    
308f0 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20    ** Otherwise, 
30900 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74  if the optimizat
30910 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e 61 62  ion is both enab
30920 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63 61 62  led and applicab
30930 6c 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  le,.      ** the
30940 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63  n call pager_inc
30950 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
30960 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
30970 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20  change-counter. 
30980 20 20 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65       ** in 'dire
30990 63 74 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69  ct' mode. In thi
309a0 73 20 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e  s case the journ
309b0 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76  al file will nev
309c0 65 72 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 63  er be.      ** c
309d0 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73 20  reated for this 
309e0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
309f0 20 20 20 2a 2f 0a 20 20 23 69 66 64 65 66 20 53     */.  #ifdef S
30a00 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
30a10 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
30a20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
30a30 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
30a40 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
30a50 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
30a60 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
30a70 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20  NALMODE_OFF );. 
30a80 20 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65       if( !zMaste
30a90 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  r && isOpen(pPag
30aa0 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20 20 20  er->jfd) .      
30ab0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
30ac0 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66  nalOff==jrnlBuff
30ad0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a  erSize(pPager) .
30ae0 20 20 20 20 20 20 20 26 26 20 70 50 61 67 65 72         && pPager
30af0 2d 3e 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72  ->dbSize>=pPager
30b00 2d 3e 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20  ->dbFileSize.   
30b10 20 20 20 20 26 26 20 28 30 3d 3d 28 70 50 67 20      && (0==(pPg 
30b20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  = sqlite3PcacheD
30b30 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
30b40 3e 70 50 43 61 63 68 65 29 29 20 7c 7c 20 30 3d  >pPCache)) || 0=
30b50 3d 70 50 67 2d 3e 70 44 69 72 74 79 29 0a 20 20  =pPg->pDirty).  
30b60 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f      ){.        /
30b70 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20  * Update the db 
30b80 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  file change coun
30b90 74 65 72 20 76 69 61 20 74 68 65 20 64 69 72 65  ter via the dire
30ba0 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f 64 2e  ct-write method.
30bb0 20 54 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   The .        **
30bc0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
30bd0 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65 20  will modify the 
30be0 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
30bf0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65  entation of page
30c00 20 31 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74   1 .        ** t
30c10 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70  o include the up
30c20 64 61 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75  dated change cou
30c30 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72  nter and then wr
30c40 69 74 65 20 70 61 67 65 20 31 20 0a 20 20 20 20  ite page 1 .    
30c50 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c 79 20      ** directly 
30c60 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
30c70 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66  file. Because of
30c80 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
30c90 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72  e .        ** pr
30ca0 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f  operty of the ho
30cb0 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  st file-system, 
30cc0 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
30cd0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
30ce0 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72   rc = pager_incr
30cf0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70  _changecounter(p
30d00 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20  Pager, 1);.     
30d10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30d20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72  rc = sqlite3Jour
30d30 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65 72  nalCreate(pPager
30d40 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
30d50 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
30d60 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
30d70 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
30d80 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
30d90 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ger, 0);.       
30da0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 23 65 6c   }.      }.  #el
30db0 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  se.      rc = pa
30dc0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
30dd0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30  ounter(pPager, 0
30de0 29 3b 0a 20 20 23 65 6e 64 69 66 0a 20 20 20 20  );.  #endif.    
30df0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
30e00 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
30e10 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
30e20 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  ;.  .      /* If
30e30 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
30e40 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
30e50 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
30e60 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
30e70 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64        ** being d
30e80 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20  iscarded by the 
30e90 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20  truncation must 
30ea0 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  be written to th
30eb0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
30ec0 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61  ** file. This ca
30ed0 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e  n only happen in
30ee0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
30ef0 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  e..      **.    
30f00 20 20 2a 2a 20 42 65 66 6f 72 65 20 72 65 61 64    ** Before read
30f10 69 6e 67 20 74 68 65 20 70 61 67 65 73 20 77 69  ing the pages wi
30f20 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
30f30 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
30f40 0a 20 20 20 20 20 20 2a 2a 20 63 75 72 72 65 6e  .      ** curren
30f50 74 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72  t value of Pager
30f60 2e 64 62 53 69 7a 65 2c 20 73 65 74 20 64 62 53  .dbSize, set dbS
30f70 69 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20  ize back to the 
30f80 76 61 6c 75 65 0a 20 20 20 20 20 20 2a 2a 20 74  value.      ** t
30f90 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74 20 74  hat it took at t
30fa0 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
30fb0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f 74 68  transaction. Oth
30fc0 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20 20 20  erwise, the.    
30fd0 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
30fe0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
30ff0 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61  return zeroed pa
31000 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a  ges instead of .
31010 20 20 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67        ** reading
31020 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64   data from the d
31030 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
31040 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
31050 57 68 65 6e 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  When journal_mod
31060 65 3d 3d 4f 46 46 20 74 68 65 20 64 62 4f 72 69  e==OFF the dbOri
31070 67 53 69 7a 65 20 69 73 20 61 6c 77 61 79 73 20  gSize is always 
31080 7a 65 72 6f 2c 20 73 6f 20 74 68 69 73 0a 20 20  zero, so this.  
31090 20 20 20 20 2a 2a 20 62 6c 6f 63 6b 20 6e 65 76      ** block nev
310a0 65 72 20 72 75 6e 73 20 69 66 20 6a 6f 75 72 6e  er runs if journ
310b0 61 6c 5f 6d 6f 64 65 3d 4f 46 46 2e 0a 20 20 20  al_mode=OFF..   
310c0 20 20 20 2a 2f 0a 20 20 23 69 66 6e 64 65 66 20     */.  #ifndef 
310d0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
310e0 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
310f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
31100 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
31110 7a 65 20 0a 20 20 20 20 20 20 20 26 26 20 41 4c  ze .       && AL
31120 57 41 59 53 28 70 50 61 67 65 72 2d 3e 6a 6f 75  WAYS(pPager->jou
31130 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f  rnalMode!=PAGER_
31140 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 29  JOURNALMODE_OFF)
31150 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
31160 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20 20    Pgno i;       
31170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31180 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
31190 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65  terator variable
311a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   */.        cons
311b0 74 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50  t Pgno iSkip = P
311c0 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
311d0 67 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67  ger); /* Pending
311e0 20 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20   lock page */.  
311f0 20 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f        const Pgno
31200 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
31210 2d 3e 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20  ->dbSize;       
31220 2f 2a 20 44 61 74 61 62 61 73 65 20 69 6d 61 67  /* Database imag
31230 65 20 73 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20  e size */ .     
31240 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
31250 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 4f 72  e = pPager->dbOr
31260 69 67 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  igSize;.        
31270 66 6f 72 28 20 69 3d 64 62 53 69 7a 65 2b 31 3b  for( i=dbSize+1;
31280 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72   i<=pPager->dbOr
31290 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20  igSize; i++ ){. 
312a0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71           if( !sq
312b0 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
312c0 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
312d0 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b  al, i) && i!=iSk
312e0 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ip ){.          
312f0 20 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 20    PgHdr *pPage; 
31300 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
31310 61 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  age to journal *
31320 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  /.            rc
31330 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
31340 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70  et(pPager, i, &p
31350 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
31360 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31370 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d  E_OK ) goto comm
31380 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69  it_phase_one_exi
31390 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
313a0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
313b0 57 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  Write(pPage);.  
313c0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
313d0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
313e0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
313f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
31400 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f  K ) goto commit_
31410 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
31420 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
31430 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
31440 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64  ager->dbSize = d
31450 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 7d 20 0a  bSize;.      } .
31460 20 20 23 65 6e 64 69 66 0a 20 20 0a 20 20 20 20    #endif.  .    
31470 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6d    /* Write the m
31480 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
31490 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
314a0 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 61 20 6d  nal file. If a m
314b0 61 73 74 65 72 20 0a 20 20 20 20 20 20 2a 2a 20  aster .      ** 
314c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
314d0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
314e0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
314f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
31500 0a 20 20 20 20 20 20 2a 2a 20 6f 72 20 69 66 20  .      ** or if 
31510 7a 4d 61 73 74 65 72 20 69 73 20 4e 55 4c 4c 20  zMaster is NULL 
31520 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  (no master journ
31530 61 6c 29 2c 20 74 68 65 6e 20 74 68 69 73 20 63  al), then this c
31540 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  all is a no-op..
31550 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72        */.      r
31560 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
31570 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
31580 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
31590 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
315a0 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70   ) goto commit_p
315b0 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20  hase_one_exit;. 
315c0 20 0a 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20   .      /* Sync 
315d0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
315e0 2e 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d  . If the atomic-
315f0 75 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74  update optimizat
31600 69 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20  ion is being.   
31610 20 20 20 2a 2a 20 75 73 65 64 2c 20 74 68 69 73     ** used, this
31620 20 63 61 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63   call will not c
31630 72 65 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  reate the journa
31640 6c 20 66 69 6c 65 20 6f 72 20 70 65 72 66 6f 72  l file or perfor
31650 6d 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20 72  m any.      ** r
31660 65 61 6c 20 49 4f 2e 0a 20 20 20 20 20 20 2a 2f  eal IO..      */
31670 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
31680 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
31690 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
316a0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
316b0 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
316c0 5f 65 78 69 74 3b 0a 20 20 0a 20 20 20 20 20 20  _exit;.  .      
316d0 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
316e0 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
316f0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
31700 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  /.      rc = pag
31710 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
31720 74 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 44  t(sqlite3PcacheD
31730 69 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d  irtyList(pPager-
31740 3e 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20  >pPCache));.    
31750 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
31760 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 61  _OK ){.        a
31770 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
31780 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20  E_IOERR_BLOCKED 
31790 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
317a0 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
317b0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
317c0 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63       sqlite3Pcac
317d0 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65  heCleanAll(pPage
317e0 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 0a  r->pPCache);.  .
317f0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20        /* If the 
31800 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73 20  file on disk is 
31810 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69 7a  not the same siz
31820 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61 73  e as the databas
31830 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 20 20 2a  e image,.      *
31840 2a 20 74 68 65 6e 20 75 73 65 20 70 61 67 65 72  * then use pager
31850 5f 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f  _truncate to gro
31860 77 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20  w or shrink the 
31870 66 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20  file here..     
31880 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
31890 61 67 65 72 2d 3e 64 62 53 69 7a 65 21 3d 70 50  ager->dbSize!=pP
318a0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
318b0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   ){.        Pgno
318c0 20 6e 4e 65 77 20 3d 20 70 50 61 67 65 72 2d 3e   nNew = pPager->
318d0 64 62 53 69 7a 65 20 2d 20 28 70 50 61 67 65 72  dbSize - (pPager
318e0 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47 45 52 5f  ->dbSize==PAGER_
318f0 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 29  MJ_PGNO(pPager))
31900 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
31910 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
31920 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
31930 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   );.        rc =
31940 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
31950 70 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20  pPager, nNew);. 
31960 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
31970 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
31980 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
31990 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
319a0 20 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c   .      /* Final
319b0 6c 79 2c 20 73 79 6e 63 20 74 68 65 20 64 61 74  ly, sync the dat
319c0 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20  abase file. */. 
319d0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
319e0 2d 3e 6e 6f 53 79 6e 63 20 26 26 20 21 6e 6f 53  ->noSync && !noS
319f0 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ync ){.        r
31a00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
31a10 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  c(pPager->fd, pP
31a20 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
31a30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
31a40 20 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e   IOTRACE(("DBSYN
31a50 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  C %p\n", pPager)
31a60 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ).    }..    pPa
31a70 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
31a80 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a  ER_SYNCED;.  }..
31a90 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65  commit_phase_one
31aa0 5f 65 78 69 74 3a 0a 20 20 72 65 74 75 72 6e 20  _exit:.  return 
31ab0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68  rc;.}.../*.** Wh
31ac0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
31ad0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
31ae0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
31af0 73 20 62 65 65 6e 20 63 6f 6d 70 6c 65 74 65 6c  s been completel
31b00 79 0a 2a 2a 20 75 70 64 61 74 65 64 20 74 6f 20  y.** updated to 
31b10 72 65 66 6c 65 63 74 20 74 68 65 20 63 68 61 6e  reflect the chan
31b20 67 65 73 20 6d 61 64 65 20 62 79 20 74 68 65 20  ges made by the 
31b30 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
31b40 69 6f 6e 20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65  ion and.** synce
31b50 64 20 74 6f 20 64 69 73 6b 2e 20 54 68 65 20 6a  d to disk. The j
31b60 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 69 6c  ournal file stil
31b70 6c 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  l exists in the 
31b80 66 69 6c 65 2d 73 79 73 74 65 6d 20 0a 2a 2a 20  file-system .** 
31b90 74 68 6f 75 67 68 2c 20 61 6e 64 20 69 66 20 61  though, and if a
31ba0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
31bb0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74  at this point it
31bc0 20 77 69 6c 6c 20 65 76 65 6e 74 75 61 6c 6c 79   will eventually
31bd0 0a 2a 2a 20 62 65 20 75 73 65 64 20 61 73 20 61  .** be used as a
31be0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64   hot-journal and
31bf0 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
31c00 6e 73 61 63 74 69 6f 6e 20 72 6f 6c 6c 65 64 20  nsaction rolled 
31c10 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
31c20 20 66 75 6e 63 74 69 6f 6e 20 66 69 6e 61 6c 69   function finali
31c30 7a 65 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  zes the journal 
31c40 66 69 6c 65 2c 20 65 69 74 68 65 72 20 62 79 20  file, either by 
31c50 64 65 6c 65 74 69 6e 67 2c 20 0a 2a 2a 20 74 72  deleting, .** tr
31c60 75 6e 63 61 74 69 6e 67 20 6f 72 20 70 61 72 74  uncating or part
31c70 69 61 6c 6c 79 20 7a 65 72 6f 69 6e 67 20 69 74  ially zeroing it
31c80 2c 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  , so that it can
31c90 6e 6f 74 20 62 65 20 75 73 65 64 20 0a 2a 2a 20  not be used .** 
31ca0 66 6f 72 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  for hot-journal 
31cb0 72 6f 6c 6c 62 61 63 6b 2e 20 4f 6e 63 65 20 74  rollback. Once t
31cc0 68 69 73 20 69 73 20 64 6f 6e 65 20 74 68 65 20  his is done the 
31cd0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 0a 2a  transaction is.*
31ce0 2a 20 69 72 72 65 76 6f 63 61 62 6c 79 20 63 6f  * irrevocably co
31cf0 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  mmitted..**.** I
31d00 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
31d10 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63  s, an IO error c
31d20 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
31d30 61 6e 64 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  and the pager.**
31d40 20 6d 6f 76 65 73 20 69 6e 74 6f 20 74 68 65 20   moves into the 
31d50 65 72 72 6f 72 20 73 74 61 74 65 2e 20 4f 74 68  error state. Oth
31d60 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f  erwise, SQLITE_O
31d70 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
31d80 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
31d90 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
31da0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
31db0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
31dc0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
31dd0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
31de0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20  n code */..  /* 
31df0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
31e00 75 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65  uld not be calle
31e10 64 20 69 66 20 61 20 70 72 69 6f 72 20 65 72 72  d if a prior err
31e20 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
31e30 0a 20 20 2a 2a 20 42 75 74 20 69 66 20 28 64 75  .  ** But if (du
31e40 65 20 74 6f 20 61 20 63 6f 64 69 6e 67 20 65 72  e to a coding er
31e50 72 6f 72 20 65 6c 73 65 77 68 65 72 65 20 69 6e  ror elsewhere in
31e60 20 74 68 65 20 73 79 73 74 65 6d 29 20 69 74 20   the system) it 
31e70 64 6f 65 73 20 67 65 74 0a 20 20 2a 2a 20 63 61  does get.  ** ca
31e80 6c 6c 65 64 2c 20 6a 75 73 74 20 72 65 74 75 72  lled, just retur
31e90 6e 20 74 68 65 20 73 61 6d 65 20 65 72 72 6f 72  n the same error
31ea0 20 63 6f 64 65 20 77 69 74 68 6f 75 74 20 64 6f   code without do
31eb0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 2a 2f  ing anything. */
31ec0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
31ed0 67 65 72 2d 3e 65 72 72 43 6f 64 65 29 20 29 20  ger->errCode) ) 
31ee0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65  return pPager->e
31ef0 72 72 43 6f 64 65 3b 0a 0a 20 20 2f 2a 20 54 68  rrCode;..  /* Th
31f00 69 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75  is function shou
31f10 6c 64 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64  ld not be called
31f20 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
31f30 20 6e 6f 74 20 69 6e 20 61 74 20 6c 65 61 73 74   not in at least
31f40 0a 20 20 2a 2a 20 50 41 47 45 52 5f 52 45 53 45  .  ** PAGER_RESE
31f50 52 56 45 44 20 73 74 61 74 65 2e 20 41 6e 64 20  RVED state. And 
31f60 69 6e 64 65 65 64 20 53 51 4c 69 74 65 20 6e 65  indeed SQLite ne
31f70 76 65 72 20 64 6f 65 73 20 74 68 69 73 2e 20 42  ver does this. B
31f80 75 74 20 69 74 20 69 73 0a 20 20 2a 2a 20 6e 69  ut it is.  ** ni
31f90 63 65 20 74 6f 20 68 61 76 65 20 74 68 69 73 20  ce to have this 
31fa0 64 65 66 65 6e 73 69 76 65 20 74 65 73 74 20 68  defensive test h
31fb0 65 72 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2f  ere anyway..  */
31fc0 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 50 61  .  if( NEVER(pPa
31fd0 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
31fe0 5f 52 45 53 45 52 56 45 44 29 20 29 20 72 65 74  _RESERVED) ) ret
31ff0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
32000 3b 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d  ;..  /* An optim
32010 69 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20  ization. If the 
32020 64 61 74 61 62 61 73 65 20 77 61 73 20 6e 6f 74  database was not
32030 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69   actually modifi
32040 65 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74  ed during.  ** t
32050 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  his transaction,
32060 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
32070 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
32080 76 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20  ve-mode and is. 
32090 20 2a 2a 20 75 73 69 6e 67 20 70 65 72 73 69 73   ** using persis
320a0 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74  tent journals, t
320b0 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f  hen this functio
320c0 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20  n is a no-op..  
320d0 2a 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 72  **.  ** The star
320e0 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
320f0 20 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20   file currently 
32100 63 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c  contains a singl
32110 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20  e journal .  ** 
32120 68 65 61 64 65 72 20 77 69 74 68 20 74 68 65 20  header with the 
32130 6e 52 65 63 20 66 69 65 6c 64 20 73 65 74 20 74  nRec field set t
32140 6f 20 30 2e 20 49 66 20 73 75 63 68 20 61 20 6a  o 0. If such a j
32150 6f 75 72 6e 61 6c 20 69 73 20 75 73 65 64 20 61  ournal is used a
32160 73 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75  s.  ** a hot-jou
32170 72 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d  rnal during hot-
32180 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
32190 2c 20 30 20 63 68 61 6e 67 65 73 20 77 69 6c 6c  , 0 changes will
321a0 20 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f   be made.  ** to
321b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
321c0 6c 65 2e 20 53 6f 20 74 68 65 72 65 20 69 73 20  le. So there is 
321d0 6e 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20  no need to zero 
321e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a  the journal .  *
321f0 2a 20 68 65 61 64 65 72 2e 20 53 69 6e 63 65 20  * header. Since 
32200 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
32210 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
32220 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
32230 0a 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e  .  ** to drop an
32240 79 20 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a  y locks either..
32250 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
32260 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30  r->dbModified==0
32270 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c   && pPager->excl
32280 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26  usiveMode .   &&
32290 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
322a0 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
322b0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a  NALMODE_PERSIST.
322c0 20 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28    ){.    assert(
322d0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
322e0 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
322f0 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
32300 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
32310 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45  _OK;.  }..  PAGE
32320 52 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20  RTRACE(("COMMIT 
32330 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
32340 50 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65  Pager)));.  asse
32350 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
32360 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
32370 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61  || MEMDB || !pPa
32380 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
32390 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
323a0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
323b0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
323c0 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65  setMaster);.  re
323d0 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
323e0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
323f0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
32400 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68 65  all changes. The
32410 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20   database falls 
32420 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48  back to PAGER_SH
32430 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a  ARED mode..**.**
32440 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70   This function p
32450 65 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b  erforms two task
32460 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74  s:.**.**   1) It
32470 20 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20   rolls back the 
32480 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65  journal file, re
32490 73 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61  storing all data
324a0 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a  base file and .*
324b0 2a 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79  *      in-memory
324c0 20 63 61 63 68 65 20 70 61 67 65 73 20 74 6f 20   cache pages to 
324d0 74 68 65 20 73 74 61 74 65 20 74 68 65 79 20 77  the state they w
324e0 65 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20  ere in when the 
324f0 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
32500 20 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20      was opened, 
32510 61 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20 66  and.**   2) It f
32520 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75  inalizes the jou
32530 72 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68  rnal file, so th
32540 61 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65  at it is not use
32550 64 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20  d for hot.**    
32560 20 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e    rollback at an
32570 79 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  y point in the f
32580 75 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62  uture..**.** sub
32590 6a 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c  ject to the foll
325a0 6f 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61 74  owing qualificat
325b0 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66  ions:.**.** * If
325c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
325d0 65 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65  e is not yet ope
325e0 6e 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63  n when this func
325f0 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a  tion is called,.
32600 2a 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28  **   then only (
32610 32 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e  2) is performed.
32620 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
32630 65 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61  ere is no journa
32640 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72  l file.**   to r
32650 6f 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  oll back..**.** 
32660 2a 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f 72  * If in an error
32670 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
32680 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74  n SQLITE_FULL, t
32690 68 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73 20  hen task (1) is 
326a0 0a 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64 2e  .**   performed.
326b0 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20   If successful, 
326c0 74 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72 64  task (2). Regard
326d0 6c 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63  less of the outc
326e0 6f 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68  ome.**   of eith
326f0 65 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73 74  er, the error st
32700 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69  ate error code i
32710 73 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  s returned to th
32720 65 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69  e caller.**   (i
32730 2e 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49 54  .e. either SQLIT
32740 45 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54  E_IOERR or SQLIT
32750 45 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a  E_CORRUPT)..**.*
32760 2a 20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  * * If the pager
32770 20 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45 53   is in PAGER_RES
32780 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65  ERVED state, the
32790 6e 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20 57  n attempt (1). W
327a0 68 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e  hether.**   or n
327b0 6f 74 20 28 31 29 20 69 73 20 73 75 63 63 75 73  ot (1) is succus
327c0 73 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d  sful, also attem
327d0 70 74 20 28 32 29 2e 20 49 66 20 73 75 63 63 65  pt (2). If succe
327e0 73 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a  ssful, return.**
327f0 20 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74     SQLITE_OK. Ot
32800 68 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20 74  herwise, enter t
32810 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61  he error state a
32820 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 66 69  nd return the fi
32830 72 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20  rst .**   error 
32840 63 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65 64  code encountered
32850 2e 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68  . .**.**   In th
32860 69 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73  is case there is
32870 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20   no chance that 
32880 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73  the database was
32890 20 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a   written to. .**
328a0 20 20 20 53 6f 20 69 73 20 73 61 66 65 20 74 6f     So is safe to
328b0 20 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f   finalize the jo
328c0 75 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e 20  urnal file even 
328d0 69 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  if the playback 
328e0 0a 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f 6e  .**   (operation
328f0 20 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77 65   1) failed. Howe
32900 76 65 72 20 74 68 65 20 70 61 67 65 72 20 6d 75  ver the pager mu
32910 73 74 20 65 6e 74 65 72 20 74 68 65 20 65 72 72  st enter the err
32920 6f 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61 73  or state.**   as
32930 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
32940 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
32950 61 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75 73  ache are now sus
32960 70 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69  pect..**.** * Fi
32970 6e 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41 47  nally, if in PAG
32980 45 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61  ER_EXCLUSIVE sta
32990 74 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74  te, then attempt
329a0 20 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20   (1). Only.**   
329b0 61 74 74 65 6d 70 74 20 28 32 29 20 69 66 20 28  attempt (2) if (
329c0 31 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  1) is successful
329d0 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
329e0 4f 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  OK if successful
329f0 2c 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73 65  ,.**   otherwise
32a00 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72   enter the error
32a10 20 73 74 61 74 65 20 61 6e 64 20 72 65 74 75 72   state and retur
32a20 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
32a30 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20   from the .**   
32a40 66 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f  failing operatio
32a50 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68  n..**.**   In th
32a60 69 73 20 63 61 73 65 20 74 68 65 20 64 61 74 61  is case the data
32a70 62 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68 61  base file may ha
32a80 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
32a90 74 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a  to. So if the.**
32aa0 20 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72     playback oper
32ab0 61 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75  ation did not su
32ac0 63 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20 6e  cceed it would n
32ad0 6f 74 20 62 65 20 73 61 66 65 20 74 6f 20 66 69  ot be safe to fi
32ae0 6e 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20  nalize.**   the 
32af0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74  journal file. It
32b00 20 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65 66   needs to be lef
32b10 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79  t in the file-sy
32b20 73 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20  stem so that.** 
32b30 20 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f    some other pro
32b40 63 65 73 73 20 63 61 6e 20 75 73 65 20 69 74 20  cess can use it 
32b50 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  to restore the d
32b60 61 74 61 62 61 73 65 20 73 74 61 74 65 20 28 62  atabase state (b
32b70 79 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e  y.**   hot-journ
32b80 61 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f  al rollback)..*/
32b90 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
32ba0 72 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  rRollback(Pager 
32bb0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
32bc0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
32bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32be0 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
32bf0 2a 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45 28  */.  PAGERTRACE(
32c00 28 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22  ("ROLLBACK %d\n"
32c10 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
32c20 29 29 29 3b 0a 20 20 69 66 28 20 70 61 67 65 72  )));.  if( pager
32c30 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
32c40 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 0a  {.    int rc2;..
32c50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
32c60 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 70  PagerSavepoint(p
32c70 50 61 67 65 72 2c 20 53 41 56 45 50 4f 49 4e 54  Pager, SAVEPOINT
32c80 5f 52 4f 4c 4c 42 41 43 4b 2c 20 2d 31 29 3b 0a  _ROLLBACK, -1);.
32c90 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
32ca0 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
32cb0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
32cc0 73 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  setMaster);.    
32cd0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
32ce0 4b 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  K ) rc = rc2;.  
32cf0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
32d00 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a  or(pPager, rc);.
32d10 20 20 7d 65 6c 73 65 20 69 66 28 20 21 70 50 61    }else if( !pPa
32d20 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
32d30 7c 7c 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  || !isOpen(pPage
32d40 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72  r->jfd) ){.    r
32d50 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
32d60 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
32d70 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
32d80 74 65 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  ter);.  }else if
32d90 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
32da0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72  e && pPager->err
32db0 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c  Code!=SQLITE_FUL
32dc0 4c 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  L ){.    if( pPa
32dd0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
32de0 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
32df0 20 20 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62       pager_playb
32e00 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  ack(pPager, 0);.
32e10 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70      }.    rc = p
32e20 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
32e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
32e40 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d   pPager->state==
32e50 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
32e60 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b  {.      int rc2;
32e70 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
32e80 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
32e90 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32  r, 0);.      rc2
32ea0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
32eb0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c  nsaction(pPager,
32ec0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
32ed0 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
32ee0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
32ef0 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 63 32          rc = rc2
32f00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
32f10 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
32f20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
32f30 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
32f40 0a 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ..    if( !MEMDB
32f50 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
32f60 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20  ->dbSizeValid = 
32f70 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  0;.    }..    /*
32f80 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
32f90 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c  urs during a ROL
32fa0 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f  LBACK, we can no
32fb0 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68   longer trust th
32fc0 65 20 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63  e pager.    ** c
32fd0 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61  ache. So call pa
32fe0 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74  ger_error() on t
32ff0 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61  he way out to ma
33000 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20  ke any error .  
33010 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
33020 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
33030 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
33040 67 65 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20  ger, rc);.  }.  
33050 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
33060 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
33070 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
33080 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
33090 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
330a0 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
330b0 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
330c0 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
330d0 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65  le..*/.u8 sqlite
330e0 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79  3PagerIsreadonly
330f0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
33100 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
33110 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f  ->readOnly;.}../
33120 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
33130 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65  number of refere
33140 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
33150 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
33160 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50  3PagerRefcount(P
33170 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
33180 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
33190 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50  cacheRefCount(pP
331a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
331b0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
331c0 74 68 65 20 61 70 70 72 6f 78 69 6d 61 74 65 20  the approximate 
331d0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
331e0 6f 66 20 6d 65 6d 6f 72 79 20 63 75 72 72 65 6e  of memory curren
331f0 74 6c 79 0a 2a 2a 20 75 73 65 64 20 62 79 20 74  tly.** used by t
33200 68 65 20 70 61 67 65 72 20 61 6e 64 20 69 74 73  he pager and its
33210 20 61 73 73 6f 63 69 61 74 65 64 20 63 61 63 68   associated cach
33220 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
33230 33 50 61 67 65 72 4d 65 6d 55 73 65 64 28 50 61  3PagerMemUsed(Pa
33240 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
33250 69 6e 74 20 70 65 72 50 61 67 65 53 69 7a 65 20  int perPageSize 
33260 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
33270 7a 65 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  ze + pPager->nEx
33280 74 72 61 20 2b 20 32 30 3b 0a 20 20 72 65 74 75  tra + 20;.  retu
33290 72 6e 20 70 65 72 50 61 67 65 53 69 7a 65 2a 73  rn perPageSize*s
332a0 71 6c 69 74 65 33 50 63 61 63 68 65 50 61 67 65  qlite3PcachePage
332b0 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  count(pPager->pP
332c0 43 61 63 68 65 29 0a 20 20 20 20 20 20 20 20 20  Cache).         
332d0 20 20 2b 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f    + sqlite3Mallo
332e0 63 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d  cSize(pPager);.}
332f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
33300 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
33310 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73  erences to the s
33320 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
33330 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
33340 65 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44  erPageRefcount(D
33350 62 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20  bPage *pPage){. 
33360 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50   return sqlite3P
33370 63 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e  cachePageRefcoun
33380 74 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66  t(pPage);.}..#if
33390 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
333a0 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
333b0 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  ne is used for t
333c0 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
333d0 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74  sis only..*/.int
333e0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74   *sqlite3PagerSt
333f0 61 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65  ats(Pager *pPage
33400 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  r){.  static int
33410 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d   a[11];.  a[0] =
33420 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65   sqlite3PcacheRe
33430 66 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70  fCount(pPager->p
33440 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20  PCache);.  a[1] 
33450 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  = sqlite3PcacheP
33460 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
33470 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32  >pPCache);.  a[2
33480 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  ] = sqlite3Pcach
33490 65 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50  eGetCachesize(pP
334a0 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
334b0 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d    a[3] = pPager-
334c0 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28  >dbSizeValid ? (
334d0 69 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53  int) pPager->dbS
334e0 69 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d  ize : -1;.  a[4]
334f0 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65   = pPager->state
33500 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65  ;.  a[5] = pPage
33510 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b  r->errCode;.  a[
33520 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69  6] = pPager->nHi
33530 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67  t;.  a[7] = pPag
33540 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38  er->nMiss;.  a[8
33550 5d 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20  ] = 0;  /* Used 
33560 74 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f  to be pPager->nO
33570 76 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20  vfl */.  a[9] = 
33580 70 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20  pPager->nRead;. 
33590 20 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d   a[10] = pPager-
335a0 3e 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72  >nWrite;.  retur
335b0 6e 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n a;.}.#endif../
335c0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
335d0 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   if this is an i
335e0 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a  n-memory pager..
335f0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
33600 67 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72  gerIsMemdb(Pager
33610 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
33620 75 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a  urn MEMDB;.}../*
33630 0a 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74  .** Check that t
33640 68 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73  here are at leas
33650 74 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76  t nSavepoint sav
33660 65 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66  epoints open. If
33670 20 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75   there are.** cu
33680 72 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61  rrently less tha
33690 6e 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70  n nSavepoints op
336a0 65 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e  en, then open on
336b0 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
336c0 69 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20  ints.** to make 
336d0 75 70 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  up the differenc
336e0 65 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  e. If the number
336f0 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69   of savepoints i
33700 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75  s already.** equ
33710 61 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74  al to nSavepoint
33720 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63  , then this func
33730 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
33740 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f  .**.** If a memo
33750 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
33760 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  ils, SQLITE_NOME
33770 4d 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  M is returned. I
33780 66 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f  f an error .** o
33790 63 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e  ccurs while open
337a0 69 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  ing the sub-jour
337b0 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61  nal file, then a
337c0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
337d0 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20  is.** returned. 
337e0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
337f0 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
33800 69 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76  ite3PagerOpenSav
33810 65 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50  epoint(Pager *pP
33820 61 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70  ager, int nSavep
33830 6f 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  oint){.  int rc 
33840 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
33850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33860 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
33870 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72  e */.  int nCurr
33880 65 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  ent = pPager->nS
33890 61 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20  avepoint;       
338a0 20 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62   /* Current numb
338b0 65 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73  er of savepoints
338c0 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65   */..  if( nSave
338d0 70 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26  point>nCurrent &
338e0 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75  & pPager->useJou
338f0 72 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20  rnal ){.    int 
33900 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ii;             
33910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33920 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20      /* Iterator 
33930 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20  variable */.    
33940 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a  PagerSavepoint *
33950 61 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20  aNew;           
33960 20 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50          /* New P
33970 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20  ager.aSavepoint 
33980 61 72 72 61 79 20 2a 2f 0a 20 20 20 20 69 6e 74  array */.    int
33990 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
339a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
339b0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
339c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
339d0 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
339e0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
339f0 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
33a00 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
33a10 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 2f  eturn rc;..    /
33a20 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67 65 72  * Grow the Pager
33a30 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72 72 61  .aSavepoint arra
33a40 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f 63 28  y using realloc(
33a50 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ). Return SQLITE
33a60 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20 69 66  _NOMEM.    ** if
33a70 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 20   the allocation 
33a80 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69 73 65  fails. Otherwise
33a90 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77 20 70  , zero the new p
33aa0 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65 20 61  ortion in case a
33ab0 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f 63 20   .    ** malloc 
33ac0 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
33ad0 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e 67 20  hile populating 
33ae0 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28 2e 2e  it in the for(..
33af0 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e 0a 20  .) loop below.. 
33b00 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77 20 3d     */.    aNew =
33b10 20 28 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74   (PagerSavepoint
33b20 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f   *)sqlite3Reallo
33b30 63 28 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  c(.        pPage
33b40 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c 20 73  r->aSavepoint, s
33b50 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76 65 70  izeof(PagerSavep
33b60 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69 6e 74  oint)*nSavepoint
33b70 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
33b80 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !aNew ){.      r
33b90 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
33ba0 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6d 65  EM;.    }.    me
33bb0 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75 72 72  mset(&aNew[nCurr
33bc0 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76 65 70  ent], 0, (nSavep
33bd0 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29 20 2a  oint-nCurrent) *
33be0 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
33bf0 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20 70 50  epoint));.    pP
33c00 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74  ager->aSavepoint
33c10 20 3d 20 61 4e 65 77 3b 0a 0a 20 20 20 20 2f 2a   = aNew;..    /*
33c20 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 50 61   Populate the Pa
33c30 67 65 72 53 61 76 65 70 6f 69 6e 74 20 73 74 72  gerSavepoint str
33c40 75 63 74 75 72 65 73 20 6a 75 73 74 20 61 6c 6c  uctures just all
33c50 6f 63 61 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66  ocated. */.    f
33c60 6f 72 28 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20  or(ii=nCurrent; 
33c70 69 69 3c 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  ii<nSavepoint; i
33c80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 4e 65 77  i++){.      aNew
33c90 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 6e 50 61  [ii].nOrig = nPa
33ca0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  ge;.      if( is
33cb0 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
33cc0 29 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) && pPager->jou
33cd0 72 6e 61 6c 4f 66 66 3e 30 20 29 7b 0a 20 20 20  rnalOff>0 ){.   
33ce0 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f       aNew[ii].iO
33cf0 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
33d00 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 20 20  journalOff;.    
33d10 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33d20 20 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65   aNew[ii].iOffse
33d30 74 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  t = JOURNAL_HDR_
33d40 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
33d50 20 20 7d 0a 20 20 20 20 20 20 61 4e 65 77 5b 69    }.      aNew[i
33d60 69 5d 2e 69 53 75 62 52 65 63 20 3d 20 70 50 61  i].iSubRec = pPa
33d70 67 65 72 2d 3e 6e 53 75 62 52 65 63 3b 0a 20 20  ger->nSubRec;.  
33d80 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 70 49 6e      aNew[ii].pIn
33d90 53 61 76 65 70 6f 69 6e 74 20 3d 20 73 71 6c 69  Savepoint = sqli
33da0 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65 28  te3BitvecCreate(
33db0 6e 50 61 67 65 29 3b 0a 20 20 20 20 20 20 69 66  nPage);.      if
33dc0 28 20 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53  ( !aNew[ii].pInS
33dd0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
33de0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
33df0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
33e00 0a 20 20 20 20 20 20 69 66 28 20 70 61 67 65 72  .      if( pager
33e10 55 73 65 57 61 6c 28 70 50 61 67 65 72 29 20 29  UseWal(pPager) )
33e20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
33e30 33 57 61 6c 53 61 76 65 70 6f 69 6e 74 28 70 50  3WalSavepoint(pP
33e40 61 67 65 72 2d 3e 70 57 61 6c 2c 20 61 4e 65 77  ager->pWal, aNew
33e50 5b 69 69 5d 2e 61 57 61 6c 44 61 74 61 29 3b 0a  [ii].aWalData);.
33e60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
33e70 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
33e80 20 3d 20 69 69 2b 31 3b 0a 20 20 20 20 7d 0a 20   = ii+1;.    }. 
33e90 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
33ea0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 6e  r->nSavepoint==n
33eb0 53 61 76 65 70 6f 69 6e 74 20 29 3b 0a 20 20 20  Savepoint );.   
33ec0 20 61 73 73 65 72 74 54 72 75 6e 63 61 74 65 43   assertTruncateC
33ed0 6f 6e 73 74 72 61 69 6e 74 28 70 50 61 67 65 72  onstraint(pPager
33ee0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
33ef0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
33f00 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
33f10 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63  alled to rollbac
33f20 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63 6f  k or release (co
33f30 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69 6e  mmit) a savepoin
33f40 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70 6f  t..** The savepo
33f50 69 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20 6f  int to release o
33f60 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64 20  r rollback need 
33f70 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74 20  not be the most 
33f80 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72 65  recently .** cre
33f90 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a  ated savepoint..
33fa0 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  **.** Parameter 
33fb0 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65 69 74  op is always eit
33fc0 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52 4f  her SAVEPOINT_RO
33fd0 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50 4f  LLBACK or SAVEPO
33fe0 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a 20  INT_RELEASE..** 
33ff0 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f 49  If it is SAVEPOI
34000 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65 6e  NT_RELEASE, then
34010 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65 73   release and des
34020 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f 69  troy the savepoi
34030 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65 78  nt with.** index
34040 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66 20   iSavepoint. If 
34050 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54 5f  it is SAVEPOINT_
34060 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20 72  ROLLBACK, then r
34070 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
34080 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76 65  ges.** that have
34090 20 6f 63 63 75 72 72 65 64 20 73 69 6e 63 65 20   occurred since 
340a0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61  the specified sa
340b0 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61  vepoint was crea
340c0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
340d0 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c  avepoint to roll
340e0 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20  back or release 
340f0 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
34100 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69   parameter .** i
34110 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c  Savepoint. A val
34120 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f  ue of 0 means to
34130 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
34140 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
34150 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73  int.** (the firs
34160 74 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61  t created). A va
34170 6c 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53  lue of (Pager.nS
34180 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e  avepoint-1) mean
34190 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20  s operate.** on 
341a0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
341b0 79 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  y created savepo
341c0 69 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69  int. If iSavepoi
341d0 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
341e0 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61  an.** (Pager.nSa
341f0 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e  vepoint-1), then
34200 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
34210 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
34220 20 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76   If a negative v
34230 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74  alue is passed t
34240 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
34250 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
34260 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
34270 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
34280 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
34290 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a  nt to calling .*
342a0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
342b0 6c 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65  llback() because
342c0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
342d0 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  oes not terminat
342e0 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  e.** the transac
342f0 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  tion or unlock t
34300 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
34310 6a 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68  just restores th
34320 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
34330 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
34340 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
34350 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20  tate. .**.** In 
34360 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61  any case, all sa
34370 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e  vepoints with an
34380 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
34390 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a  han iSavepoint .
343a0 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  ** are destroyed
343b0 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  . If this is a r
343c0 65 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e  elease operation
343d0 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
343e0 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65  RELEASE),.** the
343f0 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76  n savepoint iSav
34400 65 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64  epoint is also d
34410 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
34420 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
34430 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
34440 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72  NOMEM if a memor
34450 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
34460 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20  ls,.** or an IO 
34470 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
34480 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
34490 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62   while rolling b
344a0 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f  ack a .** savepo
344b0 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  int. If no error
344c0 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  s occur, SQLITE_
344d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
344e0 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  */ .int sqlite3P
344f0 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61  agerSavepoint(Pa
34500 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
34510 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
34520 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
34530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
34540 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
34550 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
34560 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
34570 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65  LLBACK );.  asse
34580 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
34590 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  0 || op==SAVEPOI
345a0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a  NT_ROLLBACK );..
345b0 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
345c0 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
345d0 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  int ){.    int i
345e0 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
345f0 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
34600 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  le */.    int nN
34610 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew;          /* 
34620 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e  Number of remain
34630 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ing savepoints a
34640 66 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f  fter this op. */
34650 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
34660 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76  out how many sav
34670 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69  epoints will sti
34680 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74  ll be active aft
34690 65 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f  er this.    ** o
346a0 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20  peration. Store 
346b0 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e  this value in nN
346c0 65 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65  ew. Then free re
346d0 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74  sources associat
346e0 65 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ed .    ** with 
346f0 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
34700 68 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65  hat are destroye
34710 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
34720 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
34730 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e  nNew = iSavepoin
34740 74 20 2b 20 28 28 20 6f 70 3d 3d 53 41 56 45 50  t + (( op==SAVEP
34750 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 29 20 3f  OINT_RELEASE ) ?
34760 20 30 20 3a 20 31 29 3b 0a 20 20 20 20 66 6f 72   0 : 1);.    for
34770 28 69 69 3d 6e 4e 65 77 3b 20 69 69 3c 70 50 61  (ii=nNew; ii<pPa
34780 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b  ger->nSavepoint;
34790 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71   ii++){.      sq
347a0 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
347b0 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  oy(pPager->aSave
347c0 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61 76  point[ii].pInSav
347d0 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 7d 0a 20  epoint);.    }. 
347e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76 65     pPager->nSave
347f0 70 6f 69 6e 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20  point = nNew;.. 
34800 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
34810 20 61 20 72 65 6c 65 61 73 65 20 6f 66 20 74 68   a release of th
34820 65 20 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65  e outermost save
34830 70 6f 69 6e 74 2c 20 74 72 75 6e 63 61 74 65 20  point, truncate 
34840 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d  .    ** the sub-
34850 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20  journal to zero 
34860 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a  bytes in size. *
34870 2f 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 53 41  /.    if( op==SA
34880 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20  VEPOINT_RELEASE 
34890 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 4e 65  ){.      if( nNe
348a0 77 3d 3d 30 20 26 26 20 69 73 4f 70 65 6e 28 70  w==0 && isOpen(p
348b0 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
348c0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
348d0 74 72 75 6e 63 61 74 65 20 69 66 20 69 74 20 69  truncate if it i
348e0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 73  s an in-memory s
348f0 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20  ub-journal. */. 
34900 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
34910 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
34920 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a  Pager->sjfd) ){.
34930 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
34940 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
34950 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30  (pPager->sjfd, 0
34960 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
34970 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ert( rc==SQLITE_
34980 4f 4b 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OK );.        }.
34990 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
349a0 6e 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20  nSubRec = 0;.   
349b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
349c0 2a 20 45 6c 73 65 20 74 68 69 73 20 69 73 20 61  * Else this is a
349d0 20 72 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74   rollback operat
349e0 69 6f 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68  ion, playback th
349f0 65 20 73 70 65 63 69 66 69 65 64 20 73 61 76 65  e specified save
34a00 70 6f 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66  point..    ** If
34a10 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d   this is a temp-
34a20 66 69 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73  file, it is poss
34a30 69 62 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ible that the jo
34a40 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20  urnal file has. 
34a50 20 20 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65     ** not yet be
34a60 65 6e 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68  en opened. In th
34a70 69 73 20 63 61 73 65 20 74 68 65 72 65 20 68 61  is case there ha
34a80 76 65 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67  ve been no chang
34a90 65 73 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  es to.    ** the
34aa0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
34ab0 73 6f 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20  so the playback 
34ac0 6f 70 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65  operation can be
34ad0 20 73 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f   skipped..    */
34ae0 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 61  .    else if( pa
34af0 67 65 72 55 73 65 57 61 6c 28 70 50 61 67 65 72  gerUseWal(pPager
34b00 29 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50 61 67  ) || isOpen(pPag
34b10 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
34b20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74    PagerSavepoint
34b30 20 2a 70 53 61 76 65 70 6f 69 6e 74 20 3d 20 28   *pSavepoint = (
34b40 6e 4e 65 77 3d 3d 30 29 3f 30 3a 26 70 50 61 67  nNew==0)?0:&pPag
34b50 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 6e  er->aSavepoint[n
34b60 4e 65 77 2d 31 5d 3b 0a 20 20 20 20 20 20 72 63  New-1];.      rc
34b70 20 3d 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b   = pagerPlayback
34b80 53 61 76 65 70 6f 69 6e 74 28 70 50 61 67 65 72  Savepoint(pPager
34b90 2c 20 70 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20  , pSavepoint);. 
34ba0 20 20 20 20 20 61 73 73 65 72 74 28 72 63 21 3d       assert(rc!=
34bb0 53 51 4c 49 54 45 5f 44 4f 4e 45 29 3b 0a 20 20  SQLITE_DONE);.  
34bc0 20 20 7d 0a 20 20 0a 20 20 7d 0a 20 20 72 65 74    }.  .  }.  ret
34bd0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
34be0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
34bf0 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
34c00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
34c10 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
34c20 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e  qlite3PagerFilen
34c30 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ame(Pager *pPage
34c40 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
34c50 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a  ger->zFilename;.
34c60 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
34c70 74 68 65 20 56 46 53 20 73 74 72 75 63 74 75 72  the VFS structur
34c80 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e  e for the pager.
34c90 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65  .*/.const sqlite
34ca0 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61  3_vfs *sqlite3Pa
34cb0 67 65 72 56 66 73 28 50 61 67 65 72 20 2a 70 50  gerVfs(Pager *pP
34cc0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
34cd0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a  pPager->pVfs;.}.
34ce0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
34cf0 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f  e file handle fo
34d00 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  r the database f
34d10 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  ile associated.*
34d20 2a 20 77 69 74 68 20 74 68 65 20 70 61 67 65 72  * with the pager
34d30 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20 72 65  .  This might re
34d40 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
34d50 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74   file has.** not
34d60 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
34d70 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c  ..*/.sqlite3_fil
34d80 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46  e *sqlite3PagerF
34d90 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ile(Pager *pPage
34da0 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  r){.  return pPa
34db0 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a  ger->fd;.}../*.*
34dc0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
34dd0 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
34de0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
34df0 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
34e00 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e  qlite3PagerJourn
34e10 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
34e20 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
34e30 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
34e40 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
34e50 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e 63 28  n true if fsync(
34e60 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69 73 61  ) calls are disa
34e70 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  bled for this pa
34e80 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  ger.  Return FAL
34e90 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63 28 29  SE.** if fsync()
34ea0 73 20 61 72 65 20 65 78 65 63 75 74 65 64 20 6e  s are executed n
34eb0 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  ormally..*/.int 
34ec0 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f 73 79  sqlite3PagerNosy
34ed0 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nc(Pager *pPager
34ee0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
34ef0 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a 0a 23  er->noSync;.}..#
34f00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 53  ifdef SQLITE_HAS
34f10 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53 65 74  _CODEC./*.** Set
34f20 20 6f 72 20 72 65 74 72 69 65 76 65 20 74 68 65   or retrieve the
34f30 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
34f40 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20  pager.*/.static 
34f50 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
34f60 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67  rSetCodec(.  Pag
34f70 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f  er *pPager,.  vo
34f80 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f  id *(*xCodec)(vo
34f90 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
34fa0 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43  nt),.  void (*xC
34fb0 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f  odecSizeChng)(vo
34fc0 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a 20 20  id*,int,int),.  
34fd0 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72 65  void (*xCodecFre
34fe0 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76 6f 69  e)(void*),.  voi
34ff0 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20 20 69  d *pCodec.){.  i
35000 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  f( pPager->xCode
35010 63 46 72 65 65 20 29 20 70 50 61 67 65 72 2d 3e  cFree ) pPager->
35020 78 43 6f 64 65 63 46 72 65 65 28 70 50 61 67 65  xCodecFree(pPage
35030 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20 70 50  r->pCodec);.  pP
35040 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 70  ager->xCodec = p
35050 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3f 20 30  Pager->memDb ? 0
35060 20 3a 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   : xCodec;.  pPa
35070 67 65 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43  ger->xCodecSizeC
35080 68 6e 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65  hng = xCodecSize
35090 43 68 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Chng;.  pPager->
350a0 78 43 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f  xCodecFree = xCo
350b0 64 65 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65  decFree;.  pPage
350c0 72 2d 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64  r->pCodec = pCod
350d0 65 63 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72  ec;.  pagerRepor
350e0 74 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d  tSize(pPager);.}
350f0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71  .static void *sq
35100 6c 69 74 65 33 50 61 67 65 72 47 65 74 43 6f 64  lite3PagerGetCod
35110 65 63 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ec(Pager *pPager
35120 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
35130 65 72 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65  er->pCodec;.}.#e
35140 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
35150 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
35160 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
35170 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
35180 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
35190 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
351a0 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e   There must be n
351b0 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  o references to 
351c0 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75  the page previou
351d0 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a  sly located at.*
351e0 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65  * pgno (which we
351f0 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68   call pPgOld) th
35200 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20 69  ough that page i
35210 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a  s allowed to be.
35220 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66  ** in cache.  If
35230 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
35240 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20  usly located at 
35250 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
35260 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f  ady.** in the ro
35270 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
35280 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68  it is not put th
35290 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72  ere by by this r
352a0 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
352b0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
352c0 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20  page pPg remain 
352d0 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
352e0 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
352f0 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
35300 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20   pPg (i.e. data 
35310 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
35320 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
35330 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
35340 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
35350 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
35360 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
35370 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
35380 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
35390 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
353a0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
353b0 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
353c0 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
353d0 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
353e0 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
353f0 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
35400 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
35410 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
35420 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
35430 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
35440 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
35450 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
35460 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
35470 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f  .**.** If the fo
35480 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69  urth argument, i
35490 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d  sCommit, is non-
354a0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
354b0 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a  page is being.**
354c0 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f   moved as part o
354d0 66 20 61 20 64 61 74 61 62 61 73 65 20 72 65 6f  f a database reo
354e0 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74  rganization just
354f0 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e   before the tran
35500 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62  saction .** is b
35510 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20  eing committed. 
35520 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 69 74  In this case, it
35530 20 69 73 20 67 75 61 72 61 6e 74 65 65 64 20 74   is guaranteed t
35540 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73 65  hat the database
35550 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65   page .** pPg re
35560 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74  fers to will not
35570 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61   be written to a
35580 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73  gain within this
35590 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
355a0 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
355b0 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c  n may return SQL
355c0 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20  ITE_NOMEM or an 
355d0 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  IO error code if
355e0 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63   an error.** occ
355f0 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  urs. Otherwise, 
35600 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  it returns SQLIT
35610 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
35620 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67  ite3PagerMovepag
35630 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
35640 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67   DbPage *pPg, Pg
35650 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43  no pgno, int isC
35660 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20  ommit){.  PgHdr 
35670 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20  *pPgOld;        
35680 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
35690 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  ge being overwri
356a0 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20  tten. */.  Pgno 
356b0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
356c0 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76  ;       /* Old v
356d0 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e  alue of pPg->pgn
356e0 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20 72 65  o, if sync is re
356f0 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20  quired */.  int 
35700 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
35710 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
35720 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e  rn code */.  Pgn
35730 6f 20 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20  o origPgno;     
35740 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
35750 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e   original page n
35760 75 6d 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65  umber */..  asse
35770 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
35780 29 3b 0a 0a 20 20 2f 2a 20 49 6e 20 6f 72 64 65  );..  /* In orde
35790 72 20 74 6f 20 62 65 20 61 62 6c 65 20 74 6f 20  r to be able to 
357a0 72 6f 6c 6c 62 61 63 6b 2c 20 61 6e 20 69 6e 2d  rollback, an in-
357b0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20  memory database 
357c0 6d 75 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  must journal.  *
357d0 2a 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  * the page we ar
357e0 65 20 6d 6f 76 69 6e 67 20 66 72 6f 6d 2e 0a 20  e moving from.. 
357f0 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
35800 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
35810 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
35820 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  g);.    if( rc )
35830 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
35840 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
35850 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69 73  e being moved is
35860 20 64 69 72 74 79 20 61 6e 64 20 68 61 73 20 6e   dirty and has n
35870 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20 62 79  ot been saved by
35880 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a 2a   the latest.  **
35890 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65 6e   savepoint, then
358a0 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65 6e   save the curren
358b0 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  t contents of th
358c0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
358d0 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e 61  .  ** sub-journa
358e0 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20 72  l now. This is r
358f0 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64 6c  equired to handl
35900 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  e the following 
35910 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a 20  scenario:.  **. 
35920 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a   **   BEGIN;.  *
35930 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70  *     <journal p
35940 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64 69  age X, then modi
35950 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79 3e  fy it in memory>
35960 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50 4f  .  **     SAVEPO
35970 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20 20  INT one;.  **   
35980 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20 58      <Move page X
35990 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e 0a   to location Y>.
359a0 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
359b0 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a 20  K TO one;.  **. 
359c0 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77 65   ** If page X we
359d0 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20 74  re not written t
359e0 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  o the sub-journa
359f0 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c 64  l here, it would
35a00 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f 73   not.  ** be pos
35a10 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72 65  sible to restore
35a20 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77 68   its contents wh
35a30 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b  en the "ROLLBACK
35a40 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73 74   TO one".  ** st
35a50 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69 73 20  atement were is 
35a60 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a 0a  processed..  **.
35a70 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c 50    ** subjournalP
35a80 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64 20 74  age() may need t
35a90 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  o allocate space
35aa0 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e 70   to store pPg->p
35ab0 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f 6e  gno into.  ** on
35ac0 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f  e or more savepo
35ad0 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54 68 69  int bitvecs. Thi
35ae0 73 20 69 73 20 74 68 65 20 72 65 61 73 6f 6e 20  s is the reason 
35af0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20 20  this function.  
35b00 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53 51  ** may return SQ
35b10 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a 2f  LITE_NOMEM..  */
35b20 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61 67  .  if( pPg->flag
35b30 73 26 50 47 48 44 52 5f 44 49 52 54 59 0a 20 20  s&PGHDR_DIRTY.  
35b40 20 26 26 20 73 75 62 6a 52 65 71 75 69 72 65 73   && subjRequires
35b50 50 61 67 65 28 70 50 67 29 0a 20 20 20 26 26 20  Page(pPg).   && 
35b60 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d  SQLITE_OK!=(rc =
35b70 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28   subjournalPage(
35b80 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20 20 72  pPg)).  ){.    r
35b90 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
35ba0 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4d 4f   PAGERTRACE(("MO
35bb0 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
35bc0 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
35bd0 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
35be0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
35bf0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 28  r), pPg->pgno, (
35c00 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
35c10 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30 2c  _NEED_SYNC)?1:0,
35c20 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54 52 41   pgno));.  IOTRA
35c30 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
35c40 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
35c50 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
35c60 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f  ..  /* If the jo
35c70 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62  urnal needs to b
35c80 65 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72  e sync()ed befor
35c90 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f  e page pPg->pgno
35ca0 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77 72 69   can.  ** be wri
35cb0 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65 20 70  tten to, store p
35cc0 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f 63 61  Pg->pgno in loca
35cd0 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65 64 53  l variable needS
35ce0 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a 20 20  yncPgno..  **.  
35cf0 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f 6d 6d  ** If the isComm
35d00 69 74 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  it flag is set, 
35d10 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
35d20 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74 68 61   to remember tha
35d30 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  t.  ** the journ
35d40 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  al needs to be s
35d50 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 64  ync()ed before d
35d60 61 74 61 62 61 73 65 20 70 61 67 65 20 70 50 67  atabase page pPg
35d70 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63 61 6e  ->pgno .  ** can
35d80 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2e 20   be written to. 
35d90 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73 20 61  The caller has a
35da0 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65 64 20  lready promised 
35db0 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20  not to write to 
35dc0 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  it..  */.  if( (
35dd0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
35de0 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26 20 21  _NEED_SYNC) && !
35df0 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20 20 20  isCommit ){.    
35e00 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
35e10 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
35e20 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f 75 72  sert( pageInJour
35e30 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50 67 2d  nal(pPg) || pPg-
35e40 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
35e50 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20 20 20  OrigSize );.    
35e60 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66 6c 61  assert( pPg->fla
35e70 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 29  gs&PGHDR_DIRTY )
35e80 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
35e90 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
35ea0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  ;.  }..  /* If t
35eb0 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
35ec0 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
35ed0 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
35ee0 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
35ef0 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61  rom its hash cha
35f00 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
35f10 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
35f20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
35f30 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
35f40 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
35f50 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
35f60 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
35f70 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
35f80 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
35f90 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66 6c 61  .  */.  pPg->fla
35fa0 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45  gs &= ~PGHDR_NEE
35fb0 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f 6c 64  D_SYNC;.  pPgOld
35fc0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
35fd0 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
35fe0 20 61 73 73 65 72 74 28 20 21 70 50 67 4f 6c 64   assert( !pPgOld
35ff0 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66   || pPgOld->nRef
36000 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70 50 67  ==1 );.  if( pPg
36010 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  Old ){.    pPg->
36020 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f 6c 64  flags |= (pPgOld
36030 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45  ->flags&PGHDR_NE
36040 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20 69 66  ED_SYNC);.    if
36050 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
36060 20 2f 2a 20 44 6f 20 6e 6f 74 20 64 69 73 63 61   /* Do not disca
36070 72 64 20 70 61 67 65 73 20 66 72 6f 6d 20 61 6e  rd pages from an
36080 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
36090 61 73 65 20 73 69 6e 63 65 20 77 65 20 6d 69 67  ase since we mig
360a0 68 74 0a 20 20 20 20 20 20 2a 2a 20 6e 65 65 64  ht.      ** need
360b0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6c 61 74   to rollback lat
360c0 65 72 2e 20 20 4a 75 73 74 20 6d 6f 76 65 20 74  er.  Just move t
360d0 68 65 20 70 61 67 65 20 6f 75 74 20 6f 66 20 74  he page out of t
360e0 68 65 20 77 61 79 2e 20 2a 2f 0a 20 20 20 20 20  he way. */.     
360f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
36100 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a  >dbSizeValid );.
36110 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 63 61        sqlite3Pca
36120 63 68 65 4d 6f 76 65 28 70 50 67 4f 6c 64 2c 20  cheMove(pPgOld, 
36130 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 31  pPager->dbSize+1
36140 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
36150 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
36160 65 44 72 6f 70 28 70 50 67 4f 6c 64 29 3b 0a 20  eDrop(pPgOld);. 
36170 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 6f 72 69 67     }.  }..  orig
36180 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
36190 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
361a0 65 4d 6f 76 65 28 70 50 67 2c 20 70 67 6e 6f 29  eMove(pPg, pgno)
361b0 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68  ;.  sqlite3Pcach
361c0 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b  eMakeDirty(pPg);
361d0 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64  .  pPager->dbMod
361e0 69 66 69 65 64 20 3d 20 31 3b 0a 0a 20 20 69 66  ified = 1;..  if
361f0 28 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29  ( needSyncPgno )
36200 7b 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64  {.    /* If need
36210 53 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d  SyncPgno is non-
36220 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a  zero, then the j
36230 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64  ournal file need
36240 73 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20  s to be .    ** 
36250 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20  sync()ed before 
36260 61 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74  any data is writ
36270 74 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20  ten to database 
36280 66 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79  file page needSy
36290 6e 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43  ncPgno..    ** C
362a0 75 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63  urrently, no suc
362b0 68 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e  h page exists in
362c0 20 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20   the page-cache 
362d0 61 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20  and the .    ** 
362e0 22 69 73 20 6a 6f 75 72 6e 61 6c 65 64 22 20 62  "is journaled" b
362f0 69 74 76 65 63 20 66 6c 61 67 20 68 61 73 20 62  itvec flag has b
36300 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
36310 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
36320 65 64 20 62 79 0a 20 20 20 20 2a 2a 20 6c 6f 61  ed by.    ** loa
36330 64 69 6e 67 20 74 68 65 20 70 61 67 65 20 69 6e  ding the page in
36340 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
36350 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
36360 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
36370 63 20 0a 20 20 20 20 2a 2a 20 66 6c 61 67 2e 0a  c .    ** flag..
36380 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66      **.    ** If
36390 20 74 68 65 20 61 74 74 65 6d 70 74 20 74 6f 20   the attempt to 
363a0 6c 6f 61 64 20 74 68 65 20 70 61 67 65 20 69 6e  load the page in
363b0 74 6f 20 74 68 65 20 70 61 67 65 2d 63 61 63 68  to the page-cach
363c0 65 20 66 61 69 6c 73 2c 20 28 64 75 65 0a 20 20  e fails, (due.  
363d0 20 20 2a 2a 20 74 6f 20 61 20 6d 61 6c 6c 6f 63    ** to a malloc
363e0 28 29 20 6f 72 20 49 4f 20 66 61 69 6c 75 72 65  () or IO failure
363f0 29 2c 20 63 6c 65 61 72 20 74 68 65 20 62 69 74  ), clear the bit
36400 20 69 6e 20 74 68 65 20 70 49 6e 4a 6f 75 72 6e   in the pInJourn
36410 61 6c 5b 5d 0a 20 20 20 20 2a 2a 20 61 72 72 61  al[].    ** arra
36420 79 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  y. Otherwise, if
36430 20 74 68 65 20 70 61 67 65 20 69 73 20 6c 6f 61   the page is loa
36440 64 65 64 20 61 6e 64 20 77 72 69 74 74 65 6e 20  ded and written 
36450 61 67 61 69 6e 20 69 6e 0a 20 20 20 20 2a 2a 20  again in.    ** 
36460 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
36470 2c 20 69 74 20 6d 61 79 20 62 65 20 77 72 69 74  , it may be writ
36480 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
36490 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 0a  ase file before.
364a0 20 20 20 20 2a 2a 20 69 74 20 69 73 20 73 79 6e      ** it is syn
364b0 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ced into the jou
364c0 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
364d0 77 61 79 2c 20 69 74 20 6d 61 79 20 65 6e 64 20  way, it may end 
364e0 75 70 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 65  up in.    ** the
364f0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 77   journal file tw
36500 69 63 65 2c 20 62 75 74 20 74 68 61 74 20 69 73  ice, but that is
36510 20 6e 6f 74 20 61 20 70 72 6f 62 6c 65 6d 2e 0a   not a problem..
36520 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
36530 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
36540 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75  t() call may cau
36550 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  se the journal t
36560 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a  o sync. So make.
36570 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20      ** sure the 
36580 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
36590 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a  lag is set too..
365a0 20 20 20 20 2a 2f 0a 20 20 20 20 50 67 48 64 72      */.    PgHdr
365b0 20 2a 70 50 67 48 64 72 3b 0a 20 20 20 20 61 73   *pPgHdr;.    as
365c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
365d0 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
365e0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
365f0 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53  et(pPager, needS
36600 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67 48 64 72  yncPgno, &pPgHdr
36610 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
36620 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
36630 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50 67    if( needSyncPg
36640 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72  no<=pPager->dbOr
36650 69 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  igSize ){.      
36660 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
36670 2d 3e 70 54 6d 70 53 70 61 63 65 21 3d 30 20 29  ->pTmpSpace!=0 )
36680 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
36690 33 42 69 74 76 65 63 43 6c 65 61 72 28 70 50 61  3BitvecClear(pPa
366a0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
366b0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 70   needSyncPgno, p
366c0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
366d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
366e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
366f0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
36700 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
36710 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
36720 6e 6f 53 79 6e 63 3d 3d 30 20 26 26 20 21 4d 45  noSync==0 && !ME
36730 4d 44 42 20 29 3b 0a 20 20 20 20 70 50 67 48 64  MDB );.    pPgHd
36740 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44  r->flags |= PGHD
36750 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20  R_NEED_SYNC;.   
36760 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4d 61   sqlite3PcacheMa
36770 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29 3b  keDirty(pPgHdr);
36780 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
36790 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a  rUnref(pPgHdr);.
367a0 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46    }..  /*.  ** F
367b0 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
367c0 64 61 74 61 62 61 73 65 2c 20 6d 61 6b 65 20 73  database, make s
367d0 75 72 65 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ure the original
367e0 20 70 61 67 65 20 63 6f 6e 74 69 6e 75 65 73 0a   page continues.
367f0 20 20 2a 2a 20 74 6f 20 65 78 69 73 74 2c 20 69    ** to exist, i
36800 6e 20 63 61 73 65 20 74 68 65 20 74 72 61 6e 73  n case the trans
36810 61 63 74 69 6f 6e 20 6e 65 65 64 73 20 74 6f 20  action needs to 
36820 72 6f 6c 6c 20 62 61 63 6b 2e 20 20 55 73 65 20  roll back.  Use 
36830 70 50 67 4f 6c 64 0a 20 20 2a 2a 20 61 73 20 74  pPgOld.  ** as t
36840 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
36850 20 73 69 6e 63 65 20 69 74 20 68 61 73 20 61 6c   since it has al
36860 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
36870 61 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ated..  */.  if(
36880 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71   MEMDB ){.    sq
36890 6c 69 74 65 33 50 63 61 63 68 65 4d 6f 76 65 28  lite3PcacheMove(
368a0 70 50 67 4f 6c 64 2c 20 6f 72 69 67 50 67 6e 6f  pPgOld, origPgno
368b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61  );.    sqlite3Pa
368c0 67 65 72 55 6e 72 65 66 28 70 50 67 4f 6c 64 29  gerUnref(pPgOld)
368d0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
368e0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e  SQLITE_OK;.}.#en
368f0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
36900 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
36910 68 65 20 64 61 74 61 20 66 6f 72 20 74 68 65 20  he data for the 
36920 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a  specified page..
36930 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33  */.void *sqlite3
36940 50 61 67 65 72 47 65 74 44 61 74 61 28 44 62 50  PagerGetData(DbP
36950 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61 73 73  age *pPg){.  ass
36960 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
36970 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d   || pPg->pPager-
36980 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65 74 75  >memDb );.  retu
36990 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d  rn pPg->pData;.}
369a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
369b0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
369c0 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74  Pager.nExtra byt
369d0 65 73 20 6f 66 20 22 65 78 74 72 61 22 20 73 70  es of "extra" sp
369e0 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ace .** allocate
369f0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
36a00 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65 2e   specified page.
36a10 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
36a20 33 50 61 67 65 72 47 65 74 45 78 74 72 61 28 44  3PagerGetExtra(D
36a30 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
36a40 65 74 75 72 6e 20 70 50 67 2d 3e 70 45 78 74 72  eturn pPg->pExtr
36a50 61 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  a;.}../*.** Get/
36a60 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  set the locking-
36a70 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
36a80 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
36a90 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
36aa0 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43  .** of PAGER_LOC
36ab0 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20  KINGMODE_QUERY, 
36ac0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
36ad0 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20  E_NORMAL or .** 
36ae0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
36af0 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20  E_EXCLUSIVE. If 
36b00 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
36b10 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
36b20 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n.** the locking
36b30 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
36b40 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
36b50 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
36b60 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
36b70 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f   either PAGER_LO
36b80 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
36b90 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43   or.** PAGER_LOC
36ba0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
36bb0 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  VE, indicating t
36bc0 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
36bd0 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
36be0 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a   locking-mode..*
36bf0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
36c00 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61  erLockingMode(Pa
36c10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
36c20 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72   eMode){.  asser
36c30 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
36c40 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
36c50 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y.            ||
36c60 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
36c70 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
36c80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
36c90 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
36ca0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
36cb0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
36cc0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
36cd0 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61  E_QUERY<0 );.  a
36ce0 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
36cf0 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e  KINGMODE_NORMAL>
36d00 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b  =0 && PAGER_LOCK
36d10 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
36d20 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d  E>=0 );.  if( eM
36d30 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65  ode>=0 && !pPage
36d40 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
36d50 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
36d60 73 69 76 65 4d 6f 64 65 20 3d 20 28 75 38 29 65  siveMode = (u8)e
36d70 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Mode;.  }.  retu
36d80 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e  rn (int)pPager->
36d90 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 3b 0a 7d  exclusiveMode;.}
36da0 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
36db0 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
36dc0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
36dd0 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
36de0 20 6d 75 73 74 20 62 65 20 6f 6e 65 20 6f 66 3a   must be one of:
36df0 0a 2a 2a 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f  .**.**    PAGER_
36e00 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
36e10 59 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  Y.**    PAGER_JO
36e20 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
36e30 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55  .**    PAGER_JOU
36e40 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
36e50 45 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  E.**    PAGER_JO
36e60 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
36e70 54 0a 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f  T.**    PAGER_JO
36e80 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a  URNALMODE_OFF.**
36e90 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
36ea0 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 20  LMODE_MEMORY.** 
36eb0 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
36ec0 4d 4f 44 45 5f 57 41 4c 0a 2a 2a 0a 2a 2a 20 49  MODE_WAL.**.** I
36ed0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
36ee0 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
36ef0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 5f  hen the journal_
36f00 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
36f10 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63  he.** value spec
36f20 69 66 69 65 64 20 69 66 20 74 68 65 20 63 68 61  ified if the cha
36f30 6e 67 65 20 69 73 20 61 6c 6c 6f 77 65 64 2e 20  nge is allowed. 
36f40 54 68 65 20 63 68 61 6e 67 65 20 6d 61 79 20 62  The change may b
36f50 65 20 64 69 73 61 6c 6c 6f 77 65 64 0a 2a 2a 20  e disallowed.** 
36f60 66 6f 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  for the followin
36f70 67 20 72 65 61 73 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  g reasons:.**.**
36f80 20 20 20 2a 20 20 41 6e 20 69 6e 2d 6d 65 6d 6f     *  An in-memo
36f90 72 79 20 64 61 74 61 62 61 73 65 20 63 61 6e 20  ry database can 
36fa0 6f 6e 6c 79 20 68 61 76 65 20 69 74 73 20 6a 6f  only have its jo
36fb0 75 72 6e 61 6c 5f 6d 6f 64 65 20 73 65 74 20 74  urnal_mode set t
36fc0 6f 20 5f 4f 46 46 0a 2a 2a 20 20 20 20 20 20 6f  o _OFF.**      o
36fd0 72 20 5f 4d 45 4d 4f 52 59 2e 0a 2a 2a 0a 2a 2a  r _MEMORY..**.**
36fe0 20 20 20 2a 20 20 54 68 65 20 6a 6f 75 72 6e 61     *  The journa
36ff0 6c 20 6d 6f 64 65 20 6d 61 79 20 6e 6f 74 20 62  l mode may not b
37000 65 20 63 68 61 6e 67 65 64 20 77 68 69 6c 65 20  e changed while 
37010 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
37020 20 61 63 74 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54   active..**.** T
37030 68 65 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69  he returned indi
37040 63 61 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  cate the current
37050 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74   (possibly updat
37060 65 64 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  ed) journal-mode
37070 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
37080 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65  PagerJournalMode
37090 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
370a0 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73  int eMode){.  as
370b0 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
370c0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
370d0 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
370e0 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
370f0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
37100 45 54 45 0a 20 20 20 20 20 20 20 20 20 20 20 20  ETE.            
37110 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
37120 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
37130 43 41 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  CATE.           
37140 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
37150 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
37160 53 49 53 54 0a 20 20 20 20 20 20 20 20 20 20 20  SIST.           
37170 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
37180 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
37190 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
371a0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
371b0 55 52 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20  URNALMODE_WAL . 
371c0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
371d0 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
371e0 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b  ALMODE_MEMORY );
371f0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
37200 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
37210 52 59 3c 30 20 29 3b 0a 0a 20 20 69 66 28 20 65  RY<0 );..  if( e
37220 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
37230 4e 41 4c 4d 4f 44 45 5f 57 41 4c 20 0a 20 20 20  NALMODE_WAL .   
37240 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
37250 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
37260 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
37270 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  .  ){.    pPager
37280 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
37290 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
372a0 45 5f 57 41 4c 3b 0a 20 20 7d 65 6c 73 65 20 69  E_WAL;.  }else i
372b0 66 28 20 65 4d 6f 64 65 3e 3d 30 0a 20 20 20 26  f( eMode>=0.   &
372c0 26 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & (pPager->tempF
372d0 69 6c 65 3d 3d 30 20 7c 7c 20 65 4d 6f 64 65 21  ile==0 || eMode!
372e0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
372f0 44 45 5f 57 41 4c 29 0a 20 20 20 26 26 20 28 21  DE_WAL).   && (!
37300 4d 45 4d 44 42 20 7c 7c 20 65 4d 6f 64 65 3d 3d  MEMDB || eMode==
37310 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
37320 45 5f 4d 45 4d 4f 52 59 7c 7c 65 4d 6f 64 65 3d  E_MEMORY||eMode=
37330 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
37340 44 45 5f 4f 46 46 29 0a 20 20 20 26 26 20 21 70  DE_OFF).   && !p
37350 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
37360 64 0a 20 20 20 26 26 20 28 21 69 73 4f 70 65 6e  d.   && (!isOpen
37370 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c  (pPager->jfd) ||
37380 20 30 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72   0==pPager->jour
37390 6e 61 6c 4f 66 66 29 0a 20 20 29 7b 0a 20 20 20  nalOff).  ){.   
373a0 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67   if( isOpen(pPag
373b0 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20  er->jfd) ){.    
373c0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
373d0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
373e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
373f0 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d   (PAGER_JOURNALM
37400 4f 44 45 5f 54 52 55 4e 43 41 54 45 20 26 20 31  ODE_TRUNCATE & 1
37410 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73 73 65  )==1 );.    asse
37420 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55 52 4e  rt( (PAGER_JOURN
37430 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 20 26  ALMODE_PERSIST &
37440 20 31 29 3d 3d 31 20 29 3b 0a 20 20 20 20 61 73   1)==1 );.    as
37450 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f 55  sert( (PAGER_JOU
37460 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20  RNALMODE_DELETE 
37470 26 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 61  & 1)==0 );.    a
37480 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a 4f  ssert( (PAGER_JO
37490 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59  URNALMODE_MEMORY
374a0 20 26 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20   & 1)==0 );.    
374b0 61 73 73 65 72 74 28 20 28 50 41 47 45 52 5f 4a  assert( (PAGER_J
374c0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 26  OURNALMODE_OFF &
374d0 20 31 29 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66   1)==0 );.    if
374e0 28 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( (pPager->journ
374f0 61 6c 4d 6f 64 65 20 26 20 31 29 3d 3d 31 20 26  alMode & 1)==1 &
37500 26 20 28 65 4d 6f 64 65 20 26 20 31 29 3d 3d 30  & (eMode & 1)==0
37510 0a 20 20 20 20 20 20 20 20 20 26 26 20 21 70 50  .         && !pP
37520 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
37530 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ode ){.      sql
37540 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
37550 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
37560 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
37570 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61 67  .    }..    pPag
37580 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20  er->journalMode 
37590 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
375a0 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
375b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
375c0 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74  de;.}../*.** Get
375d0 2f 73 65 74 20 74 68 65 20 73 69 7a 65 2d 6c 69  /set the size-li
375e0 6d 69 74 20 75 73 65 64 20 66 6f 72 20 70 65 72  mit used for per
375f0 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  sistent journal 
37600 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 74  files..**.** Set
37610 74 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6c 69  ting the size li
37620 6d 69 74 20 74 6f 20 2d 31 20 6d 65 61 6e 73 20  mit to -1 means 
37630 6e 6f 20 6c 69 6d 69 74 20 69 73 20 65 6e 66 6f  no limit is enfo
37640 72 63 65 64 2e 0a 2a 2a 20 41 6e 20 61 74 74 65  rced..** An atte
37650 6d 70 74 20 74 6f 20 73 65 74 20 61 20 6c 69 6d  mpt to set a lim
37660 69 74 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20  it smaller than 
37670 2d 31 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  -1 is a no-op..*
37680 2f 0a 69 36 34 20 73 71 6c 69 74 65 33 50 61 67  /.i64 sqlite3Pag
37690 65 72 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  erJournalSizeLim
376a0 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
376b0 2c 20 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20  , i64 iLimit){. 
376c0 20 69 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20   if( iLimit>=-1 
376d0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
376e0 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20  ournalSizeLimit 
376f0 3d 20 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20  = iLimit;.  }.  
37700 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a  return pPager->j
37710 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b  ournalSizeLimit;
37720 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
37730 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
37740 65 20 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75  e pPager->pBacku
37750 70 20 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20  p variable. The 
37760 62 61 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a  backup module.**
37770 20 69 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69   in backup.c mai
37780 6e 74 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65  ntains the conte
37790 6e 74 20 6f 66 20 74 68 69 73 20 76 61 72 69 61  nt of this varia
377a0 62 6c 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65  ble. This module
377b0 0a 2a 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71  .** uses it opaq
377c0 75 65 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d  uely as an argum
377d0 65 6e 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61  ent to sqlite3Ba
377e0 63 6b 75 70 52 65 73 74 61 72 74 28 29 20 61 6e  ckupRestart() an
377f0 64 0a 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b  d.** sqlite3Back
37800 75 70 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e  upUpdate() only.
37810 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b  .*/.sqlite3_back
37820 75 70 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65  up **sqlite3Page
37830 72 42 61 63 6b 75 70 50 74 72 28 50 61 67 65 72  rBackupPtr(Pager
37840 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
37850 75 72 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61  urn &pPager->pBa
37860 63 6b 75 70 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  ckup;.}..#ifndef
37870 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 41 4c   SQLITE_OMIT_WAL
37880 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
37890 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 77  tion is called w
378a0 68 65 6e 20 74 68 65 20 75 73 65 72 20 69 6e 76  hen the user inv
378b0 6f 6b 65 73 20 22 50 52 41 47 4d 41 20 63 68 65  okes "PRAGMA che
378c0 63 6b 70 6f 69 6e 74 22 2e 0a 2a 2f 0a 69 6e 74  ckpoint"..*/.int
378d0 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 68 65   sqlite3PagerChe
378e0 63 6b 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70  ckpoint(Pager *p
378f0 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
37900 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
37910 69 66 28 20 70 50 61 67 65 72 2d 3e 70 57 61 6c  if( pPager->pWal
37920 20 29 7b 0a 20 20 20 20 75 38 20 2a 7a 42 75 66   ){.    u8 *zBuf
37930 20 3d 20 28 75 38 20 2a 29 70 50 61 67 65 72 2d   = (u8 *)pPager-
37940 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20  >pTmpSpace;.    
37950 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 43  rc = sqlite3WalC
37960 68 65 63 6b 70 6f 69 6e 74 28 70 50 61 67 65 72  heckpoint(pPager
37970 2d 3e 70 57 61 6c 2c 0a 20 20 20 20 20 20 20 20  ->pWal,.        
37980 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  (pPager->noSync 
37990 3f 20 30 20 3a 20 70 50 61 67 65 72 2d 3e 73 79  ? 0 : pPager->sy
379a0 6e 63 5f 66 6c 61 67 73 29 2c 0a 20 20 20 20 20  nc_flags),.     
379b0 20 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53     pPager->pageS
379c0 69 7a 65 2c 20 7a 42 75 66 0a 20 20 20 20 29 3b  ize, zBuf.    );
379d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
379e0 3b 0a 7d 0a 0a 69 6e 74 20 73 71 6c 69 74 65 33  ;.}..int sqlite3
379f0 50 61 67 65 72 57 61 6c 43 61 6c 6c 62 61 63 6b  PagerWalCallback
37a00 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
37a10 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
37a20 33 57 61 6c 43 61 6c 6c 62 61 63 6b 28 70 50 61  3WalCallback(pPa
37a30 67 65 72 2d 3e 70 57 61 6c 29 3b 0a 7d 0a 0a 2f  ger->pWal);.}../
37a40 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
37a50 20 69 66 20 74 68 65 20 75 6e 64 65 72 6c 79 69   if the underlyi
37a60 6e 67 20 56 46 53 20 66 6f 72 20 74 68 65 20 67  ng VFS for the g
37a70 69 76 65 6e 20 70 61 67 65 72 20 73 75 70 70 6f  iven pager suppo
37a80 72 74 73 20 74 68 65 0a 2a 2a 20 70 72 69 6d 69  rts the.** primi
37a90 74 69 76 65 73 20 6e 65 63 65 73 73 61 72 79 20  tives necessary 
37aa0 66 6f 72 20 77 72 69 74 65 2d 61 68 65 61 64 20  for write-ahead 
37ab0 6c 6f 67 67 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  logging..*/.int 
37ac0 73 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c 53  sqlite3PagerWalS
37ad0 75 70 70 6f 72 74 65 64 28 50 61 67 65 72 20 2a  upported(Pager *
37ae0 70 50 61 67 65 72 29 7b 0a 20 20 63 6f 6e 73 74  pPager){.  const
37af0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 6d 65 74 68   sqlite3_io_meth
37b00 6f 64 73 20 2a 70 4d 65 74 68 6f 64 73 20 3d 20  ods *pMethods = 
37b10 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
37b20 68 6f 64 73 3b 0a 20 20 72 65 74 75 72 6e 20 70  hods;.  return p
37b30 4d 65 74 68 6f 64 73 2d 3e 69 56 65 72 73 69 6f  Methods->iVersio
37b40 6e 3e 3d 32 20 26 26 20 70 4d 65 74 68 6f 64 73  n>=2 && pMethods
37b50 2d 3e 78 53 68 6d 4f 70 65 6e 21 3d 30 3b 0a 7d  ->xShmOpen!=0;.}
37b60 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 63  ../*.** Open a c
37b70 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65  onnection to the
37b80 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
37b90 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
37ba0 70 50 61 67 65 72 2e 20 49 66 0a 2a 2a 20 74 68  pPager. If.** th
37bb0 65 20 6c 6f 67 20 63 6f 6e 6e 65 63 74 69 6f 6e  e log connection
37bc0 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
37bd0 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  , this function 
37be0 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
37bf0 2a 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75 73  * The caller mus
37c00 74 20 62 65 20 68 6f 6c 64 69 6e 67 20 61 20 53  t be holding a S
37c10 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
37c20 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
37c30 74 6f 20 63 61 6c 6c 0a 2a 2a 20 74 68 69 73 20  to call.** this 
37c40 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  function..*/.int
37c50 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65   sqlite3PagerOpe
37c60 6e 57 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  nWal(Pager *pPag
37c70 65 72 2c 20 69 6e 74 20 2a 70 69 73 4f 70 65 6e  er, int *pisOpen
37c80 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
37c90 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
37ca0 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
37cb0 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ode */..  assert
37cc0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
37cd0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
37ce0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
37cf0 70 57 61 6c 20 29 7b 0a 20 20 20 20 69 66 28 20  pWal ){.    if( 
37d00 21 73 71 6c 69 74 65 33 50 61 67 65 72 57 61 6c  !sqlite3PagerWal
37d10 53 75 70 70 6f 72 74 65 64 28 70 50 61 67 65 72  Supported(pPager
37d20 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
37d30 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 0a 20 20 20  E_CANTOPEN;..   
37d40 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 63 6f 6e   /* Open the con
37d50 6e 65 63 74 69 6f 6e 20 74 6f 20 74 68 65 20 6c  nection to the l
37d60 6f 67 20 66 69 6c 65 2e 20 49 66 20 74 68 69 73  og file. If this
37d70 20 6f 70 65 72 61 74 69 6f 6e 20 66 61 69 6c 73   operation fails
37d80 2c 20 0a 20 20 20 20 2a 2a 20 28 65 2e 67 2e 20  , .    ** (e.g. 
37d90 64 75 65 20 74 6f 20 6d 61 6c 6c 6f 63 28 29 20  due to malloc() 
37da0 66 61 69 6c 75 72 65 29 2c 20 75 6e 6c 6f 63 6b  failure), unlock
37db0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
37dc0 6c 65 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20 72  le and .    ** r
37dd0 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
37de0 6f 64 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ode..    */.    
37df0 72 63 20 3d 20 73 71 6c 69 74 65 33 57 61 6c 4f  rc = sqlite3WalO
37e00 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
37e10 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20  , pPager->fd,.  
37e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37e30 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
37e40 69 6c 65 6e 61 6d 65 2c 20 26 70 50 61 67 65 72  ilename, &pPager
37e50 2d 3e 70 57 61 6c 29 3b 0a 20 20 20 20 69 66 28  ->pWal);.    if(
37e60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
37e70 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
37e80 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41  journalMode = PA
37e90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
37ea0 57 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  WAL;.    }.  }el
37eb0 73 65 7b 0a 20 20 20 20 2a 70 69 73 4f 70 65 6e  se{.    *pisOpen
37ec0 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 1;.  }..  ret
37ed0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
37ee0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
37ef0 73 20 63 61 6c 6c 65 64 20 74 6f 20 63 6c 6f 73  s called to clos
37f00 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  e the connection
37f10 20 74 6f 20 74 68 65 20 6c 6f 67 20 66 69 6c 65   to the log file
37f20 20 70 72 69 6f 72 0a 2a 2a 20 74 6f 20 73 77 69   prior.** to swi
37f30 74 63 68 69 6e 67 20 66 72 6f 6d 20 57 41 4c 20  tching from WAL 
37f40 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f 64 65  to rollback mode
37f50 2e 0a 2a 2a 0a 2a 2a 20 42 65 66 6f 72 65 20 63  ..**.** Before c
37f60 6c 6f 73 69 6e 67 20 74 68 65 20 6c 6f 67 20 66  losing the log f
37f70 69 6c 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ile, this functi
37f80 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20 74  on attempts to t
37f90 61 6b 65 20 61 6e 20 0a 2a 2a 20 45 58 43 4c 55  ake an .** EXCLU
37fa0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
37fb0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
37fc0 49 66 20 74 68 69 73 20 63 61 6e 6e 6f 74 20 62  If this cannot b
37fd0 65 20 6f 62 74 61 69 6e 65 64 2c 20 61 6e 0a 2a  e obtained, an.*
37fe0 2a 20 65 72 72 6f 72 20 28 53 51 4c 49 54 45 5f  * error (SQLITE_
37ff0 42 55 53 59 29 20 69 73 20 72 65 74 75 72 6e 65  BUSY) is returne
38000 64 20 61 6e 64 20 74 68 65 20 6c 6f 67 20 63 6f  d and the log co
38010 6e 6e 65 63 74 69 6f 6e 20 69 73 20 6e 6f 74 20  nnection is not 
38020 63 6c 6f 73 65 64 2e 0a 2a 2a 20 49 66 20 73 75  closed..** If su
38030 63 63 65 73 73 66 75 6c 2c 20 74 68 65 20 45 58  ccessful, the EX
38040 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
38050 6e 6f 74 20 72 65 6c 65 61 73 65 64 20 62 65 66  not released bef
38060 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a  ore returning..*
38070 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
38080 65 72 43 6c 6f 73 65 57 61 6c 28 50 61 67 65 72  erCloseWal(Pager
38090 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
380a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
380b0 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
380c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
380d0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
380e0 44 45 5f 57 41 4c 20 29 3b 0a 0a 20 20 2f 2a 20  DE_WAL );..  /* 
380f0 49 66 20 74 68 65 20 6c 6f 67 20 66 69 6c 65 20  If the log file 
38100 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
38110 70 65 6e 2c 20 62 75 74 20 64 6f 65 73 20 65 78  pen, but does ex
38120 69 73 74 20 69 6e 20 74 68 65 20 66 69 6c 65 2d  ist in the file-
38130 73 79 73 74 65 6d 2c 0a 20 20 2a 2a 20 69 74 20  system,.  ** it 
38140 6d 61 79 20 6e 65 65 64 20 74 6f 20 62 65 20 63  may need to be c
38150 68 65 63 6b 70 6f 69 6e 74 65 64 20 62 65 66 6f  heckpointed befo
38160 72 65 20 74 68 65 20 63 6f 6e 6e 65 63 74 69 6f  re the connectio
38170 6e 20 63 61 6e 20 73 77 69 74 63 68 20 74 6f 0a  n can switch to.
38180 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6d 6f    ** rollback mo
38190 64 65 2e 20 4f 70 65 6e 20 69 74 20 6e 6f 77 20  de. Open it now 
381a0 73 6f 20 74 68 69 73 20 63 61 6e 20 68 61 70 70  so this can happ
381b0 65 6e 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  en..  */.  if( !
381c0 70 50 61 67 65 72 2d 3e 70 57 61 6c 20 29 7b 0a  pPager->pWal ){.
381d0 20 20 20 20 69 6e 74 20 6c 6f 67 65 78 69 73 74      int logexist
381e0 73 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  s = 0;.    rc = 
381f0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
38200 61 67 65 72 2d 3e 66 64 2c 20 53 51 4c 49 54 45  ager->fd, SQLITE
38210 5f 4c 4f 43 4b 5f 53 48 41 52 45 44 29 3b 0a 20  _LOCK_SHARED);. 
38220 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
38230 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
38240 20 3d 20 70 61 67 65 72 48 61 73 57 41 4c 28 70   = pagerHasWAL(p
38250 50 61 67 65 72 2c 20 26 6c 6f 67 65 78 69 73 74  Pager, &logexist
38260 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  s);.    }.    if
38270 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
38280 26 26 20 6c 6f 67 65 78 69 73 74 73 20 29 7b 0a  && logexists ){.
38290 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
382a0 65 33 57 61 6c 4f 70 65 6e 28 70 50 61 67 65 72  e3WalOpen(pPager
382b0 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
382c0 66 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  fd,.            
382d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
382e0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
382f0 20 26 70 50 61 67 65 72 2d 3e 70 57 61 6c 29 3b   &pPager->pWal);
38300 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 20 20 0a  .    }.  }.    .
38310 20 20 2f 2a 20 43 68 65 63 6b 70 6f 69 6e 74 20    /* Checkpoint 
38320 61 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 6c 6f  and close the lo
38330 67 2e 20 42 65 63 61 75 73 65 20 61 6e 20 45 58  g. Because an EX
38340 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 69 73 20  CLUSIVE lock is 
38350 68 65 6c 64 20 6f 6e 0a 20 20 2a 2a 20 74 68 65  held on.  ** the
38360 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
38370 74 68 65 20 6c 6f 67 20 61 6e 64 20 6c 6f 67 2d  the log and log-
38380 73 75 6d 6d 61 72 79 20 66 69 6c 65 73 20 77 69  summary files wi
38390 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 20  ll be deleted.. 
383a0 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
383b0 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65  LITE_OK && pPage
383c0 72 2d 3e 70 57 61 6c 20 29 7b 0a 20 20 20 20 72  r->pWal ){.    r
383d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
383e0 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 51  k(pPager->fd, SQ
383f0 4c 49 54 45 5f 4c 4f 43 4b 5f 45 58 43 4c 55 53  LITE_LOCK_EXCLUS
38400 49 56 45 29 3b 0a 20 20 20 20 69 66 28 20 72 63  IVE);.    if( rc
38410 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
38420 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
38430 33 57 61 6c 43 6c 6f 73 65 28 70 50 61 67 65 72  3WalClose(pPager
38440 2d 3e 70 57 61 6c 2c 0a 20 20 20 20 20 20 20 20  ->pWal,.        
38450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38460 20 20 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79     (pPager->noSy
38470 6e 63 20 3f 20 30 20 3a 20 70 50 61 67 65 72 2d  nc ? 0 : pPager-
38480 3e 73 79 6e 63 5f 66 6c 61 67 73 29 2c 20 0a 20  >sync_flags), . 
38490 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
384a0 61 67 65 53 69 7a 65 2c 20 28 75 38 2a 29 70 50  ageSize, (u8*)pP
384b0 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 0a  ager->pTmpSpace.
384c0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 70        );.      p
384d0 50 61 67 65 72 2d 3e 70 57 61 6c 20 3d 20 30 3b  Pager->pWal = 0;
384e0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
384f0 20 20 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f    /* If we canno
38500 74 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  t get an EXCLUSI
38510 56 45 20 6c 6f 63 6b 2c 20 64 6f 77 6e 67 72 61  VE lock, downgra
38520 64 65 20 74 68 65 20 50 45 4e 44 49 4e 47 20 6c  de the PENDING l
38530 6f 63 6b 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ock.      ** tha
38540 74 20 77 65 20 64 69 64 20 67 65 74 20 62 61 63  t we did get bac
38550 6b 20 74 6f 20 53 48 41 52 45 44 2e 20 2a 2f 0a  k to SHARED. */.
38560 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55        sqlite3OsU
38570 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  nlock(pPager->fd
38580 2c 20 53 51 4c 49 54 45 5f 4c 4f 43 4b 5f 53 48  , SQLITE_LOCK_SH
38590 41 52 45 44 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ARED);.    }.  }
385a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
385b0 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f  #endif..#endif /
385c0 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49  * SQLITE_OMIT_DI
385d0 53 4b 49 4f 20 2a 2f 0a                          SKIO */.