/ Hex Artifact Content
Login

Artifact 507655773b384471fc05addcdcff4df100afb43b:


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 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 35 39  : pager.c,v 1.59
0350: 38 20 32 30 30 39 2f 30 36 2f 31 39 20 31 37 3a  8 2009/06/19 17:
0360: 35 30 3a 30 32 20 64 61 6e 69 65 6c 6b 31 39 37  50:02 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 66 6e 64  7 Exp $.*/.#ifnd
0380: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  ef SQLITE_OMIT_D
0390: 49 53 4b 49 4f 0a 23 69 6e 63 6c 75 64 65 20 22  ISKIO.#include "
03a0: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
03b0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03c0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03d0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
03e0: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 69 6e   off.*/.#if 0.in
03f0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  t sqlite3PagerTr
0400: 61 63 65 3d 31 3b 20 20 2f 2a 20 54 72 75 65 20  ace=1;  /* True 
0410: 74 6f 20 65 6e 61 62 6c 65 20 74 72 61 63 69 6e  to enable tracin
0420: 67 20 2a 2f 0a 23 64 65 66 69 6e 65 20 73 71 6c  g */.#define sql
0430: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 20  ite3DebugPrintf 
0440: 70 72 69 6e 74 66 0a 23 64 65 66 69 6e 65 20 50  printf.#define P
0450: 41 47 45 52 54 52 41 43 45 28 58 29 20 20 20 20  AGERTRACE(X)    
0460: 20 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65   if( sqlite3Page
0470: 72 54 72 61 63 65 20 29 7b 20 73 71 6c 69 74 65  rTrace ){ sqlite
0480: 33 44 65 62 75 67 50 72 69 6e 74 66 20 58 3b 20  3DebugPrintf X; 
0490: 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  }.#else.#define 
04a0: 50 41 47 45 52 54 52 41 43 45 28 58 29 0a 23 65  PAGERTRACE(X).#e
04b0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
04c0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
04d0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
04e0: 74 68 69 6e 20 74 68 65 20 50 41 47 45 52 54 52  thin the PAGERTR
04f0: 41 43 45 28 29 20 6d 61 63 72 6f 73 20 61 62 6f  ACE() macros abo
0500: 76 65 0a 2a 2a 20 74 6f 20 70 72 69 6e 74 20 6f  ve.** to print o
0510: 75 74 20 66 69 6c 65 2d 64 65 73 63 72 69 70 74  ut file-descript
0520: 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a 20 50 41 47 45  ors. .**.** PAGE
0530: 52 49 44 28 29 20 74 61 6b 65 73 20 61 20 70 6f  RID() takes a po
0540: 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
0550: 20 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61   struct as its a
0560: 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a 2a 2a 20  rgument. The.** 
0570: 61 73 73 6f 63 69 61 74 65 64 20 66 69 6c 65 2d  associated file-
0580: 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 72 65  descriptor is re
0590: 74 75 72 6e 65 64 2e 20 46 49 4c 45 48 41 4e 44  turned. FILEHAND
05a0: 4c 45 49 44 28 29 20 74 61 6b 65 73 20 61 6e 20  LEID() takes an 
05b0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 0a 2a 2a 20  sqlite3_file.** 
05c0: 73 74 72 75 63 74 20 61 73 20 69 74 73 20 61 72  struct as its ar
05d0: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 64 65 66 69  gument..*/.#defi
05e0: 6e 65 20 50 41 47 45 52 49 44 28 70 29 20 28 28  ne PAGERID(p) ((
05f0: 69 6e 74 29 28 70 2d 3e 66 64 29 29 0a 23 64 65  int)(p->fd)).#de
0600: 66 69 6e 65 20 46 49 4c 45 48 41 4e 44 4c 45 49  fine FILEHANDLEI
0610: 44 28 66 64 29 20 28 28 69 6e 74 29 66 64 29 0a  D(fd) ((int)fd).
0620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  ./*.** The page 
0630: 63 61 63 68 65 20 61 73 20 61 20 77 68 6f 6c 65  cache as a whole
0640: 20 69 73 20 61 6c 77 61 79 73 20 69 6e 20 6f 6e   is always in on
0650: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
0660: 6e 67 0a 2a 2a 20 73 74 61 74 65 73 3a 0a 2a 2a  ng.** states:.**
0670: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 55 4e 4c 4f  .**   PAGER_UNLO
0680: 43 4b 20 20 20 20 20 20 20 20 54 68 65 20 70 61  CK        The pa
0690: 67 65 20 63 61 63 68 65 20 69 73 20 6e 6f 74 20  ge cache is not 
06a0: 63 75 72 72 65 6e 74 6c 79 20 72 65 61 64 69 6e  currently readin
06b0: 67 20 6f 72 20 0a 2a 2a 20 20 20 20 20 20 20 20  g or .**        
06c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
06d0: 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61 62  riting the datab
06e0: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 72 65  ase file.  There
06f0: 20 69 73 20 6e 6f 0a 2a 2a 20 20 20 20 20 20 20   is no.**       
0700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0710: 64 61 74 61 20 68 65 6c 64 20 69 6e 20 6d 65 6d  data held in mem
0720: 6f 72 79 2e 20 20 54 68 69 73 20 69 73 20 74 68  ory.  This is th
0730: 65 20 69 6e 69 74 69 61 6c 0a 2a 2a 20 20 20 20  e initial.**    
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 73 74 61 74 65 2e 0a 2a 2a 0a 2a 2a 20     state..**.** 
0760: 20 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20    PAGER_SHARED  
0770: 20 20 20 20 20 20 54 68 65 20 70 61 67 65 20 63        The page c
0780: 61 63 68 65 20 69 73 20 72 65 61 64 69 6e 67 20  ache is reading 
0790: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
07a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07b0: 20 20 20 20 20 20 20 57 72 69 74 69 6e 67 20 69         Writing i
07c0: 73 20 6e 6f 74 20 70 65 72 6d 69 74 74 65 64 2e  s not permitted.
07d0: 20 20 54 68 65 72 65 20 63 61 6e 20 62 65 0a 2a    There can be.*
07e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
07f0: 20 20 20 20 20 20 20 20 6d 75 6c 74 69 70 6c 65          multiple
0800: 20 72 65 61 64 65 72 73 20 61 63 63 65 73 73 69   readers accessi
0810: 6e 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61  ng the same data
0820: 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  base.**         
0830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 69                fi
0840: 6c 65 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  le at the same t
0850: 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ime..**.**   PAG
0860: 45 52 5f 52 45 53 45 52 56 45 44 20 20 20 20 20  ER_RESERVED     
0870: 20 54 68 69 73 20 70 72 6f 63 65 73 73 20 68 61   This process ha
0880: 73 20 72 65 73 65 72 76 65 64 20 74 68 65 20 64  s reserved the d
0890: 61 74 61 62 61 73 65 20 66 6f 72 20 77 72 69 74  atabase for writ
08a0: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 75 74               but
08c0: 20 68 61 73 20 6e 6f 74 20 79 65 74 20 6d 61 64   has not yet mad
08d0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 2e 20 20  e any changes.  
08e0: 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f 63 65 73 73  Only one process
08f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0900: 20 20 20 20 20 20 20 20 20 20 61 74 20 61 20 74            at a t
0910: 69 6d 65 20 63 61 6e 20 72 65 73 65 72 76 65 20  ime can reserve 
0920: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
0930: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20  he original.**  
0940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0950: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69       database fi
0960: 6c 65 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20  le has not been 
0970: 6d 6f 64 69 66 69 65 64 20 73 6f 20 6f 74 68 65  modified so othe
0980: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0990: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65             proce
09a0: 73 73 65 73 20 6d 61 79 20 73 74 69 6c 6c 20 62  sses may still b
09b0: 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 6f 6e  e reading the on
09c0: 2d 64 69 73 6b 0a 2a 2a 20 20 20 20 20 20 20 20  -disk.**        
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
09e0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a  atabase file..**
09f0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 45 58 43 4c  .**   PAGER_EXCL
0a00: 55 53 49 56 45 20 20 20 20 20 54 68 65 20 70 61  USIVE     The pa
0a10: 67 65 20 63 61 63 68 65 20 69 73 20 77 72 69 74  ge cache is writ
0a20: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
0a30: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
0a40: 20 20 20 20 20 20 20 20 20 20 20 41 63 63 65 73             Acces
0a50: 73 20 69 73 20 65 78 63 6c 75 73 69 76 65 2e 20  s is exclusive. 
0a60: 20 4e 6f 20 6f 74 68 65 72 20 70 72 6f 63 65 73   No other proces
0a70: 73 65 73 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20  ses or.**       
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 74 68 72 65 61 64 73 20 63 61 6e 20 62 65 20 72  threads can be r
0aa0: 65 61 64 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  eading or writin
0ab0: 67 20 77 68 69 6c 65 20 6f 6e 65 0a 2a 2a 20 20  g while one.**  
0ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ad0: 20 20 20 20 20 70 72 6f 63 65 73 73 20 69 73 20       process is 
0ae0: 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20  writing..**.**  
0af0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20   PAGER_SYNCED   
0b00: 20 20 20 20 20 54 68 65 20 70 61 67 65 72 20 6d       The pager m
0b10: 6f 76 65 73 20 74 6f 20 74 68 69 73 20 73 74 61  oves to this sta
0b20: 74 65 20 66 72 6f 6d 20 50 41 47 45 52 5f 45 58  te from PAGER_EX
0b30: 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20 20 20  CLUSIVE.**      
0b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b50: 20 61 66 74 65 72 20 61 6c 6c 20 64 69 72 74 79   after all dirty
0b60: 20 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e   pages have been
0b70: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
0b80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0b90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0ba0: 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66  e file and the f
0bb0: 69 6c 65 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ile has been syn
0bc0: 63 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 20 20  ced to.**       
0bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0be0: 64 69 73 6b 2e 20 41 6c 6c 20 74 68 61 74 20 72  disk. All that r
0bf0: 65 6d 61 69 6e 73 20 74 6f 20 64 6f 20 69 73 20  emains to do is 
0c00: 74 6f 20 72 65 6d 6f 76 65 20 6f 72 0a 2a 2a 20  to remove or.** 
0c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c20: 20 20 20 20 20 20 74 72 75 6e 63 61 74 65 20 74        truncate t
0c30: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
0c40: 61 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  and the transact
0c50: 69 6f 6e 20 0a 2a 2a 20 20 20 20 20 20 20 20 20  ion .**         
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 69                wi
0c70: 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e  ll be committed.
0c80: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
0c90: 63 61 63 68 65 20 63 6f 6d 65 73 20 75 70 20 69  cache comes up i
0ca0: 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e 20  n PAGER_UNLOCK. 
0cb0: 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
0cc0: 61 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65  a.** sqlite3Page
0cd0: 72 47 65 74 28 29 20 6f 63 63 75 72 73 2c 20 74  rGet() occurs, t
0ce0: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0cf0: 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 53 48  ions to PAGER_SH
0d00: 41 52 45 44 2e 0a 2a 2a 20 41 66 74 65 72 20 61  ARED..** After a
0d10: 6c 6c 20 70 61 67 65 73 20 68 61 76 65 20 62 65  ll pages have be
0d20: 65 6e 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  en released usin
0d30: 67 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 75 6e  g sqlite_page_un
0d40: 72 65 66 28 29 2c 0a 2a 2a 20 74 68 65 20 73 74  ref(),.** the st
0d50: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0d60: 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 55 4e  back to PAGER_UN
0d70: 4c 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74  LOCK.  The first
0d80: 20 74 69 6d 65 0a 2a 2a 20 74 68 61 74 20 73 71   time.** that sq
0d90: 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
0da0: 29 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  ) is called, the
0db0: 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69 6f   state transitio
0dc0: 6e 73 20 74 6f 0a 2a 2a 20 50 41 47 45 52 5f 52  ns to.** PAGER_R
0dd0: 45 53 45 52 56 45 44 2e 20 20 28 4e 6f 74 65 20  ESERVED.  (Note 
0de0: 74 68 61 74 20 73 71 6c 69 74 65 33 50 61 67 65  that sqlite3Page
0df0: 72 57 72 69 74 65 28 29 20 63 61 6e 20 6f 6e 6c  rWrite() can onl
0e00: 79 20 62 65 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f  y be.** called o
0e10: 6e 20 61 6e 20 6f 75 74 73 74 61 6e 64 69 6e 67  n an outstanding
0e20: 20 70 61 67 65 20 77 68 69 63 68 20 6d 65 61 6e   page which mean
0e30: 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
0e40: 20 6d 75 73 74 0a 2a 2a 20 62 65 20 69 6e 20 50   must.** be in P
0e50: 41 47 45 52 5f 53 48 41 52 45 44 20 62 65 66 6f  AGER_SHARED befo
0e60: 72 65 20 69 74 20 74 72 61 6e 73 69 74 69 6f 6e  re it transition
0e70: 73 20 74 6f 20 50 41 47 45 52 5f 52 45 53 45 52  s to PAGER_RESER
0e80: 56 45 44 2e 29 0a 2a 2a 20 50 41 47 45 52 5f 52  VED.).** PAGER_R
0e90: 45 53 45 52 56 45 44 20 6d 65 61 6e 73 20 74 68  ESERVED means th
0ea0: 61 74 20 74 68 65 72 65 20 69 73 20 61 6e 20 6f  at there is an o
0eb0: 70 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  pen rollback jou
0ec0: 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65 20 74 72 61  rnal..** The tra
0ed0: 6e 73 69 74 69 6f 6e 20 74 6f 20 50 41 47 45 52  nsition to PAGER
0ee0: 5f 45 58 43 4c 55 53 49 56 45 20 6f 63 63 75 72  _EXCLUSIVE occur
0ef0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68 61  s before any cha
0f00: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
0f10: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
0f20: 20 66 69 6c 65 2c 20 74 68 6f 75 67 68 20 77 72   file, though wr
0f30: 69 74 65 73 20 74 6f 20 74 68 65 20 72 6f 6c 6c  ites to the roll
0f40: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
0f50: 6f 63 63 75 72 73 20 77 69 74 68 20 6a 75 73 74  occurs with just
0f60: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
0f70: 20 20 41 66 74 65 72 20 61 6e 20 73 71 6c 69 74    After an sqlit
0f80: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
0f90: 29 0a 2a 2a 20 6f 72 20 73 71 6c 69 74 65 33 50  ).** or sqlite3P
0fa0: 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54  agerCommitPhaseT
0fb0: 77 6f 28 29 2c 20 74 68 65 20 73 74 61 74 65 20  wo(), the state 
0fc0: 63 61 6e 20 67 6f 20 62 61 63 6b 20 74 6f 20 50  can go back to P
0fd0: 41 47 45 52 5f 53 48 41 52 45 44 2c 0a 2a 2a 20  AGER_SHARED,.** 
0fe0: 6f 72 20 69 74 20 63 61 6e 20 73 74 61 79 20 61  or it can stay a
0ff0: 74 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  t PAGER_EXCLUSIV
1000: 45 20 69 66 20 77 65 20 61 72 65 20 69 6e 20 65  E if we are in e
1010: 78 63 6c 75 73 69 76 65 20 61 63 63 65 73 73 20  xclusive access 
1020: 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  mode..*/.#define
1030: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 20 20   PAGER_UNLOCK   
1040: 20 20 20 30 0a 23 64 65 66 69 6e 65 20 50 41 47     0.#define PAG
1050: 45 52 5f 53 48 41 52 45 44 20 20 20 20 20 20 31  ER_SHARED      1
1060: 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20 53 48     /* same as SH
1070: 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  ARED_LOCK */.#de
1080: 66 69 6e 65 20 50 41 47 45 52 5f 52 45 53 45 52  fine PAGER_RESER
1090: 56 45 44 20 20 20 20 32 20 20 20 2f 2a 20 73 61  VED    2   /* sa
10a0: 6d 65 20 61 73 20 52 45 53 45 52 56 45 44 5f 4c  me as RESERVED_L
10b0: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
10c0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20  AGER_EXCLUSIVE  
10d0: 20 34 20 20 20 2f 2a 20 73 61 6d 65 20 61 73 20   4   /* same as 
10e0: 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 2a  EXCLUSIVE_LOCK *
10f0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
1100: 53 59 4e 43 45 44 20 20 20 20 20 20 35 0a 0a 2f  SYNCED      5../
1110: 2a 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65  *.** A macro use
1120: 64 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74  d for invoking t
1130: 68 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72  he codec if ther
1140: 65 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64  e is one.*/.#ifd
1150: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
1160: 44 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44  DEC.# define COD
1170: 45 43 31 28 50 2c 44 2c 4e 2c 58 2c 45 29 20 5c  EC1(P,D,N,X,E) \
1180: 0a 20 20 20 20 69 66 28 20 50 2d 3e 78 43 6f 64  .    if( P->xCod
1190: 65 63 20 26 26 20 50 2d 3e 78 43 6f 64 65 63 28  ec && P->xCodec(
11a0: 50 2d 3e 70 43 6f 64 65 63 2c 44 2c 4e 2c 58 29  P->pCodec,D,N,X)
11b0: 3d 3d 30 20 29 7b 20 45 3b 20 7d 0a 23 20 64 65  ==0 ){ E; }.# de
11c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
11d0: 4e 2c 58 2c 45 2c 4f 29 20 5c 0a 20 20 20 20 69  N,X,E,O) \.    i
11e0: 66 28 20 50 2d 3e 78 43 6f 64 65 63 3d 3d 30 20  f( P->xCodec==0 
11f0: 29 7b 20 4f 3d 28 63 68 61 72 2a 29 44 3b 20 7d  ){ O=(char*)D; }
1200: 65 6c 73 65 20 5c 0a 20 20 20 20 69 66 28 20 28  else \.    if( (
1210: 4f 3d 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f  O=(char*)(P->xCo
1220: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 2c 44 2c  dec(P->pCodec,D,
1230: 4e 2c 58 29 29 29 3d 3d 30 20 29 7b 20 45 3b 20  N,X)))==0 ){ E; 
1240: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
1250: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 2c   CODEC1(P,D,N,X,
1260: 45 29 20 20 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f  E)   /* NO-OP */
1270: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 32  .# define CODEC2
1280: 28 50 2c 44 2c 4e 2c 58 2c 45 2c 4f 29 20 4f 3d  (P,D,N,X,E,O) O=
1290: 28 63 68 61 72 2a 29 44 0a 23 65 6e 64 69 66 0a  (char*)D.#endif.
12a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d  ./*.** The maxim
12b0: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 65 63 74 6f  um allowed secto
12c0: 72 20 73 69 7a 65 2e 20 31 36 4d 42 2e 20 49 66  r size. 16MB. If
12d0: 20 74 68 65 20 78 53 65 63 74 6f 72 73 69 7a 65   the xSectorsize
12e0: 28 29 20 6d 65 74 68 6f 64 20 0a 2a 2a 20 72 65  () method .** re
12f0: 74 75 72 6e 73 20 61 20 76 61 6c 75 65 20 6c 61  turns a value la
1300: 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  rger than this, 
1310: 74 68 65 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f  then MAX_SECTOR_
1320: 53 49 5a 45 20 69 73 20 75 73 65 64 20 69 6e 73  SIZE is used ins
1330: 74 65 61 64 2e 0a 2a 2a 20 54 68 69 73 20 63 6f  tead..** This co
1340: 75 6c 64 20 63 6f 6e 63 65 69 76 61 62 6c 79 20  uld conceivably 
1350: 63 61 75 73 65 20 63 6f 72 72 75 70 74 69 6f 6e  cause corruption
1360: 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 20 70 6f 77   following a pow
1370: 65 72 20 66 61 69 6c 75 72 65 20 6f 6e 0a 2a 2a  er failure on.**
1380: 20 73 75 63 68 20 61 20 73 79 73 74 65 6d 2e 20   such a system. 
1390: 54 68 69 73 20 69 73 20 63 75 72 72 65 6e 74 6c  This is currentl
13a0: 79 20 61 6e 20 75 6e 64 6f 63 75 6d 65 6e 74 65  y an undocumente
13b0: 64 20 6c 69 6d 69 74 2e 0a 2a 2f 0a 23 64 65 66  d limit..*/.#def
13c0: 69 6e 65 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53  ine MAX_SECTOR_S
13d0: 49 5a 45 20 30 78 30 31 30 30 30 30 30 0a 0a 2f  IZE 0x0100000../
13e0: 2a 0a 2a 2a 20 41 6e 20 69 6e 73 74 61 6e 63 65  *.** An instance
13f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1400: 67 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  g structure is a
1410: 6c 6c 6f 63 61 74 65 64 20 66 6f 72 20 65 61 63  llocated for eac
1420: 68 20 61 63 74 69 76 65 0a 2a 2a 20 73 61 76 65  h active.** save
1430: 70 6f 69 6e 74 20 61 6e 64 20 73 74 61 74 65 6d  point and statem
1440: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
1450: 69 6e 20 74 68 65 20 73 79 73 74 65 6d 2e 20 41  in the system. A
1460: 6c 6c 20 73 75 63 68 20 73 74 72 75 63 74 75 72  ll such structur
1470: 65 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64  es.** are stored
1480: 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 61 53   in the Pager.aS
1490: 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79  avepoint[] array
14a0: 2c 20 77 68 69 63 68 20 69 73 20 61 6c 6c 6f 63  , which is alloc
14b0: 61 74 65 64 20 61 6e 64 0a 2a 2a 20 72 65 73 69  ated and.** resi
14c0: 7a 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  zed using sqlite
14d0: 33 52 65 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 0a 2a  3Realloc()..**.*
14e0: 2a 20 57 68 65 6e 20 61 20 73 61 76 65 70 6f 69  * When a savepoi
14f0: 6e 74 20 69 73 20 63 72 65 61 74 65 64 2c 20 74  nt is created, t
1500: 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  he PagerSavepoin
1510: 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69 65  t.iHdrOffset fie
1520: 6c 64 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  ld is.** set to 
1530: 30 2e 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 2d  0. If a journal-
1540: 68 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65  header is writte
1550: 6e 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e 20  n into the main 
1560: 6a 6f 75 72 6e 61 6c 20 77 68 69 6c 65 0a 2a 2a  journal while.**
1570: 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 69   the savepoint i
1580: 73 20 61 63 74 69 76 65 2c 20 74 68 65 6e 20 69  s active, then i
1590: 48 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74  HdrOffset is set
15a0: 20 74 6f 20 74 68 65 20 62 79 74 65 20 6f 66 66   to the byte off
15b0: 73 65 74 20 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  set .** immediat
15c0: 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ely following th
15d0: 65 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 20 72  e last journal r
15e0: 65 63 6f 72 64 20 77 72 69 74 74 65 6e 20 69 6e  ecord written in
15f0: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 6a  to the main.** j
1600: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 74 68  ournal before th
1610: 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72  e journal-header
1620: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
1630: 65 64 20 64 75 72 69 6e 67 20 73 61 76 65 70 6f  ed during savepo
1640: 69 6e 74 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  int.** rollback 
1650: 28 73 65 65 20 70 61 67 65 72 50 6c 61 79 62 61  (see pagerPlayba
1660: 63 6b 53 61 76 65 70 6f 69 6e 74 28 29 29 2e 0a  ckSavepoint())..
1670: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1680: 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  t PagerSavepoint
1690: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 3b   PagerSavepoint;
16a0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 53 61 76  .struct PagerSav
16b0: 65 70 6f 69 6e 74 20 7b 0a 20 20 69 36 34 20 69  epoint {.  i64 i
16c0: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
16d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 72 74          /* Start
16e0: 69 6e 67 20 6f 66 66 73 65 74 20 69 6e 20 6d 61  ing offset in ma
16f0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  in journal */.  
1700: 69 36 34 20 69 48 64 72 4f 66 66 73 65 74 3b 20  i64 iHdrOffset; 
1710: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1720: 53 65 65 20 61 62 6f 76 65 20 2a 2f 0a 20 20 42  See above */.  B
1730: 69 74 76 65 63 20 2a 70 49 6e 53 61 76 65 70 6f  itvec *pInSavepo
1740: 69 6e 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  int;        /* S
1750: 65 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  et of pages in t
1760: 68 69 73 20 73 61 76 65 70 6f 69 6e 74 20 2a 2f  his savepoint */
1770: 0a 20 20 50 67 6e 6f 20 6e 4f 72 69 67 3b 20 20  .  Pgno nOrig;  
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 2f 2a 20 4f 72 69 67 69 6e 61 6c 20 6e 75 6d 62  /* Original numb
17a0: 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 66  er of pages in f
17b0: 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 69 53  ile */.  Pgno iS
17c0: 75 62 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  ubRec;          
17d0: 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
17e0: 66 20 66 69 72 73 74 20 72 65 63 6f 72 64 20 69  f first record i
17f0: 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f  n sub-journal */
1800: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  .};../*.** A ope
1810: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
1820: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
1830: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
1840: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 65 72  ucture..**.** er
1850: 72 43 6f 64 65 0a 2a 2a 0a 2a 2a 20 20 20 50 61  rCode.**.**   Pa
1860: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
1870: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
1880: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
1890: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 20 20  ORRUPT, or.**   
18a0: 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20  or SQLITE_FULL. 
18b0: 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20  Once one of the 
18c0: 66 69 72 73 74 20 74 68 72 65 65 20 65 72 72 6f  first three erro
18d0: 72 73 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65  rs occurs, it pe
18e0: 72 73 69 73 74 73 0a 2a 2a 20 20 20 61 6e 64 20  rsists.**   and 
18f0: 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20 74  is returned as t
1900: 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76 65  he result of eve
1910: 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20 41  ry major pager A
1920: 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a  PI call.  The.**
1930: 20 20 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72     SQLITE_FULL r
1940: 65 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c  eturn code is sl
1950: 69 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74  ightly different
1960: 2e 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e  . It persists on
1970: 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20  ly until the.** 
1980: 20 20 6e 65 78 74 20 73 75 63 63 65 73 73 66 75    next successfu
1990: 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65  l rollback is pe
19a0: 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20 70  rformed on the p
19b0: 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73 6f  ager cache. Also
19c0: 2c 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 46 55  ,.**   SQLITE_FU
19d0: 4c 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65  LL does not affe
19e0: 63 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ct the sqlite3Pa
19f0: 67 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c  gerGet() and sql
1a00: 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28  ite3PagerLookup(
1a10: 29 0a 2a 2a 20 20 20 41 50 49 73 2c 20 74 68 65  ).**   APIs, the
1a20: 79 20 6d 61 79 20 73 74 69 6c 6c 20 62 65 20 75  y may still be u
1a30: 73 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  sed successfully
1a40: 2e 0a 2a 2a 0a 2a 2a 20 64 62 53 69 7a 65 56 61  ..**.** dbSizeVa
1a50: 6c 69 64 2c 20 64 62 53 69 7a 65 2c 20 64 62 4f  lid, dbSize, dbO
1a60: 72 69 67 53 69 7a 65 2c 20 64 62 46 69 6c 65 53  rigSize, dbFileS
1a70: 69 7a 65 0a 2a 2a 0a 2a 2a 20 20 20 4d 61 6e 61  ize.**.**   Mana
1a80: 67 69 6e 67 20 74 68 65 20 73 69 7a 65 20 6f 66  ging the size of
1a90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1aa0: 6c 65 20 69 6e 20 70 61 67 65 73 20 69 73 20 61  le in pages is a
1ab0: 20 6c 69 74 74 6c 65 20 63 6f 6d 70 6c 69 63 61   little complica
1ac0: 74 65 64 2e 0a 2a 2a 20 20 20 54 68 65 20 76 61  ted..**   The va
1ad0: 72 69 61 62 6c 65 20 50 61 67 65 72 2e 64 62 53  riable Pager.dbS
1ae0: 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ize contains the
1af0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1b00: 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
1b10: 73 65 0a 2a 2a 20 20 20 69 6d 61 67 65 20 63 75  se.**   image cu
1b20: 72 72 65 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73  rrently contains
1b30: 2e 20 41 73 20 74 68 65 20 64 61 74 61 62 61 73  . As the databas
1b40: 65 20 69 6d 61 67 65 20 67 72 6f 77 73 20 6f 72  e image grows or
1b50: 20 73 68 72 69 6e 6b 73 20 74 68 69 73 0a 2a 2a   shrinks this.**
1b60: 20 20 20 76 61 72 69 61 62 6c 65 20 69 73 20 75     variable is u
1b70: 70 64 61 74 65 64 2e 20 54 68 65 20 76 61 72 69  pdated. The vari
1b80: 61 62 6c 65 20 50 61 67 65 72 2e 64 62 46 69 6c  able Pager.dbFil
1b90: 65 53 69 7a 65 20 63 6f 6e 74 61 69 6e 73 20 74  eSize contains t
1ba0: 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 20 20 6f  he number.**   o
1bb0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
1bc0: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
1bd0: 69 73 20 6d 61 79 20 62 65 20 64 69 66 66 65 72  is may be differ
1be0: 65 6e 74 20 66 72 6f 6d 20 50 61 67 65 72 2e 64  ent from Pager.d
1bf0: 62 53 69 7a 65 0a 2a 2a 20 20 20 69 66 20 73 6f  bSize.**   if so
1c00: 6d 65 20 70 61 67 65 73 20 68 61 76 65 20 62 65  me pages have be
1c10: 65 6e 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  en appended to t
1c20: 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
1c30: 65 20 62 75 74 20 6e 6f 74 20 79 65 74 20 77 72  e but not yet wr
1c40: 69 74 74 65 6e 0a 2a 2a 20 20 20 6f 75 74 20 66  itten.**   out f
1c50: 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 74 6f  rom the cache to
1c60: 20 74 68 65 20 61 63 74 75 61 6c 20 66 69 6c 65   the actual file
1c70: 20 6f 6e 20 64 69 73 6b 2e 20 4f 72 20 69 66 20   on disk. Or if 
1c80: 74 68 65 20 69 6d 61 67 65 20 68 61 73 20 62 65  the image has be
1c90: 65 6e 0a 2a 2a 20 20 20 74 72 75 6e 63 61 74 65  en.**   truncate
1ca0: 64 20 62 79 20 61 6e 20 69 6e 63 72 65 6d 65 6e  d by an incremen
1cb0: 74 61 6c 2d 76 61 63 75 75 6d 20 6f 70 65 72 61  tal-vacuum opera
1cc0: 74 69 6f 6e 2e 20 54 68 65 20 50 61 67 65 72 2e  tion. The Pager.
1cd0: 64 62 4f 72 69 67 53 69 7a 65 20 76 61 72 69 61  dbOrigSize varia
1ce0: 62 6c 65 0a 2a 2a 20 20 20 63 6f 6e 74 61 69 6e  ble.**   contain
1cf0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
1d00: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
1d10: 61 62 61 73 65 20 69 6d 61 67 65 20 77 68 65 6e  abase image when
1d20: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
1d30: 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61    transaction wa
1d40: 73 20 6f 70 65 6e 65 64 2e 20 54 68 65 20 63 6f  s opened. The co
1d50: 6e 74 65 6e 74 73 20 6f 66 20 61 6c 6c 20 74 68  ntents of all th
1d60: 72 65 65 20 6f 66 20 74 68 65 73 65 20 76 61 72  ree of these var
1d70: 69 61 62 6c 65 73 20 69 73 0a 2a 2a 20 20 20 6f  iables is.**   o
1d80: 6e 6c 79 20 67 75 61 72 61 6e 74 65 65 64 20 74  nly guaranteed t
1d90: 6f 20 62 65 20 63 6f 72 72 65 63 74 20 69 66 20  o be correct if 
1da0: 74 68 65 20 62 6f 6f 6c 65 61 6e 20 50 61 67 65  the boolean Page
1db0: 72 2e 64 62 53 69 7a 65 56 61 6c 69 64 20 69 73  r.dbSizeValid is
1dc0: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 54   true..**.**   T
1dd0: 4f 44 4f 3a 20 55 6e 64 65 72 20 77 68 61 74 20  ODO: Under what 
1de0: 63 6f 6e 64 69 74 69 6f 6e 73 20 69 73 20 64 62  conditions is db
1df0: 53 69 7a 65 56 61 6c 69 64 20 73 65 74 3f 20 43  SizeValid set? C
1e00: 6c 65 61 72 65 64 3f 0a 2a 2a 0a 2a 2a 20 63 68  leared?.**.** ch
1e10: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 0a 2a 2a  angeCountDone.**
1e20: 0a 2a 2a 20 20 20 54 68 69 73 20 62 6f 6f 6c 65  .**   This boole
1e30: 61 6e 20 76 61 72 69 61 62 6c 65 20 69 73 20 75  an variable is u
1e40: 73 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65  sed to make sure
1e50: 20 74 68 61 74 20 74 68 65 20 63 68 61 6e 67 65   that the change
1e60: 2d 63 6f 75 6e 74 65 72 20 0a 2a 2a 20 20 20 28  -counter .**   (
1e70: 74 68 65 20 34 2d 62 79 74 65 20 68 65 61 64 65  the 4-byte heade
1e80: 72 20 66 69 65 6c 64 20 61 74 20 62 79 74 65 20  r field at byte 
1e90: 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74 68 65  offset 24 of the
1ea0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 29 20   database file) 
1eb0: 69 73 20 0a 2a 2a 20 20 20 6e 6f 74 20 75 70 64  is .**   not upd
1ec0: 61 74 65 64 20 6d 6f 72 65 20 6f 66 74 65 6e 20  ated more often 
1ed0: 74 68 61 6e 20 6e 65 63 65 73 73 61 72 79 2e 20  than necessary. 
1ee0: 0a 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 73  .**.**   It is s
1ef0: 65 74 20 74 6f 20 74 72 75 65 20 77 68 65 6e 20  et to true when 
1f00: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
1f10: 65 72 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  er field is upda
1f20: 74 65 64 2c 20 77 68 69 63 68 20 0a 2a 2a 20 20  ted, which .**  
1f30: 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e   can only happen
1f40: 20 69 66 20 61 6e 20 65 78 63 6c 75 73 69 76 65   if an exclusive
1f50: 20 6c 6f 63 6b 20 69 73 20 68 65 6c 64 20 6f 6e   lock is held on
1f60: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1f70: 6c 65 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20 63  le..**   It is c
1f80: 6c 65 61 72 65 64 20 28 73 65 74 20 74 6f 20 66  leared (set to f
1f90: 61 6c 73 65 29 20 77 68 65 6e 65 76 65 72 20 61  alse) whenever a
1fa0: 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b  n exclusive lock
1fb0: 20 69 73 20 0a 2a 2a 20 20 20 72 65 6c 69 6e 71   is .**   relinq
1fc0: 75 69 73 68 65 64 20 6f 6e 20 74 68 65 20 64 61  uished on the da
1fd0: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 45 61 63  tabase file. Eac
1fe0: 68 20 74 69 6d 65 20 61 20 74 72 61 6e 73 61 63  h time a transac
1ff0: 74 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65  tion is committe
2000: 64 2c 0a 2a 2a 20 20 20 54 68 65 20 63 68 61 6e  d,.**   The chan
2010: 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67  geCountDone flag
2020: 20 69 73 20 69 6e 73 70 65 63 74 65 64 2e 20 49   is inspected. I
2030: 66 20 69 74 20 69 73 20 74 72 75 65 2c 20 74 68  f it is true, th
2040: 65 20 77 6f 72 6b 20 6f 66 0a 2a 2a 20 20 20 75  e work of.**   u
2050: 70 64 61 74 69 6e 67 20 74 68 65 20 63 68 61 6e  pdating the chan
2060: 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20 6f 6d  ge-counter is om
2070: 69 74 74 65 64 20 66 6f 72 20 74 68 65 20 63 75  itted for the cu
2080: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
2090: 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  n..**.**   This 
20a0: 6d 65 63 68 61 6e 69 73 6d 20 6d 65 61 6e 73 20  mechanism means 
20b0: 74 68 61 74 20 77 68 65 6e 20 72 75 6e 6e 69 6e  that when runnin
20c0: 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
20d0: 6f 64 65 2c 20 61 20 63 6f 6e 6e 65 63 74 69 6f  ode, a connectio
20e0: 6e 20 0a 2a 2a 20 20 20 6e 65 65 64 20 6f 6e 6c  n .**   need onl
20f0: 79 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61  y update the cha
2100: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 6f 6e 63 65  nge-counter once
2110: 2c 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20  , for the first 
2120: 74 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20  transaction.**  
2130: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a   committed..**.*
2140: 2a 20 64 62 4d 6f 64 69 66 69 65 64 0a 2a 2a 0a  * dbModified.**.
2150: 2a 2a 20 20 20 54 68 65 20 64 62 4d 6f 64 69 66  **   The dbModif
2160: 69 65 64 20 66 6c 61 67 20 69 73 20 73 65 74 20  ied flag is set 
2170: 77 68 65 6e 65 76 65 72 20 61 20 64 61 74 61 62  whenever a datab
2180: 61 73 65 20 70 61 67 65 20 69 73 20 64 69 72 74  ase page is dirt
2190: 69 65 64 2e 0a 2a 2a 20 20 20 49 74 20 69 73 20  ied..**   It is 
21a0: 63 6c 65 61 72 65 64 20 61 74 20 74 68 65 20 65  cleared at the e
21b0: 6e 64 20 6f 66 20 65 61 63 68 20 74 72 61 6e 73  nd of each trans
21c0: 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  action..**.**   
21d0: 49 74 20 69 73 20 75 73 65 64 20 77 68 65 6e 20  It is used when 
21e0: 63 6f 6d 6d 69 74 74 69 6e 67 20 6f 72 20 6f 74  committing or ot
21f0: 68 65 72 77 69 73 65 20 65 6e 64 69 6e 67 20 61  herwise ending a
2200: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 49 66   transaction. If
2210: 0a 2a 2a 20 20 20 74 68 65 20 64 62 4d 6f 64 69  .**   the dbModi
2220: 66 69 65 64 20 66 6c 61 67 20 69 73 20 63 6c 65  fied flag is cle
2230: 61 72 20 74 68 65 6e 20 6c 65 73 73 20 77 6f 72  ar then less wor
2240: 6b 20 68 61 73 20 74 6f 20 62 65 20 64 6f 6e 65  k has to be done
2250: 2e 0a 2a 2a 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 53  ..**.** journalS
2260: 74 61 72 74 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54  tarted.**.**   T
2270: 68 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 20  his flag is set 
2280: 77 68 65 6e 65 76 65 72 20 74 68 65 20 74 68 65  whenever the the
2290: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
22a0: 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a 20   synced. .**.** 
22b0: 20 20 54 68 65 20 70 6f 69 6e 74 20 6f 66 20 74    The point of t
22c0: 68 69 73 20 66 6c 61 67 20 69 73 20 74 68 61 74  his flag is that
22d0: 20 69 74 20 6d 75 73 74 20 62 65 20 73 65 74 20   it must be set 
22e0: 61 66 74 65 72 20 74 68 65 20 0a 2a 2a 20 20 20  after the .**   
22f0: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
2300: 61 64 65 72 20 69 6e 20 61 20 6a 6f 75 72 6e 61  ader in a journa
2310: 6c 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20  l file has been 
2320: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a  synced to disk..
2330: 2a 2a 20 20 20 41 66 74 65 72 20 74 68 69 73 20  **   After this 
2340: 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20 6e 65  has happened, ne
2350: 77 20 70 61 67 65 73 20 61 70 70 65 6e 64 65 64  w pages appended
2360: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
2370: 20 0a 2a 2a 20 20 20 64 6f 20 6e 6f 74 20 6e 65   .**   do not ne
2380: 65 64 20 74 68 65 20 50 47 48 44 52 5f 4e 45 45  ed the PGHDR_NEE
2390: 44 5f 53 59 4e 43 20 66 6c 61 67 20 73 65 74 2c  D_SYNC flag set,
23a0: 20 61 73 20 74 68 65 79 20 64 6f 20 6e 6f 74 20   as they do not 
23b0: 6e 65 65 64 0a 2a 2a 20 20 20 74 6f 20 77 61 69  need.**   to wai
23c0: 74 20 66 6f 72 20 61 20 6a 6f 75 72 6e 61 6c 20  t for a journal 
23d0: 73 79 6e 63 20 62 65 66 6f 72 65 20 74 68 65 79  sync before they
23e0: 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
23f0: 6f 75 74 20 74 6f 0a 2a 2a 20 20 20 74 68 65 20  out to.**   the 
2400: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 73  database file (s
2410: 65 65 20 66 75 6e 63 74 69 6f 6e 20 70 61 67 65  ee function page
2420: 72 5f 77 72 69 74 65 28 29 29 2e 0a 2a 2a 20 20  r_write())..**  
2430: 20 0a 2a 2a 20 73 65 74 4d 61 73 74 65 72 0a 2a   .** setMaster.*
2440: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69  *.**   This vari
2450: 61 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20  able is used to 
2460: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
2470: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
2480: 69 6c 65 20 6e 61 6d 65 0a 2a 2a 20 20 20 28 69  ile name.**   (i
2490: 66 20 61 6e 79 29 20 69 73 20 6f 6e 6c 79 20 77  f any) is only w
24a0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
24b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 6e 63  journal file onc
24c0: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 57 68 65 6e 20  e..**.**   When 
24d0: 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20 74 72 61  committing a tra
24e0: 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 20 6d 61  nsaction, the ma
24f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
2500: 65 20 6e 61 6d 65 20 28 69 66 20 61 6e 79 29 0a  e name (if any).
2510: 2a 2a 20 20 20 6d 61 79 20 62 65 20 77 72 69 74  **   may be writ
2520: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
2530: 72 6e 61 6c 20 66 69 6c 65 20 77 68 69 6c 65 20  rnal file while 
2540: 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69  the pager is sti
2550: 6c 6c 20 69 6e 0a 2a 2a 20 20 20 50 41 47 45 52  ll in.**   PAGER
2560: 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 20  _RESERVED state 
2570: 28 73 65 65 20 43 6f 6d 6d 69 74 50 68 61 73 65  (see CommitPhase
2580: 4f 6e 65 28 29 20 66 6f 72 20 74 68 65 20 61 63  One() for the ac
2590: 74 69 6f 6e 29 2e 20 49 74 0a 2a 2a 20 20 20 74  tion). It.**   t
25a0: 68 65 6e 20 61 74 74 65 6d 70 74 73 20 74 6f 20  hen attempts to 
25b0: 75 70 67 72 61 64 65 20 74 6f 20 61 6e 20 65 78  upgrade to an ex
25c0: 63 6c 75 73 69 76 65 20 6c 6f 63 6b 2e 20 49 66  clusive lock. If
25d0: 20 74 68 69 73 20 61 74 74 65 6d 70 74 0a 2a 2a   this attempt.**
25e0: 20 20 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 53     fails, then S
25f0: 51 4c 49 54 45 5f 42 55 53 59 20 6d 61 79 20 62  QLITE_BUSY may b
2600: 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68  e returned to th
2610: 65 20 75 73 65 72 20 61 6e 64 20 74 68 65 20 75  e user and the u
2620: 73 65 72 0a 2a 2a 20 20 20 6d 61 79 20 61 74 74  ser.**   may att
2630: 65 6d 70 74 20 74 6f 20 63 6f 6d 6d 69 74 20 74  empt to commit t
2640: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  he transaction a
2650: 67 61 69 6e 20 6c 61 74 65 72 20 28 63 61 6c 6c  gain later (call
2660: 69 6e 67 0a 2a 2a 20 20 20 43 6f 6d 6d 69 74 50  ing.**   CommitP
2670: 68 61 73 65 4f 6e 65 28 29 20 61 67 61 69 6e 29  haseOne() again)
2680: 2e 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 75  . This flag is u
2690: 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68  sed to ensure th
26a0: 61 74 20 74 68 65 20 0a 2a 2a 20 20 20 6d 61 73  at the .**   mas
26b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
26c0: 20 69 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e   is only written
26d0: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
26e0: 66 69 6c 65 20 74 68 65 20 66 69 72 73 74 0a 2a  file the first.*
26f0: 2a 20 20 20 74 69 6d 65 20 43 6f 6d 6d 69 74 50  *   time CommitP
2700: 68 61 73 65 4f 6e 65 28 29 20 69 73 20 63 61 6c  haseOne() is cal
2710: 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 6f 4e 6f 74  led..**.** doNot
2720: 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69  Sync.**.**   Thi
2730: 73 20 76 61 72 69 61 62 6c 65 20 69 73 20 73 65  s variable is se
2740: 74 20 61 6e 64 20 63 6c 65 61 72 65 64 20 62 79  t and cleared by
2750: 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
2760: 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 6e 65 65 64  te()..**.** need
2770: 53 79 6e 63 0a 2a 2a 0a 2a 2a 20 20 20 54 4f 44  Sync.**.**   TOD
2780: 4f 3a 20 49 74 20 6d 69 67 68 74 20 62 65 20 65  O: It might be e
2790: 61 73 69 65 72 20 74 6f 20 73 65 74 20 74 68 69  asier to set thi
27a0: 73 20 76 61 72 69 61 62 6c 65 20 69 6e 20 77 72  s variable in wr
27b0: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 0a  iteJournalHdr().
27c0: 2a 2a 20 20 20 61 6e 64 20 77 72 69 74 65 4d 61  **   and writeMa
27d0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 6f 6e  sterJournal() on
27e0: 6c 79 2e 20 43 68 61 6e 67 65 20 69 74 73 20 6d  ly. Change its m
27f0: 65 61 6e 69 6e 67 20 74 6f 20 22 75 6e 73 79 6e  eaning to "unsyn
2800: 63 65 64 20 64 61 74 61 0a 2a 2a 20 20 20 68 61  ced data.**   ha
2810: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2820: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 22 2e 0a  o the journal"..
2830: 2a 2a 0a 2a 2a 20 73 75 62 6a 49 6e 4d 65 6d 6f  **.** subjInMemo
2840: 72 79 0a 2a 2a 0a 2a 2a 20 20 20 54 68 69 73 20  ry.**.**   This 
2850: 69 73 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 72  is a boolean var
2860: 69 61 62 6c 65 2e 20 49 66 20 74 72 75 65 2c 20  iable. If true, 
2870: 74 68 65 6e 20 61 6e 79 20 72 65 71 75 69 72 65  then any require
2880: 64 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  d sub-journal.**
2890: 20 20 20 69 73 20 6f 70 65 6e 65 64 20 61 73 20     is opened as 
28a0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75  an in-memory jou
28b0: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 66 61  rnal file. If fa
28c0: 6c 73 65 2c 20 74 68 65 6e 20 69 6e 2d 6d 65 6d  lse, then in-mem
28d0: 6f 72 79 0a 2a 2a 20 20 20 73 75 62 2d 6a 6f 75  ory.**   sub-jou
28e0: 72 6e 61 6c 73 20 61 72 65 20 6f 6e 6c 79 20 75  rnals are only u
28f0: 73 65 64 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72  sed for in-memor
2900: 79 20 70 61 67 65 72 20 66 69 6c 65 73 2e 0a 2a  y pager files..*
2910: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
2920: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
2930: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
2940: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
2950: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
2960: 20 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f    u8 exclusiveMo
2970: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
2980: 20 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69   Boolean. True i
2990: 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d  f locking_mode==
29a0: 45 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75  EXCLUSIVE */.  u
29b0: 38 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 20 20  8 journalMode;  
29c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e             /* On
29d0: 20 6f 66 20 74 68 65 20 50 41 47 45 52 5f 4a 4f   of the PAGER_JO
29e0: 55 52 4e 41 4c 4d 4f 44 45 5f 2a 20 76 61 6c 75  URNALMODE_* valu
29f0: 65 73 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  es */.  u8 useJo
2a00: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
2a10: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
2a20: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
2a30: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
2a40: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2a60: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
2a70: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
2a80: 20 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b   */.  u8 noSync;
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63    /* Do not sync
2ab0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20   the journal if 
2ac0: 74 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c  true */.  u8 ful
2ad0: 6c 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  lSync;          
2ae0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72        /* Do extr
2af0: 61 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a  a syncs of the j
2b00: 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73  ournal for robus
2b10: 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 79  tness */.  u8 sy
2b20: 6e 63 5f 66 6c 61 67 73 3b 20 20 20 20 20 20 20  nc_flags;       
2b30: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
2b40: 20 53 59 4e 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20   SYNC_NORMAL or 
2b50: 53 59 4e 43 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75  SYNC_FULL */.  u
2b60: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
2b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
2b80: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
2b90: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
2ba0: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
2bb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2bc0: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
2bd0: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
2be0: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2c00: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
2c10: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
2c20: 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c  /..  /* The foll
2c30: 6f 77 69 6e 67 20 62 6c 6f 63 6b 20 63 6f 6e 74  owing block cont
2c40: 61 69 6e 73 20 74 68 6f 73 65 20 63 6c 61 73 73  ains those class
2c50: 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20 61 72   members that ar
2c60: 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 20 20  e dynamically.  
2c70: 2a 2a 20 6d 6f 64 69 66 69 65 64 20 64 75 72 69  ** modified duri
2c80: 6e 67 20 6e 6f 72 6d 61 6c 20 6f 70 65 72 61 74  ng normal operat
2c90: 69 6f 6e 73 2e 20 54 68 65 20 6f 74 68 65 72 20  ions. The other 
2ca0: 76 61 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69  variables in thi
2cb0: 73 20 73 74 72 75 63 74 75 72 65 0a 20 20 2a 2a  s structure.  **
2cc0: 20 61 72 65 20 65 69 74 68 65 72 20 63 6f 6e 73   are either cons
2cd0: 74 61 6e 74 20 74 68 72 6f 75 67 68 6f 75 74 20  tant throughout 
2ce0: 74 68 65 20 6c 69 66 65 74 69 6d 65 20 6f 66 20  the lifetime of 
2cf0: 74 68 65 20 70 61 67 65 72 2c 20 6f 72 20 65 6c  the pager, or el
2d00: 73 65 0a 20 20 2a 2a 20 75 73 65 64 20 74 6f 20  se.  ** used to 
2d10: 73 74 6f 72 65 20 63 6f 6e 66 69 67 75 72 61 74  store configurat
2d20: 69 6f 6e 20 70 61 72 61 6d 65 74 65 72 73 20 74  ion parameters t
2d30: 68 61 74 20 61 66 66 65 63 74 20 74 68 65 20 77  hat affect the w
2d40: 61 79 20 74 68 65 20 70 61 67 65 72 20 0a 20 20  ay the pager .  
2d50: 2a 2a 20 6f 70 65 72 61 74 65 73 2e 0a 20 20 2a  ** operates..  *
2d60: 2a 0a 20 20 2a 2a 20 54 68 65 20 27 73 74 61 74  *.  ** The 'stat
2d70: 65 27 20 76 61 72 69 61 62 6c 65 20 69 73 20 64  e' variable is d
2d80: 65 73 63 72 69 62 65 64 20 69 6e 20 6d 6f 72 65  escribed in more
2d90: 20 64 65 74 61 69 6c 20 61 6c 6f 6e 67 20 77 69   detail along wi
2da0: 74 68 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 63  th the.  ** desc
2db0: 72 69 70 74 69 6f 6e 73 20 6f 66 20 74 68 65 20  riptions of the 
2dc0: 76 61 6c 75 65 73 20 69 74 20 6d 61 79 20 74 61  values it may ta
2dd0: 6b 65 20 2d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  ke - PAGER_UNLOC
2de0: 4b 20 65 74 63 2e 20 4d 61 6e 79 20 6f 66 20 74  K etc. Many of t
2df0: 68 65 0a 20 20 2a 2a 20 6f 74 68 65 72 20 76 61  he.  ** other va
2e00: 72 69 61 62 6c 65 73 20 69 6e 20 74 68 69 73 20  riables in this 
2e10: 62 6c 6f 63 6b 20 61 72 65 20 64 65 73 63 72 69  block are descri
2e20: 62 65 64 20 69 6e 20 74 68 65 20 63 6f 6d 6d 65  bed in the comme
2e30: 6e 74 20 64 69 72 65 63 74 6c 79 20 0a 20 20 2a  nt directly .  *
2e40: 2a 20 61 62 6f 76 65 20 74 68 69 73 20 63 6c 61  * above this cla
2e50: 73 73 20 64 65 66 69 6e 69 74 69 6f 6e 2e 0a 20  ss definition.. 
2e60: 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b 20   */.  u8 state; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f 43    /* PAGER_UNLOC
2e90: 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45 53  K, _SHARED, _RES
2ea0: 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a 20  ERVED, etc. */. 
2eb0: 20 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20   u8 dbModified; 
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ed0: 54 72 75 65 20 69 66 20 74 68 65 72 65 20 61 72  True if there ar
2ee0: 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  e any changes to
2ef0: 20 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20   the Db */.  u8 
2f00: 6e 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20  needSync;       
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f20: 20 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69   if an fsync() i
2f30: 73 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20  s needed on the 
2f40: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2f50: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20  journalStarted; 
2f60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2f70: 20 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f   if header of jo
2f80: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
2f90: 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f  */.  u8 changeCo
2fa0: 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20  untDone;        
2fb0: 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e   /* Set after in
2fc0: 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63  crementing the c
2fd0: 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f  hange-counter */
2fe0: 0a 20 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b  .  u8 setMaster;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3000: 2a 20 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20  * True if a m-j 
3010: 6e 61 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72  name has been wr
3020: 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f  itten to jrnl */
3030: 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b  .  u8 doNotSync;
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3050: 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65  * Boolean. While
3060: 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70   true, do not sp
3070: 69 6c 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f  ill the cache */
3080: 0a 20 20 75 38 20 64 62 53 69 7a 65 56 61 6c 69  .  u8 dbSizeVali
3090: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  d;             /
30a0: 2a 20 53 65 74 20 77 68 65 6e 20 64 62 53 69 7a  * Set when dbSiz
30b0: 65 20 69 73 20 63 6f 72 72 65 63 74 20 2a 2f 0a  e is correct */.
30c0: 20 20 75 38 20 73 75 62 6a 49 6e 4d 65 6d 6f 72    u8 subjInMemor
30d0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  y;            /*
30e0: 20 54 72 75 65 20 74 6f 20 75 73 65 20 69 6e 2d   True to use in-
30f0: 6d 65 6d 6f 72 79 20 73 75 62 2d 6a 6f 75 72 6e  memory sub-journ
3100: 61 6c 73 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  als */.  Pgno db
3110: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
3120: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3130: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
3140: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50 67 6e  atabase */.  Pgn
3150: 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20 20 20  o dbOrigSize;   
3160: 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62 53 69           /* dbSi
3170: 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20 63 75  ze before the cu
3180: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
3190: 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62 46 69  n */.  Pgno dbFi
31a0: 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  leSize;         
31b0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
31c0: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
31d0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
31e0: 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20 20 20  int errCode;    
31f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3200: 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20 6b 69  ne of several ki
3210: 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20 2a 2f  nds of errors */
3220: 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20 20  .  int nRec;    
3230: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3240: 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61 6c 6c  * Pages journall
3250: 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20 6a 2d  ed since last j-
3260: 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 2a  header written *
3270: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49 6e 69  /.  u32 cksumIni
3280: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
3290: 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f 6d 20  /* Quasi-random 
32a0: 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f 20 65  value added to e
32b0: 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20 2a 2f  very checksum */
32c0: 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63 3b 20  .  u32 nSubRec; 
32d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32e0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  * Number of reco
32f0: 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  rds written to s
3300: 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ub-journal */.  
3310: 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e  Bitvec *pInJourn
3320: 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f  al;         /* O
3330: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
3340: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
3350: 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 73  base file */.  s
3360: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
3370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69             /* Fi
3380: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f  le descriptor fo
3390: 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  r database */.  
33a0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66  sqlite3_file *jf
33b0: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  d;          /* F
33c0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
33d0: 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  or main journal 
33e0: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
33f0: 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20 20 20  e *sjfd;        
3400: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
3410: 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f 75 72  tor for sub-jour
3420: 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  nal */.  i64 jou
3430: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
3440: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
3450: 77 72 69 74 65 20 6f 66 66 73 65 74 20 69 6e 20  write offset in 
3460: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
3470: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3480: 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  lHdr;           
3490: 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74    /* Byte offset
34a0: 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75   to previous jou
34b0: 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20  rnal header */. 
34c0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20   PagerSavepoint 
34d0: 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f 2a 20  *aSavepoint; /* 
34e0: 41 72 72 61 79 20 6f 66 20 61 63 74 69 76 65 20  Array of active 
34f0: 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a 20 20  savepoints */.  
3500: 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74 3b 20  int nSavepoint; 
3510: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3520: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
3530: 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e 74 5b  s in aSavepoint[
3540: 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62 46 69  ] */.  char dbFi
3550: 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20 20 20  leVers[16];     
3560: 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20 77 68     /* Changes wh
3570: 65 6e 65 76 65 72 20 64 61 74 61 62 61 73 65 20  enever database 
3580: 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a  file changes */.
3590: 20 20 75 33 32 20 73 65 63 74 6f 72 53 69 7a 65    u32 sectorSize
35a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
35b0: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
35c0: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
35d0: 62 61 63 6b 20 2a 2f 0a 0a 20 20 75 31 36 20 6e  back */..  u16 n
35e0: 45 78 74 72 61 3b 20 20 20 20 20 20 20 20 20 20  Extra;          
35f0: 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20 74 68         /* Add th
3600: 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 74 6f  is many bytes to
3610: 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   each in-memory 
3620: 70 61 67 65 20 2a 2f 0a 20 20 69 31 36 20 6e 52  page */.  i16 nR
3630: 65 73 65 72 76 65 3b 20 20 20 20 20 20 20 20 20  eserve;         
3640: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
3650: 6f 66 20 75 6e 75 73 65 64 20 62 79 74 65 73 20  of unused bytes 
3660: 61 74 20 65 6e 64 20 6f 66 20 65 61 63 68 20 70  at end of each p
3670: 61 67 65 20 2a 2f 0a 20 20 75 33 32 20 76 66 73  age */.  u32 vfs
3680: 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20  Flags;          
3690: 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66 6f       /* Flags fo
36a0: 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  r sqlite3_vfs.xO
36b0: 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 70  pen() */.  int p
36c0: 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20  ageSize;        
36d0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
36e0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20 70   of bytes in a p
36f0: 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78  age */.  Pgno mx
3700: 50 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  Pgno;           
3710: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
3720: 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20 6f 66 20  allowed size of 
3730: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
3740: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
3750: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3760: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
3770: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
3780: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
3790: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
37a0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
37b0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  al file */.  int
37c0: 20 28 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29   (*xBusyHandler)
37d0: 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46 75 6e 63  (void*); /* Func
37e0: 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20 77 68 65  tion to call whe
37f0: 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76 6f 69 64  n busy */.  void
3800: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 41 72   *pBusyHandlerAr
3810: 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f 6e 74 65  g;      /* Conte
3820: 78 74 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  xt argument for 
3830: 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  xBusyHandler */.
3840: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
3850: 53 54 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e  ST.  int nHit, n
3860: 4d 69 73 73 3b 20 20 20 20 20 20 20 20 20 20 20  Miss;           
3870: 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 20 61   /* Cache hits a
3880: 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f 0a 20 20  nd missing */.  
3890: 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57 72 69 74  int nRead, nWrit
38a0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  e;          /* D
38b0: 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65  atabase pages re
38c0: 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 23 65  ad/written */.#e
38d0: 6e 64 69 66 0a 20 20 76 6f 69 64 20 28 2a 78 52  ndif.  void (*xR
38e0: 65 69 6e 69 74 65 72 29 28 44 62 50 61 67 65 2a  einiter)(DbPage*
38f0: 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20  ); /* Call this 
3900: 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65 6c  routine when rel
3910: 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  oading pages */.
3920: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
3930: 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20 2a  S_CODEC.  void *
3940: 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
3950: 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b  void*,Pgno,int);
3960: 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72 20   /* Routine for 
3970: 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74 61  en/decoding data
3980: 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a 78 43 6f   */.  void (*xCo
3990: 64 65 63 53 69 7a 65 43 68 6e 67 29 28 76 6f 69  decSizeChng)(voi
39a0: 64 2a 2c 69 6e 74 2c 69 6e 74 29 3b 20 2f 2a 20  d*,int,int); /* 
39b0: 4e 6f 74 69 66 79 20 6f 66 20 70 61 67 65 20 73  Notify of page s
39c0: 69 7a 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 20  ize changes */. 
39d0: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46 72   void (*xCodecFr
39e0: 65 65 29 28 76 6f 69 64 2a 29 3b 20 20 20 20 20  ee)(void*);     
39f0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 74 72          /* Destr
3a00: 75 63 74 6f 72 20 66 6f 72 20 74 68 65 20 63 6f  uctor for the co
3a10: 64 65 63 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  dec */.  void *p
3a20: 43 6f 64 65 63 3b 20 20 20 20 20 20 20 20 20 20  Codec;          
3a30: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
3a40: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
3a50: 2e 2e 2e 20 6d 65 74 68 6f 64 73 20 2a 2f 0a 23  ... methods */.#
3a60: 65 6e 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54  endif.  char *pT
3a70: 6d 70 53 70 61 63 65 3b 20 20 20 20 20 20 20 20  mpSpace;        
3a80: 20 20 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67      /* Pager.pag
3a90: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73  eSize bytes of s
3aa0: 70 61 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65  pace for tmp use
3ab0: 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61   */.  i64 journa
3ac0: 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20 20  lSizeLimit;     
3ad0: 20 20 2f 2a 20 53 69 7a 65 20 6c 69 6d 69 74 20    /* Size limit 
3ae0: 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a  for persistent j
3af0: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a  ournal files */.
3b00: 20 20 50 43 61 63 68 65 20 2a 70 50 43 61 63 68    PCache *pPCach
3b10: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
3b20: 20 50 6f 69 6e 74 65 72 20 74 6f 20 70 61 67 65   Pointer to page
3b30: 20 63 61 63 68 65 20 6f 62 6a 65 63 74 20 2a 2f   cache object */
3b40: 0a 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75  .  sqlite3_backu
3b50: 70 20 2a 70 42 61 63 6b 75 70 3b 20 20 20 20 2f  p *pBackup;    /
3b60: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 6c 69 73  * Pointer to lis
3b70: 74 20 6f 66 20 6f 6e 67 6f 69 6e 67 20 62 61 63  t of ongoing bac
3b80: 6b 75 70 20 70 72 6f 63 65 73 73 65 73 20 2a 2f  kup processes */
3b90: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  .};../*.** The f
3ba0: 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20  ollowing global 
3bb0: 76 61 72 69 61 62 6c 65 73 20 68 6f 6c 64 20 63  variables hold c
3bc0: 6f 75 6e 74 65 72 73 20 75 73 65 64 20 66 6f 72  ounters used for
3bd0: 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70 75 72 70  .** testing purp
3be0: 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54 68 65 73  oses only.  Thes
3bf0: 65 20 76 61 72 69 61 62 6c 65 73 20 64 6f 20 6e  e variables do n
3c00: 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a 2a 20 61  ot exist in.** a
3c10: 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20 62 75 69   non-testing bui
3c20: 6c 64 2e 20 20 54 68 65 73 65 20 76 61 72 69 61  ld.  These varia
3c30: 62 6c 65 73 20 61 72 65 20 6e 6f 74 20 74 68 72  bles are not thr
3c40: 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a 23 69 66  ead-safe..*/.#if
3c50: 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
3c60: 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65  int sqlite3_page
3c70: 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e 74 20 3d  r_readdb_count =
3c80: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
3c90: 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 72   of full pages r
3ca0: 65 61 64 20 66 72 6f 6d 20 44 42 20 2a 2f 0a 69  ead from DB */.i
3cb0: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3cc0: 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 20 3d  _writedb_count =
3cd0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
3ce0: 6f 66 20 66 75 6c 6c 20 70 61 67 65 73 20 77 72  of full pages wr
3cf0: 69 74 74 65 6e 20 74 6f 20 44 42 20 2a 2f 0a 69  itten to DB */.i
3d00: 6e 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72  nt sqlite3_pager
3d10: 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 20 3d 20  _writej_count = 
3d20: 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20  0;    /* Number 
3d30: 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  of pages written
3d40: 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 23   to journal */.#
3d50: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
3d60: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
3d70: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
3d80: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
3d90: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
3da0: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
3db0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
3dc0: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
3dd0: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
3de0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
3df0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
3e00: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
3e10: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
3e20: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
3e30: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
3e40: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
3e50: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
3e60: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
3e70: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
3e80: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
3e90: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
3ea0: 72 6e 61 6c 20 69 73 20 62 65 69 6e 67 0a 2a 2a  rnal is being.**
3eb0: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
3ec0: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
3ed0: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
3ee0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
3ef0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
3f00: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
3f10: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
3f20: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
3f30: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
3f40: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
3f50: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
3f60: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
3f70: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
3f80: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
3f90: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
3fa0: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
3fb0: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
3fc0: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
3fd0: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
3fe0: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
3ff0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
4000: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
4010: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
4020: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
4030: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
4040: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
4050: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
4060: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
4070: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
4080: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
4090: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
40a0: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
40b0: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
40c0: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
40d0: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
40e0: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
40f0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
4100: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
4110: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
4120: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
4130: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
4140: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
4150: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
4160: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
4170: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
4180: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
4190: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
41a0: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
41b0: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
41c0: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
41d0: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
41e0: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
41f0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
4200: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
4210: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
4220: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
4230: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
4240: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
4250: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
4260: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
4270: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
4280: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
4290: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
42a0: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
42b0: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
42c0: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
42d0: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
42e0: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
42f0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
4300: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
4310: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
4320: 65 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 72  e of each page r
4330: 65 63 6f 72 64 20 69 6e 20 74 68 65 20 6a 6f 75  ecord in the jou
4340: 72 6e 61 6c 20 69 73 20 67 69 76 65 6e 20 62 79  rnal is given by
4350: 0a 2a 2a 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** the followin
4360: 67 20 6d 61 63 72 6f 2e 0a 2a 2f 0a 23 64 65 66  g macro..*/.#def
4370: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
4380: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
4390: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
43a0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
43b0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
43c0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
43d0: 72 2e 20 54 68 69 73 20 69 73 20 75 73 75 61 6c  r. This is usual
43e0: 6c 79 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  ly the same .** 
43f0: 73 69 7a 65 20 61 73 20 61 20 73 69 6e 67 6c 65  size as a single
4400: 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 53 65   disk sector. Se
4410: 65 20 61 6c 73 6f 20 73 65 74 53 65 63 74 6f 72  e also setSector
4420: 53 69 7a 65 28 29 2e 0a 2a 2f 0a 23 64 65 66 69  Size()..*/.#defi
4430: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
4440: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
4450: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
4460: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
4470: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
4480: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
4490: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
44a0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
44b0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
44c0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
44d0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
44e0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
44f0: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
4500: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
4510: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
4520: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
4530: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
4540: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
4550: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
4560: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
4570: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
4580: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
4590: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
45a0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
45b0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
45c0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
45d0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
45e0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
45f0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
4600: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
4610: 37 34 38 33 36 34 37 0a 0a 23 69 66 6e 64 65 66  7483647..#ifndef
4620: 20 4e 44 45 42 55 47 20 0a 2f 2a 0a 2a 2a 20 55   NDEBUG ./*.** U
4630: 73 61 67 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 61 73  sage:.**.**   as
4640: 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
4650: 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
4660: 20 29 3b 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   );.*/.static in
4670: 74 20 61 73 73 65 72 74 5f 70 61 67 65 72 5f 73  t assert_pager_s
4680: 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
4690: 65 72 29 7b 0a 0a 20 20 2f 2a 20 41 20 74 65 6d  er){..  /* A tem
46a0: 70 2d 66 69 6c 65 20 69 73 20 61 6c 77 61 79 73  p-file is always
46b0: 20 69 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53   in PAGER_EXCLUS
46c0: 49 56 45 20 6f 72 20 50 41 47 45 52 5f 53 59 4e  IVE or PAGER_SYN
46d0: 43 45 44 20 73 74 61 74 65 2e 20 2a 2f 0a 20 20  CED state. */.  
46e0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
46f0: 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c 20 70  tempFile==0 || p
4700: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
4710: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
4720: 0a 0a 20 20 2f 2a 20 54 68 65 20 63 68 61 6e 67  ..  /* The chang
4730: 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20  eCountDone flag 
4740: 69 73 20 61 6c 77 61 79 73 20 73 65 74 20 66 6f  is always set fo
4750: 72 20 74 65 6d 70 2d 66 69 6c 65 73 20 2a 2f 0a  r temp-files */.
4760: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
4770: 2d 3e 74 65 6d 70 46 69 6c 65 3d 3d 30 20 7c 7c  ->tempFile==0 ||
4780: 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43   pPager->changeC
4790: 6f 75 6e 74 44 6f 6e 65 20 29 3b 0a 0a 20 20 72  ountDone );..  r
47a0: 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69  eturn 1;.}.#endi
47b0: 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  f../*.** Return 
47c0: 74 72 75 65 20 69 66 20 69 74 20 69 73 20 6e 65  true if it is ne
47d0: 63 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65  cessary to write
47e0: 20 70 61 67 65 20 2a 70 50 67 20 69 6e 74 6f 20   page *pPg into 
47f0: 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e  the sub-journal.
4800: 0a 2a 2a 20 41 20 70 61 67 65 20 6e 65 65 64 73  .** A page needs
4810: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
4820: 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  nto the sub-jour
4830: 6e 61 6c 20 69 66 20 74 68 65 72 65 20 65 78 69  nal if there exi
4840: 73 74 73 20 6f 6e 65 0a 2a 2a 20 6f 72 20 6d 6f  sts one.** or mo
4850: 72 65 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e  re open savepoin
4860: 74 73 20 66 6f 72 20 77 68 69 63 68 3a 0a 2a 2a  ts for which:.**
4870: 0a 2a 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65  .**   * The page
4880: 2d 6e 75 6d 62 65 72 20 69 73 20 6c 65 73 73 20  -number is less 
4890: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
48a0: 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
48b0: 6e 4f 72 69 67 2c 20 61 6e 64 0a 2a 2a 20 20 20  nOrig, and.**   
48c0: 2a 20 54 68 65 20 62 69 74 20 63 6f 72 72 65 73  * The bit corres
48d0: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 70  ponding to the p
48e0: 61 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 6e 6f  age-number is no
48f0: 74 20 73 65 74 20 69 6e 0a 2a 2a 20 20 20 20 20  t set in.**     
4900: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 70  PagerSavepoint.p
4910: 49 6e 53 61 76 65 70 6f 69 6e 74 2e 0a 2a 2f 0a  InSavepoint..*/.
4920: 73 74 61 74 69 63 20 69 6e 74 20 73 75 62 6a 52  static int subjR
4930: 65 71 75 69 72 65 73 50 61 67 65 28 50 67 48 64  equiresPage(PgHd
4940: 72 20 2a 70 50 67 29 7b 0a 20 20 50 67 6e 6f 20  r *pPg){.  Pgno 
4950: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
4960: 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
4970: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
4980: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
4990: 69 3d 30 3b 20 69 3c 70 50 61 67 65 72 2d 3e 6e  i=0; i<pPager->n
49a0: 53 61 76 65 70 6f 69 6e 74 3b 20 69 2b 2b 29 7b  Savepoint; i++){
49b0: 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
49c0: 69 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72  int *p = &pPager
49d0: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 5d 3b  ->aSavepoint[i];
49e0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 4f 72 69  .    if( p->nOri
49f0: 67 3e 3d 70 67 6e 6f 20 26 26 20 30 3d 3d 73 71  g>=pgno && 0==sq
4a00: 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
4a10: 70 2d 3e 70 49 6e 53 61 76 65 70 6f 69 6e 74 2c  p->pInSavepoint,
4a20: 20 70 67 6e 6f 29 20 29 7b 0a 20 20 20 20 20 20   pgno) ){.      
4a30: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
4a40: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4a50: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
4a60: 74 72 75 65 20 69 66 20 74 68 65 20 70 61 67 65  true if the page
4a70: 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
4a80: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
4a90: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
4aa0: 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 50 67 48  ageInJournal(PgH
4ab0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75  dr *pPg){.  retu
4ac0: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
4ad0: 54 65 73 74 28 70 50 67 2d 3e 70 50 61 67 65 72  Test(pPg->pPager
4ae0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50  ->pInJournal, pP
4af0: 67 2d 3e 70 67 6e 6f 29 3b 0a 7d 0a 0a 2f 2a 0a  g->pgno);.}../*.
4b00: 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69 74  ** Read a 32-bit
4b10: 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68   integer from th
4b20: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4b30: 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20  criptor.  Store 
4b40: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74  the integer.** t
4b50: 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a  hat is read in *
4b60: 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51  pRes.  Return SQ
4b70: 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
4b80: 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72  thing worked, or
4b90: 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64   an.** error cod
4ba0: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4bb0: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a  oes wrong..**.**
4bc0: 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20   All values are 
4bd0: 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61  stored on disk a
4be0: 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f  s big-endian..*/
4bf0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
4c00: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
4c10: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
4c20: 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b  set, u32 *pRes){
4c30: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
4c40: 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63   ac[4];.  int rc
4c50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
4c60: 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28  (fd, ac, sizeof(
4c70: 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ac), offset);.  
4c80: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4c90: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
4ca0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
4cb0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
4cc0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4cd0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4ce0: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
4cf0: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
4d00: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
4d10: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
4d20: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
4d30: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
4d40: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
4d50: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
4d60: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
4d70: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
4d80: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
4d90: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
4da0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
4db0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
4dc0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
4dd0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
4de0: 20 77 72 69 74 65 33 32 62 69 74 73 28 73 71 6c   write32bits(sql
4df0: 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69  ite3_file *fd, i
4e00: 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76  64 offset, u32 v
4e10: 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34  al){.  char ac[4
4e20: 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 61  ];.  put32bits(a
4e30: 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72  c, val);.  retur
4e40: 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  n sqlite3OsWrite
4e50: 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73  (fd, ac, 4, offs
4e60: 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  et);.}../*.** Th
4e70: 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  e argument to th
4e80: 69 73 20 6d 61 63 72 6f 20 69 73 20 61 20 66 69  is macro is a fi
4e90: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 28 74  le descriptor (t
4ea0: 79 70 65 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ype sqlite3_file
4eb0: 2a 29 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  *)..** Return 0 
4ec0: 69 66 20 69 74 20 69 73 20 6e 6f 74 20 6f 70 65  if it is not ope
4ed0: 6e 2c 20 6f 72 20 6e 6f 6e 2d 7a 65 72 6f 20 28  n, or non-zero (
4ee0: 62 75 74 20 6e 6f 74 20 31 29 20 69 66 20 69 74  but not 1) if it
4ef0: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
4f00: 69 73 20 73 6f 20 74 68 61 74 20 65 78 70 72 65  is so that expre
4f10: 73 73 69 6f 6e 73 20 63 61 6e 20 62 65 20 77 72  ssions can be wr
4f20: 69 74 74 65 6e 20 61 73 3a 0a 2a 2a 0a 2a 2a 20  itten as:.**.** 
4f30: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
4f40: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 20 2e 2e 2e  ger->jfd) ){ ...
4f50: 0a 2a 2a 0a 2a 2a 20 69 6e 73 74 65 61 64 20 6f  .**.** instead o
4f60: 66 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 70 50  f.**.**   if( pP
4f70: 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68  ager->jfd->pMeth
4f80: 6f 64 73 20 29 7b 20 2e 2e 2e 0a 2a 2f 0a 23 64  ods ){ ....*/.#d
4f90: 65 66 69 6e 65 20 69 73 4f 70 65 6e 28 70 46 64  efine isOpen(pFd
4fa0: 29 20 28 28 70 46 64 29 2d 3e 70 4d 65 74 68 6f  ) ((pFd)->pMetho
4fb0: 64 73 29 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69  ds)../*.** If fi
4fc0: 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c 20  le pFd is open, 
4fd0: 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e  call sqlite3OsUn
4fe0: 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f  lock() on it..*/
4ff0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55 6e  .static int osUn
5000: 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c  lock(sqlite3_fil
5010: 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63  e *pFd, int eLoc
5020: 6b 29 7b 0a 20 20 69 66 28 20 21 69 73 4f 70 65  k){.  if( !isOpe
5030: 6e 28 70 46 64 29 20 29 7b 0a 20 20 20 20 72 65  n(pFd) ){.    re
5040: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5050: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
5060: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64  ite3OsUnlock(pFd
5070: 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a  , eLock);.}../*.
5080: 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
5090: 20 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74   determines whet
50a0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61  her or not the a
50b0: 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
50c0: 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  mization.** can 
50d0: 62 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69  be used with thi
50e0: 73 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74  s pager. The opt
50f0: 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
5100: 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20   used if:.**.** 
5110: 20 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72   (a) the value r
5120: 65 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76  eturned by OsDev
5130: 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
5140: 63 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74  cs() indicates t
5150: 68 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61  hat.**      a da
5160: 74 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20  tabase page may 
5170: 62 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69  be written atomi
5180: 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28  cally, and.**  (
5190: 62 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  b) the value ret
51a0: 75 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f  urned by OsSecto
51b0: 72 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20  rSize() is less 
51c0: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a  than or equal.**
51d0: 20 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67        to the pag
51e0: 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  e size..**.** Th
51f0: 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
5200: 73 20 61 6c 73 6f 20 61 6c 77 61 79 73 20 65 6e  s also always en
5210: 61 62 6c 65 64 20 66 6f 72 20 74 65 6d 70 6f 72  abled for tempor
5220: 61 72 79 20 66 69 6c 65 73 2e 20 49 74 20 69 73  ary files. It is
5230: 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20 74 6f 20  .** an error to 
5240: 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69  call this functi
5250: 6f 6e 20 69 66 20 70 50 61 67 65 72 20 69 73 20  on if pPager is 
5260: 6f 70 65 6e 65 64 20 6f 6e 20 61 6e 20 69 6e 2d  opened on an in-
5270: 6d 65 6d 6f 72 79 0a 2a 2a 20 64 61 74 61 62 61  memory.** databa
5280: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
5290: 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61   optimization ca
52a0: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20 30 20  nnot be used, 0 
52b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20  is returned. If 
52c0: 69 74 20 63 61 6e 20 62 65 20 75 73 65 64 2c 0a  it can be used,.
52d0: 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75  ** then the valu
52e0: 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74 68  e returned is th
52f0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
5300: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
5310: 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 72  it.** contains r
5320: 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66 6f 72  ollback data for
5330: 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67   exactly one pag
5340: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
5350: 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
5360: 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63 20 69  C_WRITE.static i
5370: 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a  nt jrnlBufferSiz
5380: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
5390: 7b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  {.  assert( !MEM
53a0: 44 42 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61  DB );.  if( !pPa
53b0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
53c0: 0a 20 20 20 20 69 6e 74 20 64 63 3b 20 20 20 20  .    int dc;    
53d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
53e0: 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63 65         /* Device
53f0: 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63 73   characteristics
5400: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65 63   */.    int nSec
5410: 74 6f 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  tor;            
5420: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 63            /* Sec
5430: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  tor size */.    
5440: 69 6e 74 20 73 7a 50 61 67 65 3b 20 20 20 20 20  int szPage;     
5450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5460: 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a    /* Page size *
5470: 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20 69  /..    assert( i
5480: 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
5490: 29 20 29 3b 0a 20 20 20 20 64 63 20 3d 20 73 71  ) );.    dc = sq
54a0: 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
54b0: 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
54c0: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 6e 53  ger->fd);.    nS
54d0: 65 63 74 6f 72 20 3d 20 70 50 61 67 65 72 2d 3e  ector = pPager->
54e0: 73 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20  sectorSize;.    
54f0: 73 7a 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d  szPage = pPager-
5500: 3e 70 61 67 65 53 69 7a 65 3b 0a 0a 20 20 20 20  >pageSize;..    
5510: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
5520: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
5530: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 61 73  512>>8));.    as
5540: 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41  sert(SQLITE_IOCA
5550: 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35  P_ATOMIC64K==(65
5560: 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 69 66  536>>8));.    if
5570: 28 20 30 3d 3d 28 64 63 26 28 53 51 4c 49 54 45  ( 0==(dc&(SQLITE
5580: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 73  _IOCAP_ATOMIC|(s
5590: 7a 50 61 67 65 3e 3e 38 29 29 20 7c 7c 20 6e 53  zPage>>8)) || nS
55a0: 65 63 74 6f 72 3e 73 7a 50 61 67 65 29 20 29 7b  ector>szPage) ){
55b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
55c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65  .    }.  }..  re
55d0: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
55e0: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
55f0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
5600: 65 72 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  er);.}.#endif../
5610: 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f 43  *.** If SQLITE_C
5620: 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64 65  HECK_PAGES is de
5630: 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64 6f  fined then we do
5640: 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68 65   some sanity che
5650: 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65 20  cking.** on the 
5660: 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68 61  cache using a ha
5670: 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54 68  sh function.  Th
5680: 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20 74  is is used for t
5690: 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64 65  esting.** and de
56a0: 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a 2f  bugging only..*/
56b0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
56c0: 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a 2a  HECK_PAGES./*.**
56d0: 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69 74   Return a 32-bit
56e0: 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61 67   hash of the pag
56f0: 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67 65  e data for pPage
5700: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
5710: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 69  pager_datahash(i
5720: 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67 6e  nt nByte, unsign
5730: 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29 7b  ed char *pData){
5740: 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30 3b  .  u32 hash = 0;
5750: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
5760: 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69 2b  i=0; i<nByte; i+
5770: 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20 28  +){.    hash = (
5780: 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44 61  hash*1039) + pDa
5790: 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65 74  ta[i];.  }.  ret
57a0: 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61 74  urn hash;.}.stat
57b0: 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61 67  ic u32 pager_pag
57c0: 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50 61  ehash(PgHdr *pPa
57d0: 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 61  ge){.  return pa
57e0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50 61  ger_datahash(pPa
57f0: 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65  ge->pPager->page
5800: 53 69 7a 65 2c 20 28 75 6e 73 69 67 6e 65 64 20  Size, (unsigned 
5810: 63 68 61 72 20 2a 29 70 50 61 67 65 2d 3e 70 44  char *)pPage->pD
5820: 61 74 61 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  ata);.}.static v
5830: 6f 69 64 20 70 61 67 65 72 5f 73 65 74 5f 70 61  oid pager_set_pa
5840: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
5850: 61 67 65 29 7b 0a 20 20 70 50 61 67 65 2d 3e 70  age){.  pPage->p
5860: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
5870: 70 61 67 65 68 61 73 68 28 70 50 61 67 65 29 3b  pagehash(pPage);
5880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
5890: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
58a0: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
58b0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
58c0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
58d0: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
58e0: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
58f0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
5900: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
5910: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
5920: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
5930: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
5940: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
5950: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
5960: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
5970: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
5980: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
5990: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
59a0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
59b0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
59c0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
59d0: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
59e0: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
59f0: 72 2d 3e 65 72 72 43 6f 64 65 0a 20 20 20 20 20  r->errCode.     
5a00: 20 7c 7c 20 28 70 50 67 2d 3e 66 6c 61 67 73 26   || (pPg->flags&
5a10: 50 47 48 44 52 5f 44 49 52 54 59 29 20 7c 7c 20  PGHDR_DIRTY) || 
5a20: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 3d 3d 70  pPg->pageHash==p
5a30: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
5a40: 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23  g) );.}..#else.#
5a50: 64 65 66 69 6e 65 20 70 61 67 65 72 5f 64 61 74  define pager_dat
5a60: 61 68 61 73 68 28 58 2c 59 29 20 20 30 0a 23 64  ahash(X,Y)  0.#d
5a70: 65 66 69 6e 65 20 70 61 67 65 72 5f 70 61 67 65  efine pager_page
5a80: 68 61 73 68 28 58 29 20 20 30 0a 23 64 65 66 69  hash(X)  0.#defi
5a90: 6e 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29  ne CHECK_PAGE(x)
5aa0: 0a 23 65 6e 64 69 66 20 20 2f 2a 20 53 51 4c 49  .#endif  /* SQLI
5ab0: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 2a  TE_CHECK_PAGES *
5ac0: 2f 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  /../*.** When th
5ad0: 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65  is is called the
5ae0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
5af0: 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d  r pager pPager m
5b00: 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20  ust be open..** 
5b10: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 74  This function at
5b20: 74 65 6d 70 74 73 20 74 6f 20 72 65 61 64 20 61  tempts to read a
5b30: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5b40: 66 69 6c 65 20 6e 61 6d 65 20 66 72 6f 6d 20 74  file name from t
5b50: 68 65 20 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68  he .** end of th
5b60: 65 20 66 69 6c 65 20 61 6e 64 2c 20 69 66 20 73  e file and, if s
5b70: 75 63 63 65 73 73 66 75 6c 2c 20 63 6f 70 69 65  uccessful, copie
5b80: 73 20 69 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  s it into memory
5b90: 20 73 75 70 70 6c 69 65 64 20 0a 2a 2a 20 62 79   supplied .** by
5ba0: 20 74 68 65 20 63 61 6c 6c 65 72 2e 20 53 65 65   the caller. See
5bb0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
5bc0: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
5bd0: 61 6c 28 29 20 66 6f 72 20 74 68 65 20 66 6f 72  al() for the for
5be0: 6d 61 74 0a 2a 2a 20 75 73 65 64 20 74 6f 20 73  mat.** used to s
5bf0: 74 6f 72 65 20 61 20 6d 61 73 74 65 72 20 6a 6f  tore a master jo
5c00: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5c10: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
5c20: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a  journal file..**
5c30: 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74  .** zMaster must
5c40: 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
5c50: 65 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e  er of at least n
5c60: 4d 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c  Master bytes all
5c70: 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65  ocated by.** the
5c80: 20 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68   caller. This sh
5c90: 6f 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f  ould be sqlite3_
5ca0: 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  vfs.mxPathname+1
5cb0: 20 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72   (to ensure ther
5cc0: 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73  e is.** enough s
5cd0: 70 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68  pace to write th
5ce0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
5cf0: 20 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d   name). If the m
5d00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
5d10: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75   name in the jou
5d20: 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74  rnal is longer t
5d30: 68 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65  han nMaster byte
5d40: 73 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a  s (including a.*
5d50: 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  * nul-terminator
5d60: 29 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  ), then this is 
5d70: 68 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f  handled as if no
5d80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
5d90: 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65  name.** were pre
5da0: 73 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  sent in the jour
5db0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  nal..**.** If a 
5dc0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5dd0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
5de0: 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ent at the end o
5df0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  f the journal.**
5e00: 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 69   file, then it i
5e10: 73 20 63 6f 70 69 65 64 20 69 6e 74 6f 20 74 68  s copied into th
5e20: 65 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64  e buffer pointed
5e30: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 2e 20   to by zMaster. 
5e40: 41 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  A.** nul-termina
5e50: 74 6f 72 20 62 79 74 65 20 69 73 20 61 70 70 65  tor byte is appe
5e60: 6e 64 65 64 20 74 6f 20 74 68 65 20 62 75 66 66  nded to the buff
5e70: 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65  er following the
5e80: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
5e90: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 2e 0a 2a 2a  al file name..**
5ea0: 0a 2a 2a 20 49 66 20 69 74 20 69 73 20 64 65 74  .** If it is det
5eb0: 65 72 6d 69 6e 65 64 20 74 68 61 74 20 6e 6f 20  ermined that no 
5ec0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
5ed0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
5ee0: 65 6e 74 20 0a 2a 2a 20 7a 4d 61 73 74 65 72 5b  ent .** zMaster[
5ef0: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
5f00: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
5f10: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
5f20: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20  an error occurs 
5f30: 77 68 69 6c 65 20 72 65 61 64 69 6e 67 20 66 72  while reading fr
5f40: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
5f50: 69 6c 65 2c 20 61 6e 20 53 51 4c 69 74 65 0a 2a  ile, an SQLite.*
5f60: 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  * error code is 
5f70: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
5f80: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
5f90: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
5fa0: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
5fb0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 75 33  har *zMaster, u3
5fc0: 32 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  2 nMaster){.  in
5fd0: 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
5fe0: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
5ff0: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 33 32  rn code */.  u32
6000: 20 6c 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20   len;           
6010: 20 20 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74          /* Lengt
6020: 68 20 69 6e 20 62 79 74 65 73 20 6f 66 20 6d 61  h in bytes of ma
6030: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
6040: 65 20 2a 2f 0a 20 20 69 36 34 20 73 7a 4a 3b 20  e */.  i64 szJ; 
6050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6060: 20 20 2f 2a 20 54 6f 74 61 6c 20 73 69 7a 65 20    /* Total size 
6070: 69 6e 20 62 79 74 65 73 20 6f 66 20 6a 6f 75 72  in bytes of jour
6080: 6e 61 6c 20 66 69 6c 65 20 70 4a 72 6e 6c 20 2a  nal file pJrnl *
6090: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
60a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
60b0: 2a 20 4d 4a 20 63 68 65 63 6b 73 75 6d 20 76 61  * MJ checksum va
60c0: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 6a 6f  lue read from jo
60d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 75  urnal */.  u32 u
60e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
60f0: 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
6100: 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
6110: 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  /.  unsigned cha
6120: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 20 20 2f  r aMagic[8];   /
6130: 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f  * A buffer to ho
6140: 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61  ld the magic hea
6150: 64 65 72 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72  der */.  zMaster
6160: 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 69  [0] = '\0';..  i
6170: 66 28 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  f( SQLITE_OK!=(r
6180: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
6190: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
61a0: 4a 29 29 0a 20 20 20 7c 7c 20 73 7a 4a 3c 31 36  J)).   || szJ<16
61b0: 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  .   || SQLITE_OK
61c0: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
61d0: 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36  ts(pJrnl, szJ-16
61e0: 2c 20 26 6c 65 6e 29 29 0a 20 20 20 7c 7c 20 6c  , &len)).   || l
61f0: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 0a 20 20 20  en>=nMaster .   
6200: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
6210: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
6220: 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63  Jrnl, szJ-12, &c
6230: 6b 73 75 6d 29 29 0a 20 20 20 7c 7c 20 53 51 4c  ksum)).   || SQL
6240: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71  ITE_OK!=(rc = sq
6250: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
6260: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a  l, aMagic, 8, sz
6270: 4a 2d 38 29 29 0a 20 20 20 7c 7c 20 6d 65 6d 63  J-8)).   || memc
6280: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
6290: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 0a 20 20 20  nalMagic, 8).   
62a0: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
62b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
62c0: 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72  d(pJrnl, zMaster
62d0: 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65  , len, szJ-16-le
62e0: 6e 29 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74  n)).  ){.    ret
62f0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f  urn rc;.  }..  /
6300: 2a 20 53 65 65 20 69 66 20 74 68 65 20 63 68 65  * See if the che
6310: 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20 74 68  cksum matches th
6320: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
6330: 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72 28 75   name */.  for(u
6340: 3d 30 3b 20 75 3c 6c 65 6e 3b 20 75 2b 2b 29 7b  =0; u<len; u++){
6350: 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20 7a 4d  .    cksum -= zM
6360: 61 73 74 65 72 5b 75 5d 3b 0a 20 20 7d 0a 20 20  aster[u];.  }.  
6370: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
6380: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
6390: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
63a0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
63b0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
63c0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
63d0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
63e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
63f0: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
6400: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
6410: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
6420: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
6430: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
6440: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
6450: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
6460: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
6470: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
6480: 20 20 20 20 6c 65 6e 20 3d 20 30 3b 0a 20 20 7d      len = 0;.  }
6490: 0a 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20  .  zMaster[len] 
64a0: 3d 20 27 5c 30 27 3b 0a 20 20 20 0a 20 20 72 65  = '\0';.   .  re
64b0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
64c0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
64d0: 74 68 65 20 6f 66 66 73 65 74 20 6f 66 20 74 68  the offset of th
64e0: 65 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  e sector boundar
64f0: 79 20 61 74 20 6f 72 20 69 6d 6d 65 64 69 61 74  y at or immediat
6500: 65 6c 79 20 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e  ely .** followin
6510: 67 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 70  g the value in p
6520: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6530: 66 2c 20 61 73 73 75 6d 69 6e 67 20 61 20 73 65  f, assuming a se
6540: 63 74 6f 72 20 0a 2a 2a 20 73 69 7a 65 20 6f 66  ctor .** size of
6550: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
6560: 69 7a 65 20 62 79 74 65 73 2e 0a 2a 2a 0a 2a 2a  ize bytes..**.**
6570: 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f   i.e for a secto
6580: 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a  r size of 512:.*
6590: 2a 0a 2a 2a 20 20 20 50 61 67 65 72 2e 6a 6f 75  *.**   Pager.jou
65a0: 72 6e 61 6c 4f 66 66 20 20 20 20 20 20 20 20 20  rnalOff         
65b0: 20 52 65 74 75 72 6e 20 76 61 6c 75 65 0a 2a 2a   Return value.**
65c0: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d     -------------
65d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
65e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 20 20  ----------.**   
65f0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
6600: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 20            0.**  
6610: 20 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20   512            
6620: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
6630: 2a 20 20 20 31 30 30 20 20 20 20 20 20 20 20 20  *   100         
6640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
6650: 32 0a 2a 2a 20 20 20 32 30 30 30 20 20 20 20 20  2.**   2000     
6660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6670: 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61   2048.** .*/.sta
6680: 74 69 63 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48  tic i64 journalH
6690: 64 72 4f 66 66 73 65 74 28 50 61 67 65 72 20 2a  drOffset(Pager *
66a0: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
66b0: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
66c0: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
66d0: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
66e0: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
66f0: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
6700: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
6710: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
6720: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
6730: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
6740: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
6750: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
6760: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
6770: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
6780: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
6790: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
67a0: 72 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 6f  r) );.  return o
67b0: 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ffset;.}../*.** 
67c0: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
67d0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
67e0: 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
67f0: 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
6800: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
6810: 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68  is a no-op if th
6820: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
6830: 61 73 20 6e 6f 74 20 62 65 65 6e 20 77 72 69 74  as not been writ
6840: 74 65 6e 20 74 6f 0a 2a 2a 20 77 69 74 68 69 6e  ten to.** within
6850: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61   the current tra
6860: 6e 73 61 63 74 69 6f 6e 20 28 69 2e 65 2e 20 69  nsaction (i.e. i
6870: 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f  f Pager.journalO
6880: 66 66 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ff==0)..**.** If
6890: 20 64 6f 54 72 75 6e 63 61 74 65 20 69 73 20 6e   doTruncate is n
68a0: 6f 6e 2d 7a 65 72 6f 20 6f 72 20 74 68 65 20 50  on-zero or the P
68b0: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65  ager.journalSize
68c0: 4c 69 6d 69 74 20 76 61 72 69 61 62 6c 65 20 69  Limit variable i
68d0: 73 0a 2a 2a 20 73 65 74 20 74 6f 20 30 2c 20 74  s.** set to 0, t
68e0: 68 65 6e 20 74 72 75 6e 63 61 74 65 20 74 68 65  hen truncate the
68f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f   journal file to
6900: 20 7a 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73   zero bytes in s
6910: 69 7a 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a  ize. Otherwise,.
6920: 2a 2a 20 7a 65 72 6f 20 74 68 65 20 32 38 2d 62  ** zero the 28-b
6930: 79 74 65 20 68 65 61 64 65 72 20 61 74 20 74 68  yte header at th
6940: 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
6950: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 6e 20  ournal file. In 
6960: 65 69 74 68 65 72 20 63 61 73 65 2c 20 0a 2a 2a  either case, .**
6970: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 69 73   if the pager is
6980: 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20   not in no-sync 
6990: 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
69a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6d 6d 65  ournal file imme
69b0: 64 69 61 74 65 6c 79 20 0a 2a 2a 20 61 66 74 65  diately .** afte
69c0: 72 20 77 72 69 74 69 6e 67 20 6f 72 20 74 72 75  r writing or tru
69d0: 6e 63 61 74 69 6e 67 20 69 74 2e 0a 2a 2a 0a 2a  ncating it..**.*
69e0: 2a 20 49 66 20 50 61 67 65 72 2e 6a 6f 75 72 6e  * If Pager.journ
69f0: 61 6c 53 69 7a 65 4c 69 6d 69 74 20 69 73 20 73  alSizeLimit is s
6a00: 65 74 20 74 6f 20 61 20 70 6f 73 69 74 69 76 65  et to a positive
6a10: 2c 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65  , non-zero value
6a20: 2c 20 61 6e 64 0a 2a 2a 20 66 6f 6c 6c 6f 77 69  , and.** followi
6a30: 6e 67 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f  ng the truncatio
6a40: 6e 20 6f 72 20 7a 65 72 6f 69 6e 67 20 64 65 73  n or zeroing des
6a50: 63 72 69 62 65 64 20 61 62 6f 76 65 20 74 68 65  cribed above the
6a60: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 0a 2a 2a   size of the .**
6a70: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
6a80: 20 62 79 74 65 73 20 69 73 20 6c 61 72 67 65 72   bytes is larger
6a90: 20 74 68 61 6e 20 74 68 69 73 20 76 61 6c 75 65   than this value
6aa0: 2c 20 74 68 65 6e 20 74 72 75 6e 63 61 74 65 20  , then truncate 
6ab0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
6ac0: 69 6c 65 20 74 6f 20 50 61 67 65 72 2e 6a 6f 75  ile to Pager.jou
6ad0: 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 62 79  rnalSizeLimit by
6ae0: 74 65 73 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  tes. The journal
6af0: 20 66 69 6c 65 20 64 6f 65 73 0a 2a 2a 20 6e 6f   file does.** no
6b00: 74 20 6e 65 65 64 20 74 6f 20 62 65 20 73 79 6e  t need to be syn
6b10: 63 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ced following th
6b20: 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a  is operation..**
6b30: 0a 2a 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72  .** If an IO err
6b40: 6f 72 20 6f 63 63 75 72 73 2c 20 61 62 61 6e 64  or occurs, aband
6b50: 6f 6e 20 70 72 6f 63 65 73 73 69 6e 67 20 61 6e  on processing an
6b60: 64 20 72 65 74 75 72 6e 20 74 68 65 20 49 4f 20  d return the IO 
6b70: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 20 4f  error code..** O
6b80: 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
6b90: 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73   SQLITE_OK..*/.s
6ba0: 74 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f  tatic int zeroJo
6bb0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
6bc0: 70 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72  pPager, int doTr
6bd0: 75 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72  uncate){.  int r
6be0: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
6bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6c10: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
6c20: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
6c30: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
6c40: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
6c50: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
6c60: 63 6f 6e 73 74 20 69 36 34 20 69 4c 69 6d 69 74  const i64 iLimit
6c70: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
6c80: 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 20 20 20 20  alSizeLimit;    
6c90: 2f 2a 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f  /* Local cache o
6ca0: 66 20 6a 73 6c 20 2a 2f 0a 0a 20 20 20 20 49 4f  f jsl */..    IO
6cb0: 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48 44 52  TRACE(("JZEROHDR
6cc0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
6cd0: 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75 6e 63  .    if( doTrunc
6ce0: 61 74 65 20 7c 7c 20 69 4c 69 6d 69 74 3d 3d 30  ate || iLimit==0
6cf0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
6d00: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
6d10: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
6d20: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
6d30: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
6d40: 63 68 61 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d  char zeroHdr[28]
6d50: 20 3d 20 7b 30 7d 3b 0a 20 20 20 20 20 20 72 63   = {0};.      rc
6d60: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
6d70: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a  e(pPager->jfd, z
6d80: 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f 66 28 7a  eroHdr, sizeof(z
6d90: 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a 20 20 20  eroHdr), 0);.   
6da0: 20 7d 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53   }.    if( rc==S
6db0: 51 4c 49 54 45 5f 4f 4b 20 26 26 20 21 70 50 61  QLITE_OK && !pPa
6dc0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
6dd0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6de0: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
6df0: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
6e00: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
6e10: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
6e20: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 74 20     }..    /* At 
6e30: 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 20 74  this point the t
6e40: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f  ransaction is co
6e50: 6d 6d 69 74 74 65 64 20 62 75 74 20 74 68 65 20  mmitted but the 
6e60: 77 72 69 74 65 20 6c 6f 63 6b 20 0a 20 20 20 20  write lock .    
6e70: 2a 2a 20 69 73 20 73 74 69 6c 6c 20 68 65 6c 64  ** is still held
6e80: 20 6f 6e 20 74 68 65 20 66 69 6c 65 2e 20 49 66   on the file. If
6e90: 20 74 68 65 72 65 20 69 73 20 61 20 73 69 7a 65   there is a size
6ea0: 20 6c 69 6d 69 74 20 63 6f 6e 66 69 67 75 72 65   limit configure
6eb0: 64 20 66 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  d for .    ** th
6ec0: 65 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f 75  e persistent jou
6ed0: 72 6e 61 6c 20 61 6e 64 20 74 68 65 20 6a 6f 75  rnal and the jou
6ee0: 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65 6e  rnal file curren
6ef0: 74 6c 79 20 63 6f 6e 73 75 6d 65 73 20 6d 6f 72  tly consumes mor
6f00: 65 0a 20 20 20 20 2a 2a 20 73 70 61 63 65 20 74  e.    ** space t
6f10: 68 61 6e 20 74 68 61 74 20 6c 69 6d 69 74 20 61  han that limit a
6f20: 6c 6c 6f 77 73 20 66 6f 72 2c 20 74 72 75 6e 63  llows for, trunc
6f30: 61 74 65 20 69 74 20 6e 6f 77 2e 20 54 68 65 72  ate it now. Ther
6f40: 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a 20 20 20  e is no need.   
6f50: 20 2a 2a 20 74 6f 20 73 79 6e 63 20 74 68 65 20   ** to sync the 
6f60: 66 69 6c 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  file following t
6f70: 68 69 73 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20  his operation.. 
6f80: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63     */.    if( rc
6f90: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69  ==SQLITE_OK && i
6fa0: 4c 69 6d 69 74 3e 30 20 29 7b 0a 20 20 20 20 20  Limit>0 ){.     
6fb0: 20 69 36 34 20 73 7a 3b 0a 20 20 20 20 20 20 72   i64 sz;.      r
6fc0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
6fd0: 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
6fe0: 64 2c 20 26 73 7a 29 3b 0a 20 20 20 20 20 20 69  d, &sz);.      i
6ff0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
7000: 20 26 26 20 73 7a 3e 69 4c 69 6d 69 74 20 29 7b   && sz>iLimit ){
7010: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
7020: 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
7030: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4c 69  pPager->jfd, iLi
7040: 6d 69 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mit);.      }.  
7050: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7060: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   rc;.}../*.** Th
7070: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d  e journal file m
7080: 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e  ust be open when
7090: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
70a0: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
70b0: 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f  al.** header (JO
70c0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
70d0: 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20 69  es) is written i
70e0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
70f0: 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63  file at the.** c
7100: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
7110: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61  .**.** The forma
7120: 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  t for the journa
7130: 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20 66  l header is as f
7140: 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62  ollows:.** - 8 b
7150: 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e  ytes: Magic iden
7160: 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20  tifying journal 
7170: 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62  format..** - 4 b
7180: 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20  ytes: Number of 
7190: 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e  records in journ
71a0: 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e  al, or -1 no-syn
71b0: 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a  c mode is on..**
71c0: 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64   - 4 bytes: Rand
71d0: 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66  om number used f
71e0: 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a  or page hash..**
71f0: 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74   - 4 bytes: Init
7200: 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61 67  ial database pag
7210: 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20  e count..** - 4 
7220: 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69  bytes: Sector si
7230: 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20 70  ze used by the p
7240: 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74  rocess that wrot
7250: 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a  e this journal..
7260: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44 61  ** - 4 bytes: Da
7270: 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
7280: 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65  ..** .** Followe
7290: 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  d by (JOURNAL_HD
72a0: 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65 73  R_SZ - 28) bytes
72b0: 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65   of unused space
72c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
72d0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
72e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
72f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
7300: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
7310: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
7320: 63 6f 64 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  code */.  char *
7330: 7a 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72  zHeader = pPager
7340: 2d 3e 70 54 6d 70 53 70 61 63 65 3b 20 20 2f 2a  ->pTmpSpace;  /*
7350: 20 54 65 6d 70 6f 72 61 72 79 20 73 70 61 63 65   Temporary space
7360: 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20 68   used to build h
7370: 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20 6e  eader */.  u32 n
7380: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
7390: 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 2f  >pageSize;     /
73a0: 2a 20 53 69 7a 65 20 6f 66 20 62 75 66 66 65 72  * Size of buffer
73b0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
73c0: 48 65 61 64 65 72 20 2a 2f 0a 20 20 75 33 32 20  Header */.  u32 
73d0: 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20 20 20  nWrite;         
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 2f 2a 20 42 79 74 65 73 20 6f 66 20 68 65 61 64  /* Bytes of head
7400: 65 72 20 73 65 63 74 6f 72 20 77 72 69 74 74 65  er sector writte
7410: 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 69 3b 20 20  n */.  int ii;  
7420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
7440: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20  op counter */.. 
7450: 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
7460: 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20  pPager->jfd) ); 
7470: 20 20 20 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20       /* Journal 
7480: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
7490: 6e 2e 20 2a 2f 0a 0a 20 20 69 66 28 20 6e 48 65  n. */..  if( nHe
74a0: 61 64 65 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52  ader>JOURNAL_HDR
74b0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20  _SZ(pPager) ){. 
74c0: 20 20 20 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55     nHeader = JOU
74d0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
74e0: 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
74f0: 66 20 74 68 65 72 65 20 61 72 65 20 61 63 74 69  f there are acti
7500: 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61 6e  ve savepoints an
7510: 64 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 77 65  d any of them we
7520: 72 65 20 63 72 65 61 74 65 64 20 0a 20 20 2a 2a  re created .  **
7530: 20 73 69 6e 63 65 20 74 68 65 20 6d 6f 73 74 20   since the most 
7540: 72 65 63 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 68  recent journal h
7550: 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74 65  eader was writte
7560: 6e 2c 20 75 70 64 61 74 65 20 74 68 65 20 0a 20  n, update the . 
7570: 20 2a 2a 20 50 61 67 65 72 53 61 76 65 70 6f 69   ** PagerSavepoi
7580: 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 66 69  nt.iHdrOffset fi
7590: 65 6c 64 73 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20  elds now..  */. 
75a0: 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70 50   for(ii=0; ii<pP
75b0: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
75c0: 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  ; ii++){.    if(
75d0: 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f   pPager->aSavepo
75e0: 69 6e 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73  int[ii].iHdrOffs
75f0: 65 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  et==0 ){.      p
7600: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
7610: 74 5b 69 69 5d 2e 69 48 64 72 4f 66 66 73 65 74  t[ii].iHdrOffset
7620: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
7630: 61 6c 4f 66 66 3b 0a 20 20 20 20 7d 0a 20 20 7d  alOff;.    }.  }
7640: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
7650: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
7660: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f  >journalOff = jo
7670: 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
7680: 50 61 67 65 72 29 3b 0a 20 20 6d 65 6d 63 70 79  Pager);.  memcpy
7690: 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e  (zHeader, aJourn
76a0: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
76b0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
76c0: 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69  ..  /* .  ** Wri
76d0: 74 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c  te the nRec Fiel
76e0: 64 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  d - the number o
76f0: 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74  f page records t
7700: 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a  hat follow this.
7710: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61    ** journal hea
7720: 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a  der. Normally, z
7730: 65 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74  ero is written t
7740: 6f 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20  o this value at 
7750: 74 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20  this time..  ** 
7760: 41 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64  After the record
7770: 73 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74  s are added to t
7780: 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20  he journal (and 
7790: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63  the journal sync
77a0: 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20  ed, .  ** if in 
77b0: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c  full-sync mode),
77c0: 20 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65   the zero is ove
77d0: 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68  rwritten with th
77e0: 65 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20  e true number.  
77f0: 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73  ** of records (s
7800: 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  ee syncJournal()
7810: 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66  )..  **.  ** A f
7820: 61 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76  aster alternativ
7830: 65 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78  e is to write 0x
7840: 46 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20  FFFFFFFF to the 
7850: 6e 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e  nRec field. When
7860: 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68  .  ** reading th
7870: 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76  e journal this v
7880: 61 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74  alue tells SQLit
7890: 65 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74  e to assume that
78a0: 20 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f   the.  ** rest o
78b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
78c0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69  le contains vali
78d0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20  d page records. 
78e0: 54 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a  This assumption.
78f0: 20 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75    ** is dangerou
7900: 73 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75  s, as if a failu
7910: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
7920: 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
7930: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
7940: 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61  ile it may conta
7950: 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20  in some garbage 
7960: 64 61 74 61 2e 20 54 68 65 72 65 20 61 72 65 20  data. There are 
7970: 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20  two scenarios.  
7980: 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20 72 69  ** where this ri
7990: 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65  sk can be ignore
79a0: 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a  d:.  **.  **   *
79b0: 20 57 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   When the pager 
79c0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
79d0: 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63  de. Corruption c
79e0: 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a  an follow a.  **
79f0: 20 20 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75       power failu
7a00: 72 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  re in this case 
7a10: 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a  anyway..  **.  *
7a20: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53  *   * When the S
7a30: 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45  QLITE_IOCAP_SAFE
7a40: 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20  _APPEND flag is 
7a50: 73 65 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e  set. This guaran
7a60: 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68  tees.  **     th
7a70: 61 74 20 67 61 72 62 61 67 65 20 64 61 74 61 20  at garbage data 
7a80: 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65  is never appende
7a90: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
7aa0: 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73   file..  */.  as
7ab0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
7ac0: 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67  ger->fd) || pPag
7ad0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 0a 20 20  er->noSync );.  
7ae0: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
7af0: 79 6e 63 29 20 7c 7c 20 28 70 50 61 67 65 72 2d  ync) || (pPager-
7b00: 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
7b10: 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
7b20: 4d 45 4d 4f 52 59 29 0a 20 20 20 7c 7c 20 28 73  MEMORY).   || (s
7b30: 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
7b40: 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
7b50: 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45  ager->fd)&SQLITE
7b60: 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45  _IOCAP_SAFE_APPE
7b70: 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75  ND) .  ){.    pu
7b80: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
7b90: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
7ba0: 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66  Magic)], 0xfffff
7bb0: 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  fff);.  }else{. 
7bc0: 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48     put32bits(&zH
7bd0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
7be0: 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29  urnalMagic)], 0)
7bf0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
7c00: 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73  random check-has
7c10: 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f  h initialiser */
7c20: 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e 64   .  sqlite3_rand
7c30: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
7c40: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
7c50: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
7c60: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
7c70: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7c80: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7c90: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
7ca0: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
7cb0: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
7cc0: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
7cd0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
7ce0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
7cf0: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
7d00: 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 29 3b 0a  r->dbOrigSize);.
7d10: 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65 64    /* The assumed
7d20: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f 72   sector size for
7d30: 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a 2f   this process */
7d40: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
7d50: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
7d60: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c  urnalMagic)+12],
7d70: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
7d80: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  ize);..  /* The 
7d90: 70 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  page size */.  p
7da0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7db0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7dc0: 6c 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61  lMagic)+16], pPa
7dd0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
7de0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 69  .  /* Initializi
7df0: 6e 67 20 74 68 65 20 74 61 69 6c 20 6f 66 20 74  ng the tail of t
7e00: 68 65 20 62 75 66 66 65 72 20 69 73 20 6e 6f 74  he buffer is not
7e10: 20 6e 65 63 65 73 73 61 72 79 2e 20 20 45 76 65   necessary.  Eve
7e20: 72 79 74 68 69 6e 67 0a 20 20 2a 2a 20 77 6f 72  rything.  ** wor
7e30: 6b 73 20 66 69 6e 64 20 69 66 20 74 68 65 20 66  ks find if the f
7e40: 6f 6c 6c 6f 77 69 6e 67 20 6d 65 6d 73 65 74 28  ollowing memset(
7e50: 29 20 69 73 20 6f 6d 69 74 74 65 64 2e 20 20 42  ) is omitted.  B
7e60: 75 74 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 0a  ut initializing.
7e70: 20 20 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 20    ** the memory 
7e80: 70 72 65 76 65 6e 74 73 20 76 61 6c 67 72 69 6e  prevents valgrin
7e90: 64 20 66 72 6f 6d 20 63 6f 6d 70 6c 61 69 6e 69  d from complaini
7ea0: 6e 67 2c 20 73 6f 20 77 65 20 61 72 65 20 77 69  ng, so we are wi
7eb0: 6c 6c 69 6e 67 20 74 6f 0a 20 20 2a 2a 20 74 61  lling to.  ** ta
7ec0: 6b 65 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e  ke the performan
7ed0: 63 65 20 68 69 74 2e 0a 20 20 2a 2f 0a 20 20 6d  ce hit..  */.  m
7ee0: 65 6d 73 65 74 28 26 7a 48 65 61 64 65 72 5b 73  emset(&zHeader[s
7ef0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7f00: 67 69 63 29 2b 32 30 5d 2c 20 30 2c 0a 20 20 20  gic)+20], 0,.   
7f10: 20 20 20 20 20 20 6e 48 65 61 64 65 72 2d 28 73        nHeader-(s
7f20: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
7f30: 67 69 63 29 2b 32 30 29 29 3b 0a 0a 20 20 2f 2a  gic)+20));..  /*
7f40: 20 49 6e 20 74 68 65 6f 72 79 2c 20 69 74 20 69   In theory, it i
7f50: 73 20 6f 6e 6c 79 20 6e 65 63 65 73 73 61 72 79  s only necessary
7f60: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 32 38   to write the 28
7f70: 20 62 79 74 65 73 20 74 68 61 74 20 74 68 65 20   bytes that the 
7f80: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65  .  ** journal he
7f90: 61 64 65 72 20 63 6f 6e 73 75 6d 65 73 20 74 6f  ader consumes to
7fa0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7fb0: 65 20 68 65 72 65 2e 20 54 68 65 6e 20 69 6e 63  e here. Then inc
7fc0: 72 65 6d 65 6e 74 20 74 68 65 20 0a 20 20 2a 2a  rement the .  **
7fd0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
7fe0: 66 20 76 61 72 69 61 62 6c 65 20 62 79 20 4a 4f  f variable by JO
7ff0: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 73 6f 20  URNAL_HDR_SZ so 
8000: 74 68 61 74 20 74 68 65 20 6e 65 78 74 20 0a 20  that the next . 
8010: 20 2a 2a 20 72 65 63 6f 72 64 20 69 73 20 77 72   ** record is wr
8020: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 6f 6c  itten to the fol
8030: 6c 6f 77 69 6e 67 20 73 65 63 74 6f 72 20 28 6c  lowing sector (l
8040: 65 61 76 69 6e 67 20 61 20 67 61 70 20 69 6e 20  eaving a gap in 
8050: 74 68 65 20 66 69 6c 65 0a 20 20 2a 2a 20 74 68  the file.  ** th
8060: 61 74 20 77 69 6c 6c 20 62 65 20 69 6d 70 6c 69  at will be impli
8070: 63 69 74 6c 79 20 66 69 6c 6c 65 64 20 69 6e 20  citly filled in 
8080: 62 79 20 74 68 65 20 4f 53 29 2e 0a 20 20 2a 2a  by the OS)..  **
8090: 0a 20 20 2a 2a 20 48 6f 77 65 76 65 72 20 69 74  .  ** However it
80a0: 20 68 61 73 20 62 65 65 6e 20 64 69 73 63 6f 76   has been discov
80b0: 65 72 65 64 20 74 68 61 74 20 6f 6e 20 73 6f 6d  ered that on som
80c0: 65 20 73 79 73 74 65 6d 73 20 74 68 69 73 20 70  e systems this p
80d0: 61 74 74 65 72 6e 20 63 61 6e 20 0a 20 20 2a 2a  attern can .  **
80e0: 20 62 65 20 73 69 67 6e 69 66 69 63 61 6e 74 6c   be significantl
80f0: 79 20 73 6c 6f 77 65 72 20 74 68 61 6e 20 63 6f  y slower than co
8100: 6e 74 69 67 75 6f 75 73 6c 79 20 77 72 69 74 69  ntiguously writi
8110: 6e 67 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  ng data to the f
8120: 69 6c 65 2c 0a 20 20 2a 2a 20 65 76 65 6e 20 69  ile,.  ** even i
8130: 66 20 74 68 61 74 20 6d 65 61 6e 73 20 65 78 70  f that means exp
8140: 6c 69 63 69 74 6c 79 20 77 72 69 74 69 6e 67 20  licitly writing 
8150: 64 61 74 61 20 74 6f 20 74 68 65 20 62 6c 6f 63  data to the bloc
8160: 6b 20 6f 66 20 0a 20 20 2a 2a 20 28 4a 4f 55 52  k of .  ** (JOUR
8170: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38 29  NAL_HDR_SZ - 28)
8180: 20 62 79 74 65 73 20 74 68 61 74 20 77 69 6c 6c   bytes that will
8190: 20 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 6f   not be used. So
81a0: 20 74 68 61 74 20 69 73 20 77 68 61 74 0a 20 20   that is what.  
81b0: 2a 2a 20 69 73 20 64 6f 6e 65 2e 20 0a 20 20 2a  ** is done. .  *
81c0: 2a 0a 20 20 2a 2a 20 54 68 65 20 6c 6f 6f 70 20  *.  ** The loop 
81d0: 69 73 20 72 65 71 75 69 72 65 64 20 68 65 72 65  is required here
81e0: 20 69 6e 20 63 61 73 65 20 74 68 65 20 73 65 63   in case the sec
81f0: 74 6f 72 2d 73 69 7a 65 20 69 73 20 6c 61 72 67  tor-size is larg
8200: 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 2a  er than the .  *
8210: 2a 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  * database page 
8220: 73 69 7a 65 2e 20 53 69 6e 63 65 20 74 68 65 20  size. Since the 
8230: 7a 48 65 61 64 65 72 20 62 75 66 66 65 72 20 69  zHeader buffer i
8240: 73 20 6f 6e 6c 79 20 50 61 67 65 72 2e 70 61 67  s only Pager.pag
8250: 65 53 69 7a 65 0a 20 20 2a 2a 20 62 79 74 65 73  eSize.  ** bytes
8260: 20 69 6e 20 73 69 7a 65 2c 20 6d 6f 72 65 20 74   in size, more t
8270: 68 61 6e 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20  han one call to 
8280: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29  sqlite3OsWrite()
8290: 20 6d 61 79 20 62 65 20 72 65 71 75 69 72 65 64   may be required
82a0: 0a 20 20 2a 2a 20 74 6f 20 70 6f 70 75 6c 61 74  .  ** to populat
82b0: 65 20 74 68 65 20 65 6e 74 69 72 65 20 6a 6f 75  e the entire jou
82c0: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63 74  rnal header sect
82d0: 6f 72 2e 0a 20 20 2a 2f 20 0a 20 20 66 6f 72 28  or..  */ .  for(
82e0: 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d 3d 53 51  nWrite=0; rc==SQ
82f0: 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69 74 65 3c  LITE_OK&&nWrite<
8300: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8310: 50 61 67 65 72 29 3b 20 6e 57 72 69 74 65 2b 3d  Pager); nWrite+=
8320: 6e 48 65 61 64 65 72 29 7b 0a 20 20 20 20 49 4f  nHeader){.    IO
8330: 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
8340: 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
8350: 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  er, pPager->jour
8360: 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64 65 72 29  nalHdr, nHeader)
8370: 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ).    rc = sqlit
8380: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
8390: 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65 72 2c 20  ->jfd, zHeader, 
83a0: 6e 48 65 61 64 65 72 2c 20 70 50 61 67 65 72 2d  nHeader, pPager-
83b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
83c0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
83d0: 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64 65 72 3b  lOff += nHeader;
83e0: 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
83f0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
8400: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
8410: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
8420: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
8430: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8440: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
8450: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
8460: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
8470: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
8480: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
8490: 2a 2a 20 66 69 6c 65 2e 20 54 68 65 20 63 75 72  ** file. The cur
84a0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  rent location in
84b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
84c0: 65 20 69 73 20 67 69 76 65 6e 20 62 79 0a 2a 2a  e is given by.**
84d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
84e0: 4f 66 66 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74  Off. See comment
84f0: 73 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e  s above function
8500: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
8510: 28 29 20 66 6f 72 0a 2a 2a 20 61 20 64 65 73 63  () for.** a desc
8520: 72 69 70 74 69 6f 6e 20 6f 66 20 74 68 65 20 6a  ription of the j
8530: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f  ournal header fo
8540: 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  rmat..**.** If t
8550: 68 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61  he header is rea
8560: 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20  d successfully, 
8570: 2a 70 4e 52 65 63 20 69 73 20 73 65 74 20 74 6f  *pNRec is set to
8580: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
8590: 2a 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 66  * page records f
85a0: 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65  ollowing this he
85b0: 61 64 65 72 20 61 6e 64 20 2a 70 44 62 53 69 7a  ader and *pDbSiz
85c0: 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
85d0: 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  size of the.** d
85e0: 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20 74  atabase before t
85f0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 62  he transaction b
8600: 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20  egan, in pages. 
8610: 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b  Also, pPager->ck
8620: 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65  sumInit.** is se
8630: 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20 72  t to the value r
8640: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
8650: 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53 51 4c  rnal header. SQL
8660: 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
8670: 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  ed.** in this ca
8680: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
8690: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
86a0: 66 69 6c 65 20 61 70 70 65 61 72 73 20 74 6f 20  file appears to 
86b0: 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20 53 51  be corrupted, SQ
86c0: 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20  LITE_DONE is.** 
86d0: 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 4e  returned and *pN
86e0: 52 65 63 20 61 6e 64 20 2a 50 44 62 53 69 7a 65  Rec and *PDbSize
86f0: 20 61 72 65 20 75 6e 64 65 66 69 6e 65 64 2e 20   are undefined. 
8700: 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   If JOURNAL_HDR_
8710: 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e  SZ bytes.** cann
8720: 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ot be read from 
8730: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
8740: 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
8750: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  s returned..*/.s
8760: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f  tatic int readJo
8770: 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65  urnalHdr(.  Page
8780: 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
8790: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
87a0: 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 36  r object */.  i6
87b0: 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 20 20  4 journalSize,  
87c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
87d0: 7a 65 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 6a  ze of the open j
87e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
87f0: 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 2a 70  ytes */.  u32 *p
8800: 4e 52 65 63 2c 20 20 20 20 20 20 20 20 20 20 20  NRec,           
8810: 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56         /* OUT: V
8820: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
8830: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 2a 2f  he nRec field */
8840: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 20  .  u32 *pDbSize 
8850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8860: 2f 2a 20 4f 55 54 3a 20 56 61 6c 75 65 20 6f 66  /* OUT: Value of
8870: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
8880: 73 65 20 73 69 7a 65 20 66 69 65 6c 64 20 2a 2f  se size field */
8890: 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  .){.  int rc;   
88a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88b0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
88c0: 65 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20  e */.  unsigned 
88d0: 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20  char aMagic[8]; 
88e0: 20 20 20 20 2f 2a 20 41 20 62 75 66 66 65 72 20      /* A buffer 
88f0: 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69  to hold the magi
8900: 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36  c header */.  i6
8910: 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20  4 iHdrOff;      
8920: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 66             /* Of
8930: 66 73 65 74 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  fset of journal 
8940: 68 65 61 64 65 72 20 62 65 69 6e 67 20 72 65 61  header being rea
8950: 64 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  d */..  assert( 
8960: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
8970: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
8980: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
8990: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
89a0: 2f 2a 20 41 64 76 61 6e 63 65 20 50 61 67 65 72  /* Advance Pager
89b0: 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 74 6f 20 74  .journalOff to t
89c0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
89d0: 6e 65 78 74 20 73 65 63 74 6f 72 2e 20 49 66 20  next sector. If 
89e0: 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
89f0: 20 66 69 6c 65 20 69 73 20 74 6f 6f 20 73 6d 61   file is too sma
8a00: 6c 6c 20 66 6f 72 20 74 68 65 72 65 20 74 6f 20  ll for there to 
8a10: 62 65 20 61 20 68 65 61 64 65 72 20 73 74 6f 72  be a header stor
8a20: 65 64 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20  ed at this.  ** 
8a30: 70 6f 69 6e 74 2c 20 72 65 74 75 72 6e 20 53 51  point, return SQ
8a40: 4c 49 54 45 5f 44 4f 4e 45 2e 0a 20 20 2a 2f 0a  LITE_DONE..  */.
8a50: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
8a60: 6c 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64  lOff = journalHd
8a70: 72 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b  rOffset(pPager);
8a80: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
8a90: 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41  ournalOff+JOURNA
8aa0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
8ab0: 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29   > journalSize )
8ac0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
8ad0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
8ae0: 69 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  iHdrOff = pPager
8af0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
8b00: 20 2f 2a 20 52 65 61 64 20 69 6e 20 74 68 65 20   /* Read in the 
8b10: 66 69 72 73 74 20 38 20 62 79 74 65 73 20 6f 66  first 8 bytes of
8b20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
8b30: 64 65 72 2e 20 49 66 20 74 68 65 79 20 64 6f 20  der. If they do 
8b40: 6e 6f 74 20 6d 61 74 63 68 0a 20 20 2a 2a 20 74  not match.  ** t
8b50: 68 65 20 20 6d 61 67 69 63 20 73 74 72 69 6e 67  he  magic string
8b60: 20 66 6f 75 6e 64 20 61 74 20 74 68 65 20 73 74   found at the st
8b70: 61 72 74 20 6f 66 20 65 61 63 68 20 6a 6f 75 72  art of each jour
8b80: 6e 61 6c 20 68 65 61 64 65 72 2c 20 72 65 74 75  nal header, retu
8b90: 72 6e 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44  rn.  ** SQLITE_D
8ba0: 4f 4e 45 2e 20 49 66 20 61 6e 20 49 4f 20 65 72  ONE. If an IO er
8bb0: 72 6f 72 20 6f 63 63 75 72 73 2c 20 72 65 74 75  ror occurs, retu
8bc0: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
8bd0: 2e 20 4f 74 68 65 72 77 69 73 65 2c 0a 20 20 2a  . Otherwise,.  *
8be0: 2a 20 70 72 6f 63 65 65 64 2e 0a 20 20 2a 2f 0a  * proceed..  */.
8bf0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8c00: 52 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64  Read(pPager->jfd
8c10: 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  , aMagic, sizeof
8c20: 28 61 4d 61 67 69 63 29 2c 20 69 48 64 72 4f 66  (aMagic), iHdrOf
8c30: 66 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  f);.  if( rc ){.
8c40: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
8c50: 20 7d 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28   }.  if( memcmp(
8c60: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
8c70: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
8c80: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
8c90: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
8ca0: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ONE;.  }..  /* R
8cb0: 65 61 64 20 74 68 65 20 66 69 72 73 74 20 74 68  ead the first th
8cc0: 72 65 65 20 33 32 2d 62 69 74 20 66 69 65 6c 64  ree 32-bit field
8cd0: 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  s of the journal
8ce0: 20 68 65 61 64 65 72 3a 20 54 68 65 20 6e 52 65   header: The nRe
8cf0: 63 0a 20 20 2a 2a 20 66 69 65 6c 64 2c 20 74 68  c.  ** field, th
8d00: 65 20 63 68 65 63 6b 73 75 6d 2d 69 6e 69 74 69  e checksum-initi
8d10: 61 6c 69 7a 65 72 20 61 6e 64 20 74 68 65 20 64  alizer and the d
8d20: 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 74 20  atabase size at 
8d30: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
8d40: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
8d50: 6e 2e 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  n. Return an err
8d60: 6f 72 20 63 6f 64 65 20 69 66 20 61 6e 79 74 68  or code if anyth
8d70: 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
8d80: 20 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54    */.  if( SQLIT
8d90: 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64  E_OK!=(rc = read
8da0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
8db0: 66 64 2c 20 69 48 64 72 4f 66 66 2b 38 2c 20 70  fd, iHdrOff+8, p
8dc0: 4e 52 65 63 29 29 0a 20 20 20 7c 7c 20 53 51 4c  NRec)).   || SQL
8dd0: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
8de0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8df0: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 32  >jfd, iHdrOff+12
8e00: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
8e10: 49 6e 69 74 29 29 0a 20 20 20 7c 7c 20 53 51 4c  Init)).   || SQL
8e20: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
8e30: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8e40: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 31 36  >jfd, iHdrOff+16
8e50: 2c 20 70 44 62 53 69 7a 65 29 29 0a 20 20 29 7b  , pDbSize)).  ){
8e60: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
8e70: 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
8e80: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30  r->journalOff==0
8e90: 20 29 7b 0a 20 20 20 20 75 33 32 20 69 50 61 67   ){.    u32 iPag
8ea0: 65 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20  eSize;          
8eb0: 20 20 20 20 20 2f 2a 20 50 61 67 65 2d 73 69 7a       /* Page-siz
8ec0: 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72 6e  e field of journ
8ed0: 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20  al header */.   
8ee0: 20 75 33 32 20 69 53 65 63 74 6f 72 53 69 7a 65   u32 iSectorSize
8ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8f00: 20 53 65 63 74 6f 72 2d 73 69 7a 65 20 66 69 65   Sector-size fie
8f10: 6c 64 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 68 65  ld of journal he
8f20: 61 64 65 72 20 2a 2f 0a 20 20 20 20 75 31 36 20  ader */.    u16 
8f30: 69 50 61 67 65 53 69 7a 65 31 36 3b 20 20 20 20  iPageSize16;    
8f40: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 70 79           /* Copy
8f50: 20 6f 66 20 69 50 61 67 65 53 69 7a 65 20 69 6e   of iPageSize in
8f60: 20 31 36 2d 62 69 74 20 76 61 72 69 61 62 6c 65   16-bit variable
8f70: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64   */..    /* Read
8f80: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
8f90: 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 6a  nd sector-size j
8fa0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69  ournal header fi
8fb0: 65 6c 64 73 2e 20 2a 2f 0a 20 20 20 20 69 66 28  elds. */.    if(
8fc0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8fd0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8fe0: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8ff0: 66 2b 32 30 2c 20 26 69 53 65 63 74 6f 72 53 69  f+20, &iSectorSi
9000: 7a 65 29 29 0a 20 20 20 20 20 7c 7c 20 53 51 4c  ze)).     || SQL
9010: 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65  ITE_OK!=(rc = re
9020: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
9030: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 32 34  >jfd, iHdrOff+24
9040: 2c 20 26 69 50 61 67 65 53 69 7a 65 29 29 0a 20  , &iPageSize)). 
9050: 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75     ){.      retu
9060: 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
9070: 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20    /* Check that 
9080: 74 68 65 20 76 61 6c 75 65 73 20 72 65 61 64 20  the values read 
9090: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 2d 73 69  from the page-si
90a0: 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
90b0: 7a 65 20 66 69 65 6c 64 73 0a 20 20 20 20 2a 2a  ze fields.    **
90c0: 20 61 72 65 20 77 69 74 68 69 6e 20 72 61 6e 67   are within rang
90d0: 65 2e 20 54 6f 20 62 65 20 27 69 6e 20 72 61 6e  e. To be 'in ran
90e0: 67 65 27 2c 20 62 6f 74 68 20 76 61 6c 75 65 73  ge', both values
90f0: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 20 70 6f   need to be a po
9100: 77 65 72 0a 20 20 20 20 2a 2a 20 6f 66 20 74 77  wer.    ** of tw
9110: 6f 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 6f  o greater than o
9120: 72 20 65 71 75 61 6c 20 74 6f 20 35 31 32 2c 20  r equal to 512, 
9130: 61 6e 64 20 6e 6f 74 20 67 72 65 61 74 65 72 20  and not greater 
9140: 74 68 61 6e 20 74 68 65 69 72 20 0a 20 20 20 20  than their .    
9150: 2a 2a 20 72 65 73 70 65 63 74 69 76 65 20 63 6f  ** respective co
9160: 6d 70 69 6c 65 20 74 69 6d 65 20 6d 61 78 69 6d  mpile time maxim
9170: 75 6d 20 6c 69 6d 69 74 73 2e 0a 20 20 20 20 2a  um limits..    *
9180: 2f 0a 20 20 20 20 69 66 28 20 69 50 61 67 65 53  /.    if( iPageS
9190: 69 7a 65 3c 35 31 32 20 20 20 20 20 20 20 20 20  ize<512         
91a0: 20 20 20 20 20 20 20 20 20 7c 7c 20 69 53 65 63           || iSec
91b0: 74 6f 72 53 69 7a 65 3c 35 31 32 0a 20 20 20 20  torSize<512.    
91c0: 20 7c 7c 20 69 50 61 67 65 53 69 7a 65 3e 53 51   || iPageSize>SQ
91d0: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
91e0: 5a 45 20 7c 7c 20 69 53 65 63 74 6f 72 53 69 7a  ZE || iSectorSiz
91f0: 65 3e 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  e>MAX_SECTOR_SIZ
9200: 45 0a 20 20 20 20 20 7c 7c 20 28 28 69 50 61 67  E.     || ((iPag
9210: 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65 53 69  eSize-1)&iPageSi
9220: 7a 65 29 21 3d 30 20 20 20 7c 7c 20 28 28 69 53  ze)!=0   || ((iS
9230: 65 63 74 6f 72 53 69 7a 65 2d 31 29 26 69 53 65  ectorSize-1)&iSe
9240: 63 74 6f 72 53 69 7a 65 29 21 3d 30 20 0a 20 20  ctorSize)!=0 .  
9250: 20 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66    ){.      /* If
9260: 20 74 68 65 20 65 69 74 68 65 72 20 74 68 65 20   the either the 
9270: 70 61 67 65 2d 73 69 7a 65 20 6f 72 20 73 65 63  page-size or sec
9280: 74 6f 72 2d 73 69 7a 65 20 69 6e 20 74 68 65 20  tor-size in the 
9290: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
92a0: 73 20 0a 20 20 20 20 20 20 2a 2a 20 69 6e 76 61  s .      ** inva
92b0: 6c 69 64 2c 20 74 68 65 6e 20 74 68 65 20 70 72  lid, then the pr
92c0: 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65  ocess that wrote
92d0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65 61   the journal-hea
92e0: 64 65 72 20 6d 75 73 74 20 68 61 76 65 20 0a 20  der must have . 
92f0: 20 20 20 20 20 2a 2a 20 63 72 61 73 68 65 64 20       ** crashed 
9300: 62 65 66 6f 72 65 20 74 68 65 20 68 65 61 64 65  before the heade
9310: 72 20 77 61 73 20 73 79 6e 63 65 64 2e 20 49 6e  r was synced. In
9320: 20 74 68 69 73 20 63 61 73 65 20 73 74 6f 70 20   this case stop 
9330: 72 65 61 64 69 6e 67 20 0a 20 20 20 20 20 20 2a  reading .      *
9340: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
9350: 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 20 20 2a  le here..      *
9360: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  /.      return S
9370: 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20  QLITE_DONE;.    
9380: 7d 0a 0a 20 20 20 20 2f 2a 20 55 70 64 61 74 65  }..    /* Update
9390: 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 74   the page-size t
93a0: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
93b0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  e read from the 
93c0: 6a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2a  journal. .    **
93d0: 20 55 73 65 20 61 20 74 65 73 74 63 61 73 65 28   Use a testcase(
93e0: 29 20 6d 61 63 72 6f 20 74 6f 20 6d 61 6b 65 20  ) macro to make 
93f0: 73 75 72 65 20 74 68 61 74 20 6d 61 6c 6c 6f 63  sure that malloc
9400: 20 66 61 69 6c 75 72 65 20 77 69 74 68 69 6e 20   failure within 
9410: 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 53 65 74  .    ** PagerSet
9420: 50 61 67 65 73 69 7a 65 28 29 20 69 73 20 74 65  Pagesize() is te
9430: 73 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sted..    */.   
9440: 20 69 50 61 67 65 53 69 7a 65 31 36 20 3d 20 28   iPageSize16 = (
9450: 75 31 36 29 69 50 61 67 65 53 69 7a 65 3b 0a 20  u16)iPageSize;. 
9460: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
9470: 61 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28  agerSetPagesize(
9480: 70 50 61 67 65 72 2c 20 26 69 50 61 67 65 53 69  pPager, &iPageSi
9490: 7a 65 31 36 2c 20 2d 31 29 3b 0a 20 20 20 20 74  ze16, -1);.    t
94a0: 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c  estcase( rc!=SQL
94b0: 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 61 73  ITE_OK );.    as
94c0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
94d0: 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69 7a 65  _OK || iPageSize
94e0: 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65 53 69  16==(u16)iPageSi
94f0: 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 55 70  ze );..    /* Up
9500: 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65 64  date the assumed
9510: 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20   sector-size to 
9520: 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65 20  match the value 
9530: 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a 2a 20  used by .    ** 
9540: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9550: 20 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f   created this jo
9560: 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a  urnal. If this j
9570: 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20 20 2a  ournal was.    *
9580: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
9590: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
95a0: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
95b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
95c0: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
95d0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
95e0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
95f0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
9600: 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50 61 67  ue.    ** of Pag
9610: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
9620: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
9630: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
9640: 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tine..    */.   
9650: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
9660: 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53 69 7a  ize = iSectorSiz
9670: 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72  e;.  }..  pPager
9680: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
9690: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
96a0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
96b0: 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57   rc;.}.../*.** W
96c0: 72 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65  rite the supplie
96d0: 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  d master journal
96e0: 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a   name into the j
96f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
9700: 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20  pager.** pPager 
9710: 61 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c  at the current l
9720: 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73  ocation. The mas
9730: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
9740: 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73   must be the las
9750: 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74  t.** thing writt
9760: 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20  en to a journal 
9770: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
9780: 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79  er is in full-sy
9790: 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20  nc mode, the.** 
97a0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
97b0: 63 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e  criptor is advan
97c0: 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20  ced to the next 
97d0: 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20  sector boundary 
97e0: 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69  before.** anythi
97f0: 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54  ng is written. T
9800: 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a  he format is:.**
9810: 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
9820: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a   PAGER_MJ_PGNO..
9830: 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73 3a 20  **   + N bytes: 
9840: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  Master journal f
9850: 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66 2d 38  ilename in utf-8
9860: 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73  ..**   + 4 bytes
9870: 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66 20 6d  : N (length of m
9880: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9890: 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e 6f 20  me in bytes, no 
98a0: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2e  nul-terminator).
98b0: 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65 73 3a  .**   + 4 bytes:
98c0: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
98d0: 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
98e0: 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a 20 61  *   + 8 bytes: a
98f0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
9900: 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72  **.** The master
9910: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68   journal page ch
9920: 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75  ecksum is the su
9930: 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69  m of the bytes i
9940: 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20  n the master.** 
9950: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20 77 68  journal name, wh
9960: 65 72 65 20 65 61 63 68 20 62 79 74 65 20 69 73  ere each byte is
9970: 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
9980: 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74 20 69  a signed 8-bit i
9990: 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  nteger..**.** If
99a0: 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e 55   zMaster is a NU
99b0: 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63 75  LL pointer (occu
99c0: 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  rs for a single 
99d0: 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
99e0: 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73 20  tion), .** this 
99f0: 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  call is a no-op.
9a00: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
9a10: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
9a20: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
9a30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
9a40: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
9a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9a60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74            /* Ret
9a70: 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  urn code */.  in
9a80: 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20 20 20  t nMaster;      
9a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9aa0: 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74 72 69  * Length of stri
9ab0: 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20  ng zMaster */.  
9ac0: 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20  i64 iHdrOff;    
9ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ae0: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 68 65   /* Offset of he
9af0: 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  ader in journal 
9b00: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 72  file */.  i64 jr
9b10: 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  nlSize;         
9b20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
9b30: 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69  ze of journal fi
9b40: 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a 20 20  le on disk */.  
9b50: 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 20  u32 cksum = 0;  
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b70: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f 66 20   /* Checksum of 
9b80: 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a  string zMaster *
9b90: 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  /..  if( !zMaste
9ba0: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
9bb0: 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70 50 61  Master.   || pPa
9bc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
9bd0: 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
9be0: 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20 20 7c  ODE_MEMORY .   |
9bf0: 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
9c00: 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55  lMode==PAGER_JOU
9c10: 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20  RNALMODE_OFF .  
9c20: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9c30: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
9c40: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
9c50: 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74 28 20   = 1;.  assert( 
9c60: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
9c70: 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43 61 6c  fd) );..  /* Cal
9c80: 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e 67 74  culate the lengt
9c90: 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64 20 74  h in bytes and t
9ca0: 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 7a  he checksum of z
9cb0: 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f 72 28  Master */.  for(
9cc0: 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61 73 74  nMaster=0; zMast
9cd0: 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e 4d 61  er[nMaster]; nMa
9ce0: 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  ster++){.    cks
9cf0: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 6e 4d  um += zMaster[nM
9d00: 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20 20 2f  aster];.  }..  /
9d10: 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  * If in full-syn
9d20: 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20  c mode, advance 
9d30: 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b  to the next disk
9d40: 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77   sector before w
9d50: 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20  riting.  ** the 
9d60: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
9d70: 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20  ame. This is in 
9d80: 63 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75  case the previou
9d90: 73 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74  s page written t
9da0: 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  o.  ** the journ
9db0: 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62  al has already b
9dc0: 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f  een synced..  */
9dd0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66  .  if( pPager->f
9de0: 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 70  ullSync ){.    p
9df0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9e00: 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f 66  f = journalHdrOf
9e10: 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  fset(pPager);.  
9e20: 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20 70 50  }.  iHdrOff = pP
9e30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9e40: 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68  ;..  /* Write th
9e50: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9e60: 20 64 61 74 61 20 74 6f 20 74 68 65 20 65 6e 64   data to the end
9e70: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
9e80: 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20 61 6e  file. If.  ** an
9e90: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 72   error occurs, r
9ea0: 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20  eturn the error 
9eb0: 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61 6c 6c  code to the call
9ec0: 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28  er..  */.  if( (
9ed0: 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69 74 65  0 != (rc = write
9ee0: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
9ef0: 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50 41 47  fd, iHdrOff, PAG
9f00: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
9f10: 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21  r)))).   || (0 !
9f20: 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
9f30: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
9f40: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 4d 61  fd, zMaster, nMa
9f50: 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b 34 29  ster, iHdrOff+4)
9f60: 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d 20 28  )).   || (0 != (
9f70: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
9f80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48  (pPager->jfd, iH
9f90: 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65 72 2c  drOff+4+nMaster,
9fa0: 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20 20 7c   nMaster))).   |
9fb0: 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72  | (0 != (rc = wr
9fc0: 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
9fd0: 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2b 34  ->jfd, iHdrOff+4
9fe0: 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b 73 75  +nMaster+4, cksu
9ff0: 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  m))).   || (0 !=
a000: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
a010: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
a020: 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  d, aJournalMagic
a030: 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34 2b 6e  , 8, iHdrOff+4+n
a040: 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20 29 7b  Master+8))).  ){
a050: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
a060: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f    }.  pPager->jo
a070: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e 4d 61  urnalOff += (nMa
a080: 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50 61 67  ster+20);.  pPag
a090: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  er->needSync = !
a0a0: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
a0b0: 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67  .  /* If the pag
a0c0: 65 72 20 69 73 20 69 6e 20 70 65 72 69 73 74 65  er is in periste
a0d0: 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c  nt-journal mode,
a0e0: 20 74 68 65 6e 20 74 68 65 20 70 68 79 73 69 63   then the physic
a0f0: 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  al .  ** journal
a100: 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65 6e 64  -file may extend
a110: 20 70 61 73 74 20 74 68 65 20 65 6e 64 20 6f 66   past the end of
a120: 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
a130: 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e  nal name.  ** an
a140: 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d 61 67  d 8 bytes of mag
a150: 69 63 20 64 61 74 61 20 6a 75 73 74 20 77 72 69  ic data just wri
a160: 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69 6c 65  tten to the file
a170: 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a 2a 20  . This is .  ** 
a180: 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61 75 73  dangerous becaus
a190: 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20 72 6f  e the code to ro
a1a0: 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  llback a hot-jou
a1b0: 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a 20 77  rnal file.  ** w
a1c0: 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c 65 20  ill not be able 
a1d0: 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61 73 74  to find the mast
a1e0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er-journal name 
a1f0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a 20 20  to determine .  
a200: 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  ** whether or no
a210: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
a220: 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a   hot. .  **.  **
a230: 20 45 61 73 69 65 73 74 20 74 68 69 6e 67 20 74   Easiest thing t
a240: 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73 63 65  o do in this sce
a250: 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72 75 6e  nario is to trun
a260: 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  cate the journal
a270: 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f 20 74   .  ** file to t
a280: 68 65 20 72 65 71 75 69 72 65 64 20 73 69 7a 65  he required size
a290: 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20 53 51  ..  */ .  if( SQ
a2a0: 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 73  LITE_OK==(rc = s
a2b0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
a2c0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
a2d0: 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26 26 20  rnlSize)).   && 
a2e0: 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65 72 2d  jrnlSize>pPager-
a2f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20 29 7b  >journalOff.  ){
a300: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
a310: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
a320: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
a330: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
a340: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
a350: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70  ../*.** Find a p
a360: 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68 20  age in the hash 
a370: 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20  table given its 
a380: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52 65 74  page number. Ret
a390: 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72  urn.** a pointer
a3a0: 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20   to the page or 
a3b0: 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65 71 75  NULL if the requ
a3c0: 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
a3d0: 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  t .** already in
a3e0: 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74   memory..*/.stat
a3f0: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
a400: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
a410: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
a420: 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20 20 20  {.  PgHdr *p;   
a430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a440: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
a450: 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49  value */..  /* I
a460: 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
a470: 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74 6f 20  e for a call to 
a480: 50 63 61 63 68 65 46 65 74 63 68 28 29 20 77 69  PcacheFetch() wi
a490: 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d 3d 30  th createFlag==0
a4a0: 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c 20 73   to.  ** fail, s
a4b0: 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70 74 20  ince no attempt 
a4c0: 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79 6e 61  to allocate dyna
a4d0: 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  mic memory will 
a4e0: 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a 20 20  be made..  */.  
a4f0: 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50 63 61  (void)sqlite3Pca
a500: 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72 2d  cheFetch(pPager-
a510: 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c 20  >pPCache, pgno, 
a520: 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75 72 6e  0, &p);.  return
a530: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   p;.}../*.** Unl
a540: 65 73 73 20 74 68 65 20 70 61 67 65 72 20 69 73  ess the pager is
a550: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
a560: 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e 2d   discard all in-
a570: 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20 49 66  memory pages. If
a580: 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20 69 73  .** the pager is
a590: 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74 65 2c   in error-state,
a5a0: 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c 6c 20   then this call 
a5b0: 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
a5c0: 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61 6e 20  * TODO: Why can 
a5d0: 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74 68 65  we not reset the
a5e0: 20 70 61 67 65 72 20 77 68 69 6c 65 20 69 6e 20   pager while in 
a5f0: 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a 2f 0a  error state?.*/.
a600: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
a610: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
a620: 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 53 51  Pager){.  if( SQ
a630: 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65 72 2d  LITE_OK==pPager-
a640: 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
a650: 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73  sqlite3BackupRes
a660: 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61  tart(pPager->pBa
a670: 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  ckup);.    sqlit
a680: 65 33 50 63 61 63 68 65 43 6c 65 61 72 28 70 50  e3PcacheClear(pP
a690: 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
a6a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
a6b0: 7a 65 56 61 6c 69 64 20 3d 20 30 3b 0a 20 20 7d  zeValid = 0;.  }
a6c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61  .}../*.** Free a
a6d0: 6c 6c 20 73 74 72 75 63 74 75 72 65 73 20 69 6e  ll structures in
a6e0: 20 74 68 65 20 50 61 67 65 72 2e 61 53 61 76 65   the Pager.aSave
a6f0: 70 6f 69 6e 74 5b 5d 20 61 72 72 61 79 20 61 6e  point[] array an
a700: 64 20 73 65 74 20 62 6f 74 68 0a 2a 2a 20 50 61  d set both.** Pa
a710: 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
a720: 6e 64 20 50 61 67 65 72 2e 6e 53 61 76 65 70 6f  nd Pager.nSavepo
a730: 69 6e 74 20 74 6f 20 7a 65 72 6f 2e 20 43 6c 6f  int to zero. Clo
a740: 73 65 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  se the sub-journ
a750: 61 6c 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6f  al.** if it is o
a760: 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
a770: 72 20 69 73 20 6e 6f 74 20 69 6e 20 65 78 63 6c  r is not in excl
a780: 75 73 69 76 65 20 6d 6f 64 65 2e 0a 2a 2f 0a 73  usive mode..*/.s
a790: 74 61 74 69 63 20 76 6f 69 64 20 72 65 6c 65 61  tatic void relea
a7a0: 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28  seAllSavepoints(
a7b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
a7c0: 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
a7d0: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
a7e0: 74 6f 72 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  tor for looping 
a7f0: 74 68 72 6f 75 67 68 20 50 61 67 65 72 2e 61 53  through Pager.aS
a800: 61 76 65 70 6f 69 6e 74 20 2a 2f 0a 20 20 66 6f  avepoint */.  fo
a810: 72 28 69 69 3d 30 3b 20 69 69 3c 70 50 61 67 65  r(ii=0; ii<pPage
a820: 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69  r->nSavepoint; i
a830: 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i++){.    sqlite
a840: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
a850: 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
a860: 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
a870: 6e 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 21  nt);.  }.  if( !
a880: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
a890: 65 4d 6f 64 65 20 7c 7c 20 73 71 6c 69 74 65 33  eMode || sqlite3
a8a0: 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70 50 61  IsMemJournal(pPa
a8b0: 67 65 72 2d 3e 73 6a 66 64 29 20 29 7b 0a 20 20  ger->sjfd) ){.  
a8c0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a8d0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
a8e0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
a8f0: 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
a900: 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
a910: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
a920: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
a930: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
a940: 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
a950: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
a960: 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
a970: 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
a980: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
a990: 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
a9a0: 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
a9b0: 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
a9c0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
a9d0: 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
a9e0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
a9f0: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
aa00: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
aa10: 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
aa20: 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
aa30: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
aa40: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
aa50: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
aa60: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
aa70: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
aa80: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
aa90: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
aaa0: 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
aab0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
aac0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
aad0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
aae0: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
aaf0: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
ab00: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
ab10: 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
ab20: 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
ab30: 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
ab40: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
ab50: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
ab60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
ab70: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
ab80: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
ab90: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
aba0: 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
abb0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
abc0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
abd0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
abe0: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
abf0: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
ac00: 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20   pager.** is in 
ac10: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
ac20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
ac30: 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
ac40: 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  in error state, 
ac50: 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  discard the cont
ac60: 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20  ents of .** the 
ac70: 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20  cache and reset 
ac80: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
ac90: 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  ure internal sta
aca0: 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a  te. If there is.
acb0: 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  ** an open journ
acc0: 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  al-file, then th
acd0: 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68  e next time a sh
ace0: 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  ared-lock is obt
acf0: 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  ained.** on the 
ad00: 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74  pager file (by t
ad10: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
ad20: 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69   process), it wi
ad30: 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64  ll be.** treated
ad40: 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
ad50: 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
ad60: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
ad70: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
ad80: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
ad90: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
ada0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
adb0: 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
adc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
add0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
ade0: 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  /..    /* Always
adf0: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
ae00: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
ae10: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
ae20: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20  se lock..    ** 
ae30: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68  Otherwise, anoth
ae40: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
ae50: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
ae60: 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20  delete might.   
ae70: 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66   ** delete the f
ae80: 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ile out from und
ae90: 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
aea0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
aeb0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
aec0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
aed0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
aee0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
aef0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
af00: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  nal = 0;.    rel
af10: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
af20: 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  s(pPager);..    
af30: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
af40: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65  s unlocked, some
af50: 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20  body else might 
af60: 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20  change it. The. 
af70: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f     ** values sto
af80: 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53  red in Pager.dbS
af90: 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62  ize etc. might b
afa0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66  ecome invalid if
afb0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70  .    ** this hap
afc0: 70 65 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c  pens. TODO: Real
afd0: 6c 79 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74  ly, this doesn't
afe0: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61   need to be clea
aff0: 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c  red.    ** until
b000: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
b010: 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20  ter check fails 
b020: 69 6e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  in pagerSharedLo
b030: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
b040: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
b050: 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72  alid = 0;..    r
b060: 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  c = osUnlock(pPa
b070: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
b080: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
b090: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
b0a0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
b0b0: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
b0c0: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
b0d0: 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20  Pager))..    /* 
b0e0: 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
b0f0: 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
b100: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
b110: 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
b120: 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65  be.    ** truste
b130: 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20  d. Now that the 
b140: 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e  pager file is un
b150: 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74  locked, the cont
b160: 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
b170: 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  ** cache can be 
b180: 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68  discarded and th
b190: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66  e error code saf
b1a0: 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20  ely cleared..   
b1b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
b1c0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
b1d0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b1e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b1f0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b200: 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
b210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
b220: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
b230: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
b240: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
b250: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
b260: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
b270: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  GER_UNLOCK;.  }.
b280: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b290: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
b2a0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
b2b0: 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f  IOERR, CORRUPT o
b2c0: 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20  r FULL error.** 
b2d0: 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 72 65  may have occurre
b2e0: 64 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  d. The first arg
b2f0: 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
b300: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
b310: 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74  .** structure, t
b320: 68 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72  he second the er
b330: 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74  ror-code about t
b340: 6f 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79  o be returned by
b350: 20 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49   a pager .** API
b360: 20 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76   function. The v
b370: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
b380: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
b390: 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a  econd argument .
b3a0: 2a 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74  ** to this funct
b3b0: 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ion. .**.** If t
b3c0: 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
b3d0: 6e 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45  nt is SQLITE_IOE
b3e0: 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  RR, SQLITE_CORRU
b3f0: 50 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55  PT, or SQLITE_FU
b400: 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  LL.** the error 
b410: 62 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65  becomes persiste
b420: 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65  nt. Until the pe
b430: 72 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73  rsisten error is
b440: 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62   cleared,.** sub
b450: 73 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c  sequent API call
b460: 73 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20  s on this Pager 
b470: 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79  will immediately
b480: 20 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65   return the same
b490: 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e   .** error code.
b4a0: 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74  .**.** A persist
b4b0: 65 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61  ent error indica
b4c0: 74 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e  tes that the con
b4d0: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
b4e0: 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e  er-cache .** can
b4f0: 6e 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20  not be trusted. 
b500: 54 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62  This state can b
b510: 65 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d  e cleared by com
b520: 70 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69  pletely discardi
b530: 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  ng .** the conte
b540: 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72  nts of the pager
b550: 2d 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61  -cache. If a tra
b560: 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74  nsaction was act
b570: 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ive when.** the 
b580: 70 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72  persistent error
b590: 20 6f 63 63 75 72 72 65 64 2c 20 74 68 65 6e 20   occurred, then 
b5a0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
b5b0: 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a  rnal may need.**
b5c0: 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20   to be replayed 
b5d0: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 63  to restore the c
b5e0: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64  ontents of the d
b5f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 28 61 73  atabase file (as
b600: 20 69 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61   if.** it were a
b610: 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a   hot-journal)..*
b620: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b630: 65 72 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a  er_error(Pager *
b640: 70 50 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b  pPager, int rc){
b650: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20  .  int rc2 = rc 
b660: 26 20 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74  & 0xff;.  assert
b670: 28 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  (.       pPager-
b680: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
b690: 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20  _FULL ||.       
b6a0: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d  pPager->errCode=
b6b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20  =SQLITE_OK ||.  
b6c0: 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72       (pPager->er
b6d0: 72 43 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53  rCode & 0xff)==S
b6e0: 51 4c 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b  QLITE_IOERR.  );
b6f0: 0a 20 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d  .  if(.    rc2==
b700: 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20  SQLITE_FULL ||. 
b710: 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49     rc2==SQLITE_I
b720: 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d  OERR ||.    rc2=
b730: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a  =SQLITE_CORRUPT.
b740: 20 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d    ){.    pPager-
b750: 3e 65 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20  >errCode = rc;. 
b760: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
b770: 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
b780: 43 4b 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69  CK .     && sqli
b790: 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
b7a0: 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
b7b0: 65 29 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20  e)==0 .    ){.  
b7c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
b7d0: 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 75  ger is already u
b7e0: 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61  nlocked, call pa
b7f0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77  ger_unlock() now
b800: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   to.      ** cle
b810: 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
b820: 74 65 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68  te and ensure th
b830: 61 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  at the pager-cac
b840: 68 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  he is .      ** 
b850: 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
b860: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b870: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
b880: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
b890: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
b8a0: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
b8b0: 20 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74   rollback if a t
b8c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
b8d0: 74 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20  tive and unlock 
b8e0: 74 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65  the .** database
b8f0: 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
b900: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 61   the pager has a
b910: 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20 74  lready entered t
b920: 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  he error state, 
b930: 64 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a  do not attempt .
b940: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
b950: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e  at this time. In
b960: 73 74 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c  stead, pager_unl
b970: 6f 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e  ock() is called.
b980: 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20   The.** call to 
b990: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77  pager_unlock() w
b9a0: 69 6c 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20  ill discard all 
b9b0: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c  in-memory pages,
b9c0: 20 75 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64   unlock.** the d
b9d0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
b9e0: 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
b9f0: 20 73 74 61 74 65 2e 20 49 66 20 74 68 69 73 20   state. If this 
ba00: 6d 65 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68  means that.** th
ba10: 65 72 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75  ere is a hot-jou
ba20: 72 6e 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65  rnal left in the
ba30: 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68   file-system, th
ba40: 65 20 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f  e next connectio
ba50: 6e 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61  n.** to obtain a
ba60: 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20   shared lock on 
ba70: 74 68 65 20 70 61 67 65 72 20 28 77 68 69 63 68  the pager (which
ba80: 20 6d 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65   may be this one
ba90: 29 20 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69  ) will.** roll i
baa0: 74 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  t back..**.** If
bab0: 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20 6e   the pager has n
bac0: 6f 74 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  ot already enter
bad0: 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ed the error sta
bae0: 74 65 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72  te, but an IO or
baf0: 0a 2a 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72  .** malloc error
bb00: 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
bb10: 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20   rollback, then 
bb20: 74 68 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66  this will itself
bb30: 20 63 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70   cause .** the p
bb40: 61 67 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68  ager to enter th
bb50: 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57  e error state. W
bb60: 68 69 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65  hich will be cle
bb70: 61 72 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63  ared by the.** c
bb80: 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c  all to pager_unl
bb90: 6f 63 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69  ock(), as descri
bba0: 62 65 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74  bed above..*/.st
bbb0: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
bbc0: 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
bbd0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
bbe0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
bbf0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
bc00: 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  K && pPager->sta
bc10: 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
bc20: 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
bc30: 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
bc40: 6f 63 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  oc();.    sqlite
bc50: 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70  3PagerRollback(p
bc60: 50 61 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69  Pager);.    sqli
bc70: 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c  te3EndBenignMall
bc80: 6f 63 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  oc();.  }.  page
bc90: 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29  r_unlock(pPager)
bca0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
bcb0: 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74  routine ends a t
bcc0: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72  ransaction. A tr
bcd0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75  ansaction is usu
bce0: 61 6c 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a  ally ended by .*
bcf0: 2a 20 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49  * either a COMMI
bd00: 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20  T or a ROLLBACK 
bd10: 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20  operation. This 
bd20: 72 6f 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63  routine may be c
bd30: 61 6c 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20  alled .** after 
bd40: 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f  rollback of a ho
bd50: 74 2d 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66  t-journal, or if
bd60: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
bd70: 20 77 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a   while opening.*
bd80: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * the journal fi
bd90: 6c 65 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68  le or writing th
bda0: 65 20 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75  e very first jou
bdb0: 72 6e 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61  rnal-header of a
bdc0: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 72 61  .** database tra
bdd0: 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a  nsaction..** .**
bde0: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
bdf0: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
be00: 20 6f 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b   or PAGER_UNLOCK
be10: 20 73 74 61 74 65 20 77 68 65 6e 20 74 68 69 73   state when this
be20: 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63  .** routine is c
be30: 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
be40: 6f 2d 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51  o-op (returns SQ
be50: 4c 49 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20  LITE_OK)..**.** 
be60: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61  Otherwise, any a
be70: 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
be80: 20 61 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a   are released..*
be90: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
bea0: 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
beb0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 22 66 69  , then it is "fi
bec0: 6e 61 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61  nalized". Once a
bed0: 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c   journal .** fil
bee0: 65 20 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c  e has been final
bef0: 69 7a 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70  ized it is not p
bf00: 6f 73 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69  ossible to use i
bf10: 74 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61  t to roll back a
bf20: 20 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e   .** transaction
bf30: 2e 20 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65  . Nor will it be
bf40: 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62   considered to b
bf50: 65 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  e a hot-journal 
bf60: 62 79 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e  by this.** or an
bf70: 79 20 6f 74 68 65 72 20 64 61 74 61 62 61 73 65  y other database
bf80: 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61   connection. Exa
bf90: 63 74 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e  ctly how a journ
bfa0: 61 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a  al is finalized.
bfb0: 2a 2a 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68  ** depends on wh
bfc0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
bfd0: 20 70 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e   pager is runnin
bfe0: 67 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  g in exclusive m
bff0: 6f 64 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63  ode and.** the c
c000: 75 72 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d  urrent journal-m
c010: 6f 64 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e  ode (Pager.journ
c020: 61 6c 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61  alMode value), a
c030: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
c040: 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d     journalMode==
c050: 4d 45 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f  MEMORY.**     Jo
c060: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
c070: 69 70 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20  iptor is simply 
c080: 63 6c 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73  closed. This des
c090: 74 72 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20  troys an .**    
c0a0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
c0b0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72  al..**.**   jour
c0c0: 6e 61 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54  nalMode==TRUNCAT
c0d0: 45 0a 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c  E.**     Journal
c0e0: 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
c0f0: 65 64 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73  ed to zero bytes
c100: 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20   in size..**.** 
c110: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
c120: 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68  ERSIST.**     Th
c130: 65 20 66 69 72 73 74 20 32 38 20 62 79 74 65 73  e first 28 bytes
c140: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
c150: 66 69 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e  file are zeroed.
c160: 20 54 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65   This invalidate
c170: 73 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72  s.**     the fir
c180: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
c190: 72 20 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61  r in the file, a
c1a0: 6e 64 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74  nd hence the ent
c1b0: 69 72 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ire journal.**  
c1c0: 20 20 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61     file. An inva
c1d0: 6c 69 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  lid journal file
c1e0: 20 63 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65   cannot be rolle
c1f0: 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20  d back..**.**   
c200: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c  journalMode==DEL
c210: 45 54 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a  ETE.**     The j
c220: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63  ournal file is c
c230: 6c 6f 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65  losed and delete
c240: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  d using sqlite3O
c250: 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
c260: 20 20 20 20 20 49 66 20 74 68 65 20 70 61 67 65       If the page
c270: 72 20 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20  r is running in 
c280: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c290: 74 68 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66  this method of f
c2a0: 69 6e 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20  inalizing.**    
c2b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c2c0: 65 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e  e is never used.
c2d0: 20 49 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65   Instead, if the
c2e0: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a   journalMode is.
c2f0: 2a 2a 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e  **     DELETE an
c300: 64 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  d the pager is i
c310: 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
c320: 2c 20 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73  , the method des
c330: 63 72 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20  cribed under.** 
c340: 20 20 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d      journalMode=
c350: 3d 50 45 52 53 49 53 54 20 69 73 20 75 73 65 64  =PERSIST is used
c360: 20 69 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20   instead..**.** 
c370: 41 66 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61  After the journa
c380: 6c 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20  l is finalized, 
c390: 69 66 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f  if running in no
c3a0: 6e 2d 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n-exclusive mode
c3b0: 2c 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d  , the.** pager m
c3c0: 6f 76 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48  oves to PAGER_SH
c3d0: 41 52 45 44 20 73 74 61 74 65 20 28 61 6e 64 20  ARED state (and 
c3e0: 64 6f 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c  downgrades the l
c3f0: 6f 63 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61  ock on the.** da
c400: 74 61 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f  tabase file acco
c410: 72 64 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20  rdingly)..**.** 
c420: 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
c430: 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75  running in exclu
c440: 73 69 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73  sive mode and is
c450: 20 69 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44   in PAGER_SYNCED
c460: 20 73 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f   state,.** it mo
c470: 76 65 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ves to PAGER_EXC
c480: 4c 55 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73  LUSIVE. No locks
c490: 20 61 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20   are downgraded 
c4a0: 77 68 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a  when running in.
c4b0: 2a 2a 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  ** exclusive mod
c4c0: 65 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f  e..**.** SQLITE_
c4d0: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
c4e0: 66 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  f no error occur
c4f0: 73 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f  s. If an error o
c500: 63 63 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20  ccurs during.** 
c510: 61 6e 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70  any of the IO op
c520: 65 72 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61  erations to fina
c530: 6c 69 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lize the journal
c540: 20 66 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20   file or unlock 
c550: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
c560: 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
c570: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
c580: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20  ed to the user. 
c590: 49 66 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61  If the .** opera
c5a0: 74 69 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65  tion to finalize
c5b0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c5c0: 65 20 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68  e fails, then th
c5d0: 65 20 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20  e code still.** 
c5e0: 74 72 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20  tries to unlock 
c5f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c600: 65 20 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c  e if not in excl
c610: 75 73 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74  usive mode. If t
c620: 68 65 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65  he.** unlock ope
c630: 72 61 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20  ration fails as 
c640: 77 65 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66  well, then the f
c650: 69 72 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20  irst error code 
c660: 72 65 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68  related.** to th
c670: 65 20 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e  e first error en
c680: 63 6f 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a  countered (the j
c690: 6f 75 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74  ournal finalizat
c6a0: 69 6f 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72  ion one) is.** r
c6b0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
c6c0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
c6d0: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
c6e0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
c6f0: 68 61 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  hasMaster){.  in
c700: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
c710: 3b 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  ;      /* Error 
c720: 63 6f 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61  code from journa
c730: 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f  l finalization o
c740: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e  peration */.  in
c750: 74 20 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f  t rc2 = SQLITE_O
c760: 4b 3b 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20  K;     /* Error 
c770: 63 6f 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c  code from db fil
c780: 65 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69  e unlock operati
c790: 6f 6e 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61  on */..  if( pPa
c7a0: 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52  ger->state<PAGER
c7b0: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
c7c0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
c7d0: 4b 3b 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65  K;.  }.  release
c7e0: 41 6c 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50  AllSavepoints(pP
c7f0: 61 67 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74  ager);..  assert
c800: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
c810: 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
c820: 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
c830: 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70  ;.  if( isOpen(p
c840: 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a  Pager->jfd) ){..
c850: 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65      /* TODO: The
c860: 72 65 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68  re's a problem h
c870: 65 72 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c  ere if a journal
c880: 2d 66 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64  -file was opened
c890: 20 69 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a   in MEMORY.    *
c8a0: 2a 20 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20  * mode and then 
c8b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65  the journal-mode
c8c0: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54   is changed to T
c8d0: 52 55 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49  RUNCATE or PERSI
c8e0: 53 54 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67  ST.    ** during
c8f0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
c900: 2e 20 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75  . This code shou
c910: 6c 64 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f  ld be changed to
c920: 20 61 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74   assume.    ** t
c930: 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
c940: 6d 6f 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61  mode has not cha
c950: 6e 67 65 64 20 73 69 6e 63 65 20 74 68 65 20 74  nged since the t
c960: 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20  ransaction was. 
c970: 20 20 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41     ** started. A
c980: 6e 64 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  nd the sqlite3Pa
c990: 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29  gerJournalMode()
c9a0: 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64   function should
c9b0: 20 62 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67   be.    ** chang
c9c0: 65 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20  ed to make sure 
c9d0: 74 68 61 74 20 74 68 69 73 20 69 73 20 74 68 65  that this is the
c9e0: 20 63 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a   case too..    *
c9f0: 2f 0a 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69  /..    /* Finali
ca00: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
ca10: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  ile. */.    if( 
ca20: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
ca30: 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
ca40: 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
ca50: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d  .      int isMem
ca60: 6f 72 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  oryJournal = sql
ca70: 69 74 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c  ite3IsMemJournal
ca80: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
ca90: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c       sqlite3OsCl
caa0: 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
cab0: 3b 0a 20 20 20 20 20 20 69 66 28 20 21 69 73 4d  ;.      if( !isM
cac0: 65 6d 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a  emoryJournal ){.
cad0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
cae0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61  ite3OsDelete(pPa
caf0: 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65  ger->pVfs, pPage
cb00: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
cb10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
cb20: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
cb30: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
cb40: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52  R_JOURNALMODE_TR
cb50: 55 4e 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UNCATE ){.      
cb60: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
cb70: 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20  nalOff==0 ){.   
cb80: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
cb90: 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  _OK;.      }else
cba0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
cbb0: 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
cbc0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29  (pPager->jfd, 0)
cbd0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cbe0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cbf0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
cc00: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
cc10: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
cc20: 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
cc30: 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20  exclusiveMode . 
cc40: 20 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a      || pPager->j
cc50: 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45  ournalMode==PAGE
cc60: 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45  R_JOURNALMODE_PE
cc70: 52 53 49 53 54 0a 20 20 20 20 29 7b 0a 20 20 20  RSIST.    ){.   
cc80: 20 20 20 72 63 20 3d 20 7a 65 72 6f 4a 6f 75 72     rc = zeroJour
cc90: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 68  nalHdr(pPager, h
cca0: 61 73 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20  asMaster);.     
ccb0: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61   pager_error(pPa
ccc0: 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  ger, rc);.      
ccd0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
cce0: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
ccf0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
cd00: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
cd10: 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72  lse{.      asser
cd20: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
cd30: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
cd40: 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
cd50: 20 7c 7c 20 72 63 20 29 3b 0a 20 20 20 20 20 20   || rc );.      
cd60: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
cd70: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
cd80: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
cd90: 45 5f 4f 4b 20 26 26 20 21 70 50 61 67 65 72 2d  E_OK && !pPager-
cda0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
cdb0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
cdc0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
cdd0: 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
cde0: 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  zJournal, 0);.  
cdf0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66      }.    }..#if
ce00: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
ce10: 5f 50 41 47 45 53 0a 20 20 20 20 73 71 6c 69 74  _PAGES.    sqlit
ce20: 65 33 50 63 61 63 68 65 49 74 65 72 61 74 65 44  e3PcacheIterateD
ce30: 69 72 74 79 28 70 50 61 67 65 72 2d 3e 70 50 43  irty(pPager->pPC
ce40: 61 63 68 65 2c 20 70 61 67 65 72 5f 73 65 74 5f  ache, pager_set_
ce50: 70 61 67 65 68 61 73 68 29 3b 0a 23 65 6e 64 69  pagehash);.#endi
ce60: 66 0a 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  f..    sqlite3Pc
ce70: 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61  acheCleanAll(pPa
ce80: 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
ce90: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
cea0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
ceb0: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
cec0: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
ced0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  nal = 0;.    pPa
cee0: 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
cef0: 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65   }..  if( !pPage
cf00: 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
cf10: 20 29 7b 0a 20 20 20 20 72 63 32 20 3d 20 6f 73   ){.    rc2 = os
cf20: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
cf30: 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  d, SHARED_LOCK);
cf40: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
cf50: 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45  te = PAGER_SHARE
cf60: 44 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  D;.    pPager->c
cf70: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
cf80: 20 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   0;.  }else if( 
cf90: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
cfa0: 41 47 45 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20  AGER_SYNCED ){. 
cfb0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
cfc0: 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49   = PAGER_EXCLUSI
cfd0: 56 45 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  VE;.  }.  pPager
cfe0: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
cff0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
d000: 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
d010: 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20  r->dbModified = 
d020: 30 3b 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20 49  0;..  /* TODO: I
d030: 73 20 74 68 69 73 20 6f 70 74 69 6d 61 6c 3f 20  s this optimal? 
d040: 57 68 79 20 69 73 20 74 68 65 20 64 62 20 73 69  Why is the db si
d050: 7a 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 68  ze invalidated h
d060: 65 72 65 20 0a 20 20 2a 2a 20 77 68 65 6e 20 74  ere .  ** when t
d070: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d080: 20 69 73 20 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64   is not unlocked
d090: 3f 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ? */.  pPager->d
d0a0: 62 4f 72 69 67 53 69 7a 65 20 3d 20 30 3b 0a 20  bOrigSize = 0;. 
d0b0: 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 54 72   sqlite3PcacheTr
d0c0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 70  uncate(pPager->p
d0d0: 50 43 61 63 68 65 2c 20 70 50 61 67 65 72 2d 3e  PCache, pPager->
d0e0: 64 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 21  dbSize);.  if( !
d0f0: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
d100: 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64  ger->dbSizeValid
d110: 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = 0;.  }..  ret
d120: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
d130: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
d140: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
d150: 44 61 74 61 20 6d 75 73 74 20 70 6f 69 6e 74 20  Data must point 
d160: 74 6f 20 61 20 62 75 66 66 65 72 20 6f 66 20 70  to a buffer of p
d170: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
d180: 62 79 74 65 73 0a 2a 2a 20 6f 66 20 64 61 74 61  bytes.** of data
d190: 2e 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  . Compute and re
d1a0: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
d1b0: 62 61 73 65 64 20 6f 6e 74 20 74 68 65 20 63 6f  based ont the co
d1c0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 0a 2a  ntents of the .*
d1d0: 2a 20 70 61 67 65 20 6f 66 20 64 61 74 61 20 61  * page of data a
d1e0: 6e 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  nd the current v
d1f0: 61 6c 75 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  alue of pPager->
d200: 63 6b 73 75 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a  cksumInit..**.**
d210: 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72   This is not a r
d220: 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 49 74  eal checksum. It
d230: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
d240: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
d250: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
d260: 6c 20 76 61 6c 75 65 20 28 70 50 61 67 65 72 2d  l value (pPager-
d270: 3e 63 6b 73 75 6d 49 6e 69 74 29 20 61 6e 64 20  >cksumInit) and 
d280: 65 76 65 72 79 20 32 30 30 74 68 20 62 79 74 65  every 200th byte
d290: 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 20  .** of the page 
d2a0: 64 61 74 61 2c 20 73 74 61 72 74 69 6e 67 20 77  data, starting w
d2b0: 69 74 68 20 62 79 74 65 20 6f 66 66 73 65 74 20  ith byte offset 
d2c0: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
d2d0: 65 25 32 30 30 29 2e 0a 2a 2a 20 45 61 63 68 20  e%200)..** Each 
d2e0: 62 79 74 65 20 69 73 20 69 6e 74 65 72 70 72 65  byte is interpre
d2f0: 74 65 64 20 61 73 20 61 6e 20 38 2d 62 69 74 20  ted as an 8-bit 
d300: 75 6e 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  unsigned integer
d310: 2e 0a 2a 2a 0a 2a 2a 20 43 68 61 6e 67 69 6e 67  ..**.** Changing
d320: 20 74 68 65 20 66 6f 72 6d 75 6c 61 20 75 73 65   the formula use
d330: 64 20 74 6f 20 63 6f 6d 70 75 74 65 20 74 68 69  d to compute thi
d340: 73 20 63 68 65 63 6b 73 75 6d 20 72 65 73 75 6c  s checksum resul
d350: 74 73 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f  ts in an.** inco
d360: 6d 70 61 74 69 62 6c 65 20 6a 6f 75 72 6e 61 6c  mpatible journal
d370: 20 66 69 6c 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a   file format..**
d380: 0a 2a 2a 20 49 66 20 6a 6f 75 72 6e 61 6c 20 63  .** If journal c
d390: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
d3a0: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
d3b0: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
d3c0: 74 20 6c 69 6b 65 6c 79 20 0a 2a 2a 20 73 63 65  t likely .** sce
d3d0: 6e 61 72 69 6f 20 69 73 20 74 68 61 74 20 6f 6e  nario is that on
d3e0: 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68  e end or the oth
d3f0: 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64  er of the record
d400: 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64   will be changed
d410: 2e 20 0a 2a 2a 20 49 74 20 69 73 20 6d 75 63 68  . .** It is much
d420: 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61   less likely tha
d430: 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f  t the two ends o
d440: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65  f the journal re
d450: 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  cord will be.** 
d460: 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20  correct and the 
d470: 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70  middle be corrup
d480: 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22  t.  Thus, this "
d490: 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65  checksum" scheme
d4a0: 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74  ,.** though fast
d4b0: 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74   and simple, cat
d4c0: 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20  ches the mostly 
d4d0: 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63  likely kind of c
d4e0: 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  orruption..*/.st
d4f0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
d500: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
d510: 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a 61 44  er, const u8 *aD
d520: 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73 75  ata){.  u32 cksu
d530: 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
d540: 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20 2f  mInit;         /
d550: 2a 20 43 68 65 63 6b 73 75 6d 20 76 61 6c 75 65  * Checksum value
d560: 20 74 6f 20 72 65 74 75 72 6e 20 2a 2f 0a 20 20   to return */.  
d570: 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d 3e  int i = pPager->
d580: 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 20 20 20  pageSize-200;   
d590: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
d5a0: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 77 68 69 6c  ounter */.  whil
d5b0: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
d5c0: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
d5d0: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
d5e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
d5f0: 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  m;.}../*.** Read
d600: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
d610: 72 6f 6d 20 65 69 74 68 65 72 20 74 68 65 20 6a  rom either the j
d620: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 69 66 20  ournal file (if 
d630: 69 73 4d 61 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f  isMainJrnl==1) o
d640: 72 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 73 75  r.** from the su
d650: 62 2d 6a 6f 75 72 6e 61 6c 20 28 69 66 20 69 73  b-journal (if is
d660: 4d 61 69 6e 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64  MainJrnl==0) and
d670: 20 70 6c 61 79 62 61 63 6b 20 74 68 61 74 20 70   playback that p
d680: 61 67 65 2e 0a 2a 2a 20 54 68 65 20 70 61 67 65  age..** The page
d690: 20 62 65 67 69 6e 73 20 61 74 20 6f 66 66 73 65   begins at offse
d6a0: 74 20 2a 70 4f 66 66 73 65 74 20 69 6e 74 6f 20  t *pOffset into 
d6b0: 74 68 65 20 66 69 6c 65 2e 20 54 68 65 20 2a 70  the file. The *p
d6c0: 4f 66 66 73 65 74 0a 2a 2a 20 76 61 6c 75 65 20  Offset.** value 
d6d0: 69 73 20 69 6e 63 72 65 61 73 65 64 20 74 6f 20  is increased to 
d6e0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
d6f0: 20 6e 65 78 74 20 70 61 67 65 20 69 6e 20 74 68   next page in th
d700: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
d710: 20 54 68 65 20 69 73 4d 61 69 6e 4a 72 6e 6c 20   The isMainJrnl 
d720: 66 6c 61 67 20 69 73 20 74 72 75 65 20 69 66 20  flag is true if 
d730: 74 68 69 73 20 69 73 20 74 68 65 20 6d 61 69 6e  this is the main
d740: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
d750: 6c 20 61 6e 64 0a 2a 2a 20 66 61 6c 73 65 20 66  l and.** false f
d760: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
d770: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d   journal.  The m
d780: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  ain rollback jou
d790: 72 6e 61 6c 20 75 73 65 73 0a 2a 2a 20 63 68 65  rnal uses.** che
d7a0: 63 6b 73 75 6d 73 20 2d 20 74 68 65 20 73 74 61  cksums - the sta
d7b0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 64  tement journal d
d7c0: 6f 65 73 20 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49  oes not..**.** I
d7d0: 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  f the page numbe
d7e0: 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 72 65  r of the page re
d7f0: 63 6f 72 64 20 72 65 61 64 20 66 72 6f 6d 20 74  cord read from t
d800: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d810: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 67 72 65 61   file.** is grea
d820: 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
d830: 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50 61  rent value of Pa
d840: 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 65 6e  ger.dbSize, then
d850: 20 70 6c 61 79 62 61 63 6b 20 69 73 0a 2a 2a 20   playback is.** 
d860: 73 6b 69 70 70 65 64 20 61 6e 64 20 53 51 4c 49  skipped and SQLI
d870: 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
d880: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e  d..**.** If pDon
d890: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74  e is not NULL, t
d8a0: 68 65 6e 20 69 74 20 69 73 20 61 20 72 65 63 6f  hen it is a reco
d8b0: 72 64 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  rd of pages that
d8c0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 0a 2a 2a   have already.**
d8d0: 20 62 65 65 6e 20 70 6c 61 79 65 64 20 62 61 63   been played bac
d8e0: 6b 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20  k.  If the page 
d8f0: 61 74 20 2a 70 4f 66 66 73 65 74 20 68 61 73 20  at *pOffset has 
d900: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 70 6c 61  already been pla
d910: 79 65 64 20 62 61 63 6b 0a 2a 2a 20 28 69 66 20  yed back.** (if 
d920: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
d930: 67 20 70 44 6f 6e 65 20 62 69 74 20 69 73 20 73  g pDone bit is s
d940: 65 74 29 20 74 68 65 6e 20 73 6b 69 70 20 74 68  et) then skip th
d950: 65 20 70 6c 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d  e playback..** M
d960: 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 44 6f  ake sure the pDo
d970: 6e 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e  ne bit correspon
d980: 64 69 6e 67 20 74 6f 20 74 68 65 20 2a 70 4f 66  ding to the *pOf
d990: 66 73 65 74 20 70 61 67 65 20 69 73 20 73 65 74  fset page is set
d9a0: 0a 2a 2a 20 70 72 69 6f 72 20 74 6f 20 72 65 74  .** prior to ret
d9b0: 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66  urning..**.** If
d9c0: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
d9d0: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79   is successfully
d9e0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
d9f0: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
da00: 65 0a 2a 2a 20 61 6e 64 20 70 6c 61 79 65 64 20  e.** and played 
da10: 62 61 63 6b 2c 20 74 68 65 6e 20 53 51 4c 49 54  back, then SQLIT
da20: 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
da30: 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
da40: 20 6f 63 63 75 72 73 0a 2a 2a 20 77 68 69 6c 65   occurs.** while
da50: 20 72 65 61 64 69 6e 67 20 74 68 65 20 72 65 63   reading the rec
da60: 6f 72 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75  ord from the (su
da70: 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  b-)journal file 
da80: 6f 72 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  or while writing
da90: 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
daa0: 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 74  ase file, then t
dab0: 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  he IO error code
dac0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
dad0: 20 64 61 74 61 0a 2a 2a 20 69 73 20 73 75 63 63   data.** is succ
dae0: 65 73 73 66 75 6c 6c 79 20 72 65 61 64 20 66 72  essfully read fr
daf0: 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a 6f 75  om the (sub-)jou
db00: 72 6e 61 6c 20 66 69 6c 65 20 62 75 74 20 61 70  rnal file but ap
db10: 70 65 61 72 73 20 74 6f 20 62 65 0a 2a 2a 20 63  pears to be.** c
db20: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
db30: 5f 44 4f 4e 45 20 69 73 20 72 65 74 75 72 6e 65  _DONE is returne
db40: 64 2e 20 44 61 74 61 20 69 73 20 63 6f 6e 73 69  d. Data is consi
db50: 64 65 72 65 64 20 63 6f 72 72 75 70 74 65 64 20  dered corrupted 
db60: 69 6e 0a 2a 2a 20 74 77 6f 20 63 69 72 63 75 6d  in.** two circum
db70: 73 74 61 6e 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20  stances:.** .** 
db80: 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f 72    * If the recor
db90: 64 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69 73  d page-number is
dba0: 20 69 6c 6c 65 67 61 6c 20 28 30 20 6f 72 20 50   illegal (0 or P
dbb0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f  AGER_MJ_PGNO), o
dbc0: 72 0a 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20  r.**   * If the 
dbd0: 72 65 63 6f 72 64 20 69 73 20 62 65 69 6e 67 20  record is being 
dbe0: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 66 72 6f 6d  rolled back from
dbf0: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
dc00: 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20 61 6e  l file.**     an
dc10: 64 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 66  d the checksum f
dc20: 69 65 6c 64 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ield does not ma
dc30: 74 63 68 20 74 68 65 20 72 65 63 6f 72 64 20 63  tch the record c
dc40: 6f 6e 74 65 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65  ontent..**.** Ne
dc50: 69 74 68 65 72 20 6f 66 20 74 68 65 73 65 20 74  ither of these t
dc60: 77 6f 20 73 63 65 6e 61 72 69 6f 73 20 61 72 65  wo scenarios are
dc70: 20 70 6f 73 73 69 62 6c 65 20 64 75 72 69 6e 67   possible during
dc80: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c   a savepoint rol
dc90: 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  lback..**.** If 
dca0: 74 68 69 73 20 69 73 20 61 20 73 61 76 65 70 6f  this is a savepo
dcb0: 69 6e 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  int rollback, th
dcc0: 65 6e 20 6d 65 6d 6f 72 79 20 6d 61 79 20 68 61  en memory may ha
dcd0: 76 65 20 74 6f 20 62 65 20 64 79 6e 61 6d 69 63  ve to be dynamic
dce0: 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ally.** allocate
dcf0: 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69  d by this functi
dd00: 6f 6e 2e 20 49 66 20 74 68 69 73 20 69 73 20 74  on. If this is t
dd10: 68 65 20 63 61 73 65 20 61 6e 64 20 61 6e 20 61  he case and an a
dd20: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
dd30: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
dd40: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
dd50: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
dd60: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
dd70: 61 67 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  age(.  Pager *pP
dd80: 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ager,           
dd90: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
dda0: 72 20 62 65 69 6e 67 20 70 6c 61 79 65 64 20 62  r being played b
ddb0: 61 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 4d  ack */.  int isM
ddc0: 61 69 6e 4a 72 6e 6c 2c 20 20 20 20 20 20 20 20  ainJrnl,        
ddd0: 20 20 20 20 20 20 20 2f 2a 20 31 20 2d 3e 20 6d         /* 1 -> m
dde0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d  ain journal. 0 -
ddf0: 3e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a  > sub-journal. *
de00: 2f 0a 20 20 69 6e 74 20 69 73 55 6e 73 79 6e 63  /.  int isUnsync
de10: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
de20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 72 65 61    /* True if rea
de30: 64 69 6e 67 20 66 72 6f 6d 20 75 6e 73 79 6e 63  ding from unsync
de40: 65 64 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  ed main journal 
de50: 2a 2f 0a 20 20 69 36 34 20 2a 70 4f 66 66 73 65  */.  i64 *pOffse
de60: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
de70: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
de80: 72 65 63 6f 72 64 20 74 6f 20 70 6c 61 79 62 61  record to playba
de90: 63 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 73 53 61  ck */.  int isSa
dea0: 76 65 70 6e 74 2c 20 20 20 20 20 20 20 20 20 20  vepnt,          
deb0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
dec0: 72 20 61 20 73 61 76 65 70 6f 69 6e 74 20 72 6f  r a savepoint ro
ded0: 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 42 69 74 76  llback */.  Bitv
dee0: 65 63 20 2a 70 44 6f 6e 65 20 20 20 20 20 20 20  ec *pDone       
def0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 69 74            /* Bit
df00: 76 65 63 20 6f 66 20 70 61 67 65 73 20 61 6c 72  vec of pages alr
df10: 65 61 64 79 20 70 6c 61 79 65 64 20 62 61 63 6b  eady played back
df20: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b   */.){.  int rc;
df30: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20 20  .  PgHdr *pPg;  
df40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df50: 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67 20   /* An existing 
df60: 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68  page in the cach
df70: 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
df80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
df90: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
dfa0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61 67   number of a pag
dfb0: 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  e in journal */.
dfc0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
dfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dfe0: 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65 64  /* Checksum used
dff0: 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63   for sanity chec
e000: 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  king */.  u8 *aD
e010: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20  ata;            
e020: 20 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f          /* Tempo
e030: 72 61 72 79 20 73 74 6f 72 61 67 65 20 66 6f 72  rary storage for
e040: 20 74 68 65 20 70 61 67 65 20 2a 2f 0a 20 20 73   the page */.  s
e050: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64  qlite3_file *jfd
e060: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
e070: 54 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  The file descrip
e080: 74 6f 72 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  tor for the jour
e090: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 61  nal file */..  a
e0a0: 73 73 65 72 74 28 20 28 69 73 4d 61 69 6e 4a 72  ssert( (isMainJr
e0b0: 6e 6c 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20  nl&~1)==0 );    
e0c0: 20 20 2f 2a 20 69 73 4d 61 69 6e 4a 72 6e 6c 20    /* isMainJrnl 
e0d0: 69 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61  is 0 or 1 */.  a
e0e0: 73 73 65 72 74 28 20 28 69 73 53 61 76 65 70 6e  ssert( (isSavepn
e0f0: 74 26 7e 31 29 3d 3d 30 20 29 3b 20 20 20 20 20  t&~1)==0 );     
e100: 20 20 2f 2a 20 69 73 53 61 76 65 70 6e 74 20 69    /* isSavepnt i
e110: 73 20 30 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73  s 0 or 1 */.  as
e120: 73 65 72 74 28 20 69 73 4d 61 69 6e 4a 72 6e 6c  sert( isMainJrnl
e130: 20 7c 7c 20 70 44 6f 6e 65 20 29 3b 20 20 20 20   || pDone );    
e140: 20 2f 2a 20 70 44 6f 6e 65 20 61 6c 77 61 79 73   /* pDone always
e150: 20 75 73 65 64 20 6f 6e 20 73 75 62 2d 6a 6f 75   used on sub-jou
e160: 72 6e 61 6c 73 20 2a 2f 0a 20 20 61 73 73 65 72  rnals */.  asser
e170: 74 28 20 69 73 53 61 76 65 70 6e 74 20 7c 7c 20  t( isSavepnt || 
e180: 70 44 6f 6e 65 3d 3d 30 20 29 3b 20 20 20 2f 2a  pDone==0 );   /*
e190: 20 70 44 6f 6e 65 20 6e 65 76 65 72 20 75 73 65   pDone never use
e1a0: 64 20 6f 6e 20 6e 6f 6e 2d 73 61 76 65 70 6f 69  d on non-savepoi
e1b0: 6e 74 20 2a 2f 0a 0a 20 20 61 44 61 74 61 20 3d  nt */..  aData =
e1c0: 20 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54   (u8*)pPager->pT
e1d0: 6d 70 53 70 61 63 65 3b 0a 20 20 61 73 73 65 72  mpSpace;.  asser
e1e0: 74 28 20 61 44 61 74 61 20 29 3b 20 20 20 20 20  t( aData );     
e1f0: 20 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72      /* Temp stor
e200: 61 67 65 20 6d 75 73 74 20 68 61 76 65 20 61 6c  age must have al
e210: 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c 6f 63  ready been alloc
e220: 61 74 65 64 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65  ated */..  /* Re
e230: 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ad the page numb
e240: 65 72 20 61 6e 64 20 70 61 67 65 20 64 61 74 61  er and page data
e250: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
e260: 6c 20 6f 72 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  l or sub-journal
e270: 0a 20 20 2a 2a 20 66 69 6c 65 2e 20 52 65 74 75  .  ** file. Retu
e280: 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
e290: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 69   to the caller i
e2a0: 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
e2b0: 63 75 72 73 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64  curs..  */.  jfd
e2c0: 20 3d 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20   = isMainJrnl ? 
e2d0: 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20 70 50  pPager->jfd : pP
e2e0: 61 67 65 72 2d 3e 73 6a 66 64 3b 0a 20 20 72 63  ager->sjfd;.  rc
e2f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
e300: 64 2c 20 2a 70 4f 66 66 73 65 74 2c 20 26 70 67  d, *pOffset, &pg
e310: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
e320: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
e330: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
e340: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
e350: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
e360: 61 67 65 53 69 7a 65 2c 20 28 2a 70 4f 66 66 73  ageSize, (*pOffs
e370: 65 74 29 2b 34 29 3b 0a 20 20 69 66 28 20 72 63  et)+4);.  if( rc
e380: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
e390: 74 75 72 6e 20 72 63 3b 0a 20 20 2a 70 4f 66 66  turn rc;.  *pOff
e3a0: 73 65 74 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70  set += pPager->p
e3b0: 61 67 65 53 69 7a 65 20 2b 20 34 20 2b 20 69 73  ageSize + 4 + is
e3c0: 4d 61 69 6e 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f  MainJrnl*4;..  /
e3d0: 2a 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * Sanity checkin
e3e0: 67 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20  g on the page.  
e3f0: 54 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70  This is more imp
e400: 6f 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72  ortant that I or
e410: 69 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68  iginally.  ** th
e420: 6f 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77  ought.  If a pow
e430: 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72  er failure occur
e440: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
e450: 6e 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69  nal is being wri
e460: 74 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f  tten,.  ** it co
e470: 75 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69  uld cause invali
e480: 64 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69  d data to be wri
e490: 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
e4a0: 75 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20  urnal.  We need 
e4b0: 74 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74  to.  ** detect t
e4c0: 68 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61  his invalid data
e4d0: 20 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62   (with high prob
e4e0: 61 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e  ability) and ign
e4f0: 6f 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  ore it..  */.  i
e500: 66 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  f( pgno==0 || pg
e510: 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
e520: 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
e530: 20 61 73 73 65 72 74 28 20 21 69 73 53 61 76 65   assert( !isSave
e540: 70 6e 74 20 29 3b 0a 20 20 20 20 72 65 74 75 72  pnt );.    retur
e550: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
e560: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 50   }.  if( pgno>(P
e570: 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53 69  gno)pPager->dbSi
e580: 7a 65 20 7c 7c 20 73 71 6c 69 74 65 33 42 69 74  ze || sqlite3Bit
e590: 76 65 63 54 65 73 74 28 70 44 6f 6e 65 2c 20 70  vecTest(pDone, p
e5a0: 67 6e 6f 29 20 29 7b 0a 20 20 20 20 72 65 74 75  gno) ){.    retu
e5b0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
e5c0: 7d 0a 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72  }.  if( isMainJr
e5d0: 6e 6c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  nl ){.    rc = r
e5e0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 28  ead32bits(jfd, (
e5f0: 2a 70 4f 66 66 73 65 74 29 2d 34 2c 20 26 63 6b  *pOffset)-4, &ck
e600: 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  sum);.    if( rc
e610: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
e620: 20 20 69 66 28 20 21 69 73 53 61 76 65 70 6e 74    if( !isSavepnt
e630: 20 26 26 20 70 61 67 65 72 5f 63 6b 73 75 6d 28   && pager_cksum(
e640: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
e650: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
e660: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
e670: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
e680: 69 66 28 20 70 44 6f 6e 65 20 26 26 20 28 72 63  if( pDone && (rc
e690: 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
e6a0: 53 65 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  Set(pDone, pgno)
e6b0: 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
e6c0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
e6d0: 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50   }..  assert( pP
e6e0: 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
e6f0: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
e700: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
e710: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
e720: 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
e730: 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52 56  ger is in RESERV
e740: 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74  ED state, then t
e750: 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20 63  here must be a c
e760: 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a  opy of this.  **
e770: 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61 67   page in the pag
e780: 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69  er cache. In thi
e790: 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64 61  s case just upda
e7a0: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
e7b0: 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65  he,.  ** not the
e7c0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
e7d0: 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66 74  The page is left
e7e0: 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e   marked dirty in
e7f0: 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a   this case..  **
e800: 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69  .  ** An excepti
e810: 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20  on to the above 
e820: 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74  rule: If the dat
e830: 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73  abase is in no-s
e840: 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e  ync mode.  ** an
e850: 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65  d a page is move
e860: 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72  d during an incr
e870: 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74  emental vacuum t
e880: 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79  hen the page may
e890: 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20  .  ** not be in 
e8a0: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e  the pager cache.
e8b0: 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c   Later: if a mal
e8c0: 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f  loc() or IO erro
e8d0: 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75  r occurs.  ** du
e8e0: 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28  ring a Movepage(
e8f0: 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65  ) call, then the
e900: 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65   page may not be
e910: 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20   in the cache.  
e920: 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68  ** either. So th
e930: 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63  e condition desc
e940: 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f  ribed in the abo
e950: 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73 20  ve paragraph is 
e960: 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28  not.  ** assert(
e970: 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  )able..  **.  **
e980: 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45   If in EXCLUSIVE
e990: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20   state, then we 
e9a0: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
e9b0: 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78 69   cache if it exi
e9c0: 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65  sts.  ** and the
e9d0: 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20   main file. The 
e9e0: 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72  page is then mar
e9f0: 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20  ked not dirty.. 
ea00: 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20   **.  ** Ticket 
ea10: 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61 74  #1171:  The stat
ea20: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69  ement journal mi
ea30: 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65  ght contain page
ea40: 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73   content that is
ea50: 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20  .  ** different 
ea60: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f  from the page co
ea70: 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74 61  ntent at the sta
ea80: 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61  rt of the transa
ea90: 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73  ction..  ** This
eaa0: 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20 70   occurs when a p
eab0: 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20 70  age is changed p
eac0: 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72  rior to the star
ead0: 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74  t of a statement
eae0: 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67  .  ** then chang
eaf0: 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20  ed again within 
eb00: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  the statement.  
eb10: 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63  When rolling bac
eb20: 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74  k such a.  ** st
eb30: 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20  atement we must 
eb40: 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68 65  not write to the
eb50: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
eb60: 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f  se unless we kno
eb70: 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61  w.  ** for certa
eb80: 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c  in that original
eb90: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
eba0: 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  re synced into t
ebb0: 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b  he main rollback
ebc0: 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20  .  ** journal.  
ebd0: 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77  Otherwise, a pow
ebe0: 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65  er loss might le
ebf0: 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74  ave modified dat
ec00: 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61  a in the.  ** da
ec10: 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74 68  tabase file with
ec20: 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20  out an entry in 
ec30: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
ec40: 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20  rnal that can.  
ec50: 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  ** restore the d
ec60: 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f  atabase to its o
ec70: 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54  riginal form.  T
ec80: 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75  wo conditions mu
ec90: 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62  st be.  ** met b
eca0: 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f  efore writing to
ecb0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ecc0: 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61 74  les. (1) the dat
ecd0: 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20  abase must be.  
ece0: 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20  ** locked.  (2) 
ecf0: 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  we know that the
ed00: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63   original page c
ed10: 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20  ontent is fully 
ed20: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74  synced.  ** in t
ed30: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
ed40: 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20 74  either because t
ed50: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
ed60: 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a  n cache or else.
ed70: 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73    ** the page is
ed80: 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53   marked as needS
ed90: 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a  ync==0..  **.  *
eda0: 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20 57  * 2008-04-14:  W
edb0: 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20 74  hen attempting t
edc0: 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72 75  o vacuum a corru
edd0: 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  pt database file
ede0: 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f 73  , it.  ** is pos
edf0: 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61 20  sible to fail a 
ee00: 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20 64  statement on a d
ee10: 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f 65  atabase that doe
ee20: 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74 2e  s not yet exist.
ee30: 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74 74  .  ** Do not att
ee40: 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69 66  empt to write if
ee50: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
ee60: 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f 70  as never been op
ee70: 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  ened..  */.  pPg
ee80: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
ee90: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
eea0: 20 61 73 73 65 72 74 28 20 70 50 67 20 7c 7c 20   assert( pPg || 
eeb0: 21 4d 45 4d 44 42 20 29 3b 0a 20 20 50 41 47 45  !MEMDB );.  PAGE
eec0: 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41 43  RTRACE(("PLAYBAC
eed0: 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  K %d page %d has
eee0: 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a 20  h(%08x) %s\n",. 
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
ef00: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
ef10: 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68  gno, pager_datah
ef20: 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65  ash(pPager->page
ef30: 53 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20 20  Size, aData),.  
ef40: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 73               (is
ef50: 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d 6a  MainJrnl?"main-j
ef60: 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f 75  ournal":"sub-jou
ef70: 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20 69  rnal").  ));.  i
ef80: 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  f( (pPager->stat
ef90: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
efa0: 56 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d 3d  VE).   && (pPg==
efb0: 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66 6c  0 || 0==(pPg->fl
efc0: 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
efd0: 59 4e 43 29 29 0a 20 20 20 26 26 20 69 73 4f 70  YNC)).   && isOp
efe0: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a 20  en(pPager->fd). 
eff0: 20 20 26 26 20 21 69 73 55 6e 73 79 6e 63 0a 20    && !isUnsync. 
f000: 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73 74   ){.    i64 ofst
f010: 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
f020: 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
f030: 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  e;.    rc = sqli
f040: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
f050: 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70 50  r->fd, aData, pP
f060: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
f070: 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  ofst);.    if( p
f080: 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46 69  gno>pPager->dbFi
f090: 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  leSize ){.      
f0a0: 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69  pPager->dbFileSi
f0b0: 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 7d  ze = pgno;.    }
f0c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
f0d0: 3e 70 42 61 63 6b 75 70 20 29 7b 0a 20 20 20 20  >pBackup ){.    
f0e0: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
f0f0: 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c   aData, pgno, 3,
f100: 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
f110: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
f120: 42 61 63 6b 75 70 55 70 64 61 74 65 28 70 50 61  BackupUpdate(pPa
f130: 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67  ger->pBackup, pg
f140: 6e 6f 2c 20 61 44 61 74 61 29 3b 0a 20 20 20 20  no, aData);.    
f150: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
f160: 20 61 44 61 74 61 2c 20 70 67 6e 6f 2c 20 30 2c   aData, pgno, 0,
f170: 20 72 63 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d   rc=SQLITE_NOMEM
f180: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
f190: 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
f1a0: 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
f1b0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
f1c0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
f1d0: 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
f1e0: 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
f1f0: 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
f200: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
f210: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
f220: 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
f230: 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
f240: 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
f250: 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
f260: 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
f270: 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
f280: 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
f290: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
f2a0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
f2b0: 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
f2c0: 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
f2d0: 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
f2e0: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
f2f0: 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
f300: 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
f310: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
f320: 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
f330: 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
f340: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
f350: 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
f360: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
f370: 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
f380: 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
f390: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
f3a0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f3b0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
f3c0: 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
f3d0: 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
f3e0: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
f3f0: 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
f400: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
f410: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
f420: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
f430: 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
f440: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
f450: 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
f460: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
f470: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
f480: 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
f490: 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
f4a0: 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
f4b0: 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
f4c0: 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
f4d0: 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
f4e0: 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
f4f0: 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
f500: 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
f510: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
f520: 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
f530: 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20  ;.    if( (rc = 
f540: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
f550: 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
f560: 2c 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c  , &pPg, 1))!=SQL
f570: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f580: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f590: 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
f5a0: 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
f5b0: 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
f5c0: 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
f5d0: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
f5e0: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
f5f0: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
f600: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
f610: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
f620: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
f630: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
f640: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
f650: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
f660: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
f670: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
f680: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
f690: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
f6a0: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
f6b0: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
f6c0: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
f6d0: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
f6e0: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
f6f0: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
f700: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
f710: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
f720: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
f730: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
f740: 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
f750: 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
f760: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
f770: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
f780: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
f790: 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
f7a0: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
f7b0: 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ter(pPg);.    }.
f7c0: 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
f7d0: 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
f7e0: 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
f7f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f800: 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
f810: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
f820: 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
f830: 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
f840: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
f850: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
f860: 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
f870: 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
f880: 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
f890: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
f8a0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
f8b0: 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
f8c0: 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
f8d0: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
f8e0: 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
f8f0: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
f900: 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
f910: 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
f920: 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  the..      **.  
f930: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
f940: 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
f950: 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
f960: 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
f970: 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
f980: 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
f990: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
f9a0: 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
f9b0: 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
f9c0: 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
f9d0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
f9e0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
f9f0: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
fa00: 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
fa10: 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
fa20: 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
fa30: 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
fa40: 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
fa50: 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
fa60: 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
fa70: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
fa80: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
fa90: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
faa0: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
fab0: 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
fac0: 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
fad0: 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
fae0: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
faf0: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
fb00: 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
fb10: 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
fb20: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
fb30: 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
fb40: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
fb50: 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
fb60: 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
fb70: 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
fb80: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
fb90: 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
fba0: 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
fbb0: 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
fbc0: 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
fbd0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
fbe0: 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
fbf0: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
fc00: 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
fc10: 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
fc20: 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
fc30: 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
fc40: 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
fc50: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
fc60: 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
fc70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
fc80: 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
fc90: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
fca0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
fcb0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
fcc0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
fcd0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
fce0: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
fcf0: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
fd00: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
fd10: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
fd20: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
fd30: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
fd40: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
fd50: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
fd60: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
fd70: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
fd80: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
fd90: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
fda0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
fdb0: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
fdc0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
fdd0: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
fde0: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
fdf0: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
fe00: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
fe10: 3e 70 67 6e 6f 2c 20 33 2c 20 72 63 3d 53 51 4c  >pgno, 3, rc=SQL
fe20: 49 54 45 5f 4e 4f 4d 45 4d 29 3b 0a 20 20 20 20  ITE_NOMEM);.    
fe30: 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c  sqlite3PcacheRel
fe40: 65 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  ease(pPg);.  }. 
fe50: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23   return rc;.}..#
fe60: 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42  if !defined(NDEB
fe70: 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53  UG) || defined(S
fe80: 51 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54  QLITE_COVERAGE_T
fe90: 45 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  EST)./*.** This 
fea0: 72 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68  routine looks ah
feb0: 65 61 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ead into the mai
fec0: 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  n journal file a
fed0: 6e 64 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a  nd determines.**
fee0: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
fef0: 74 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20  the next record 
ff00: 28 74 68 65 20 72 65 63 6f 72 64 20 74 68 61 74  (the record that
ff10: 20 62 65 67 69 6e 73 20 61 74 20 66 69 6c 65 0a   begins at file.
ff20: 2a 2a 20 6f 66 66 73 65 74 20 70 50 61 67 65 72  ** offset pPager
ff30: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73  ->journalOff) is
ff40: 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70   a well-formed p
ff50: 61 67 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69  age record consi
ff60: 73 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61  sting.** of a va
ff70: 6c 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2c  lid page number,
ff80: 20 70 50 61 67 65 2d 3e 70 61 67 65 53 69 7a 65   pPage->pageSize
ff90: 20 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e   bytes of conten
ffa0: 74 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62  t, followed.** b
ffb0: 79 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 73  y a valid checks
ffc0: 75 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  um..**.** The pa
ffd0: 67 65 72 20 6e 65 76 65 72 20 6e 65 65 64 73 20  ger never needs 
ffe0: 74 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20  to know this in 
fff0: 6f 72 64 65 72 20 74 6f 20 64 6f 20 69 74 73 20  order to do its 
10000 6a 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72  job.   This.** r
10010 6f 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75  outine is only u
10020 73 65 64 20 66 72 6f 6d 20 77 69 74 68 20 61 73  sed from with as
10030 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63  sert() and testc
10040 61 73 65 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f  ase() macros..*/
10050 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10060 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65  rNextJournalPage
10070 49 73 56 61 6c 69 64 28 50 61 67 65 72 20 2a 70  IsValid(Pager *p
10080 50 61 67 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70  Pager){.  Pgno p
10090 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f  gno;           /
100a0 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
100b0 72 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f  r of the page */
100c0 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
100d0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
100e0 61 67 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  age checksum */.
100f0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
10100 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
10110 20 63 6f 64 65 20 66 72 6f 6d 20 72 65 61 64 20   code from read 
10120 6f 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20  operations */.  
10130 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
10140 3b 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65  ;    /* The file
10150 20 64 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d   descriptor from
10160 20 77 68 69 63 68 20 77 65 20 61 72 65 20 72 65   which we are re
10170 61 64 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61  ading */.  u8 *a
10180 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
10190 2f 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68  /* Content of th
101a0 65 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  e page */..  /* 
101b0 52 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75  Read the page nu
101c0 6d 62 65 72 20 68 65 61 64 65 72 20 2a 2f 0a 20  mber header */. 
101d0 20 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66   fd = pPager->jf
101e0 64 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  d;.  rc = read32
101f0 62 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d  bits(fd, pPager-
10200 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67  >journalOff, &pg
10210 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
10220 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75  QLITE_OK ){ retu
10230 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
10240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10250 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10260 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d  ST*/.  if( pgno=
10270 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45  =0 || pgno==PAGE
10280 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
10290 29 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d  ) ){ return 0; }
102a0 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
102b0 53 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e  ST*/.  if( pgno>
102c0 28 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62  (Pgno)pPager->db
102d0 53 69 7a 65 20 29 7b 20 72 65 74 75 72 6e 20 30  Size ){ return 0
102e0 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20  ; }             
102f0 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
10300 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ST*/..  /* Read 
10310 74 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a  the checksum */.
10320 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
10330 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  s(fd, pPager->jo
10340 75 72 6e 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d  urnalOff+pPager-
10350 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b  >pageSize+4, &ck
10360 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  sum);.  if( rc!=
10370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74  SQLITE_OK ){ ret
10380 75 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20  urn 0; }        
10390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103a0 20 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54            /*NO_T
103b0 45 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64  EST*/..  /* Read
103c0 20 74 68 65 20 64 61 74 61 20 61 6e 64 20 76 65   the data and ve
103d0 72 69 66 79 20 74 68 65 20 63 68 65 63 6b 73 75  rify the checksu
103e0 6d 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 28  m */.  aData = (
103f0 75 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70  u8*)pPager->pTmp
10400 53 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 73 71  Space;.  rc = sq
10410 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
10420 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
10430 61 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d  ageSize, pPager-
10440 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a  >journalOff+4);.
10450 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
10460 5f 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  _OK ){ return 0;
10470 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
10480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10490 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
104a0 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75    if( pager_cksu
104b0 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29  m(pPager, aData)
104c0 21 3d 63 6b 73 75 6d 20 29 7b 20 72 65 74 75 72  !=cksum ){ retur
104d0 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
104e0 20 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a      /*NO_TEST*/.
104f0 0a 20 20 2f 2a 20 52 65 61 63 68 20 74 68 69 73  .  /* Reach this
10500 20 70 6f 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74   point only if t
10510 68 65 20 70 61 67 65 20 69 73 20 76 61 6c 69 64  he page is valid
10520 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a   */.  return 1;.
10530 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  }.#endif /* !def
10540 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20  ined(NDEBUG) || 
10550 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43  defined(SQLITE_C
10560 4f 56 45 52 41 47 45 5f 54 45 53 54 29 20 2a 2f  OVERAGE_TEST) */
10570 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
10580 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
10590 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
105a0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
105b0 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
105c0 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
105d0 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
105e0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
105f0 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
10600 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
10610 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
10620 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
10630 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
10640 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
10650 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
10660 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
10670 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
10680 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69   zMaster may poi
10690 6e 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70  nt to Pager.pTmp
106a0 53 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62  Space. So that b
106b0 75 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a  uffer is not .**
106c0 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75   available for u
106d0 73 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66  se within this f
106e0 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57  unction..**.** W
106f0 68 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  hen a master jou
10700 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65  rnal file is cre
10710 61 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75  ated, it is popu
10720 6c 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e  lated with the n
10730 61 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20  ames .** of all 
10740 6f 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75  of its child jou
10750 72 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72  rnals, one after
10760 20 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74   another, format
10770 74 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a  ted as utf-8 .**
10780 20 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54   encoded text. T
10790 68 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63  he end of each c
107a0 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  hild journal fil
107b0 65 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68  e is marked with
107c0 20 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69   a .** nul-termi
107d0 6e 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30  nator byte (0x00
107e0 29 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69  ). i.e. the enti
107f0 72 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  re contents of a
10800 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
10810 2a 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72  ** file for a tr
10820 61 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76  ansaction involv
10830 69 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65  ing two database
10840 73 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a  s might be:.**.*
10850 2a 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f  *   "/home/bill/
10860 61 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30  a.db-journal\x00
10870 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d  /home/bill/b.db-
10880 6a 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a  journal\x00".**.
10890 2a 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72  ** A master jour
108a0 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c  nal file may onl
108b0 79 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63  y be deleted onc
108c0 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69  e all of its chi
108d0 6c 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20  ld .** journals 
108e0 68 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64  have been rolled
108f0 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   back..**.** Thi
10900 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73  s function reads
10910 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
10920 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72   the master-jour
10930 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a  nal file into .*
10940 2a 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f  * memory and loo
10950 70 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  ps through each 
10960 6f 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75  of the child jou
10970 72 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a  rnal names. For.
10980 2a 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f  ** each child jo
10990 75 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73  urnal, it checks
109a0 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69   if:.**.**   * i
109b0 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
109c0 6e 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20  nal exists, and 
109d0 69 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20  if so.**   * if 
109e0 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61  the child journa
109f0 6c 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66  l contains a ref
10a00 65 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72  erence to master
10a10 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20   journal .**    
10a20 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a   file zMaster.**
10a30 0a 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a  .** If a child j
10a40 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f  ournal can be fo
10a50 75 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73  und that matches
10a60 20 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69   both of the cri
10a70 74 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20  teria.** above, 
10a80 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
10a90 74 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f  turns without do
10aa0 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74  ing anything. Ot
10ab0 68 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e  herwise, if.** n
10ac0 6f 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75  o such child jou
10ad0 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e  rnal can be foun
10ae0 64 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20  d, file zMaster 
10af0 69 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a  is deleted from.
10b00 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74  ** the file-syst
10b10 65 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  em using sqlite3
10b20 4f 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a  OsDelete()..**.*
10b30 2a 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  * If an IO error
10b40 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
10b50 63 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20  ction, an error 
10b60 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
10b70 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
10b80 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d  on allocates mem
10b90 6f 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73  ory by calling s
10ba0 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20  qlite3Malloc(). 
10bb0 49 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e  If an allocation
10bc0 0a 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54  .** fails, SQLIT
10bd0 45 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72  E_NOMEM is retur
10be0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
10bf0 69 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c  if no IO or mall
10c00 6f 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63  oc errors .** oc
10c10 63 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  cur, SQLITE_OK i
10c20 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  s returned..**.*
10c30 2a 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e  * TODO: This fun
10c40 63 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20  ction allocates 
10c50 61 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f  a single block o
10c60 66 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64  f memory to load
10c70 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63  .** the entire c
10c80 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d  ontents of the m
10c90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10ca0 6c 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62  le. This could b
10cb0 65 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66  e.** a couple of
10cc0 20 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f   kilobytes or so
10cd0 20 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c   - potentially l
10ce0 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70  arger than the p
10cf0 61 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f  age .** size..*/
10d00 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
10d10 72 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65  r_delmaster(Page
10d20 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
10d30 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
10d40 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
10d50 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
10d60 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20  Vfs;.  int rc;  
10d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d80 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
10d90 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
10da0 65 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f  e *pMaster;    /
10db0 2a 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65  * Malloc'd maste
10dc0 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  r-journal file d
10dd0 65 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73  escriptor */.  s
10de0 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f  qlite3_file *pJo
10df0 75 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c  urnal;   /* Mall
10e00 6f 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e  oc'd child-journ
10e10 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
10e20 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d  or */.  char *zM
10e30 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30  asterJournal = 0
10e40 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66  ; /* Contents of
10e50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10e60 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d  file */.  i64 nM
10e70 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20  asterJournal;   
10e80 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d      /* Size of m
10e90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
10ea0 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f  le */..  /* Allo
10eb0 63 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62  cate space for b
10ec0 6f 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c  oth the pJournal
10ed0 20 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c   and pMaster fil
10ee0 65 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20  e descriptors.. 
10ef0 20 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75   ** If successfu
10f00 6c 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74  l, open the mast
10f10 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
10f20 66 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a  for reading..  *
10f30 2f 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73  /.  pMaster = (s
10f40 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71  qlite3_file *)sq
10f50 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
10f60 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a  pVfs->szOsFile *
10f70 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20   2);.  pJournal 
10f80 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
10f90 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65  *)(((u8 *)pMaste
10fa0 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46  r) + pVfs->szOsF
10fb0 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61  ile);.  if( !pMa
10fc0 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d  ster ){.    rc =
10fd0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
10fe0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73   }else{.    cons
10ff0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53  t int flags = (S
11000 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
11010 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
11020 4d 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b  MASTER_JOURNAL);
11030 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
11040 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d  3OsOpen(pVfs, zM
11050 61 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20  aster, pMaster, 
11060 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20  flags, 0);.  }. 
11070 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11080 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
11090 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d  ter_out;..  rc =
110a0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
110b0 7a 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61  ze(pMaster, &nMa
110c0 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
110d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
110e0 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
110f0 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e  er_out;..  if( n
11100 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20  MasterJournal>0 
11110 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f  ){.    char *zJo
11120 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20  urnal;.    char 
11130 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b  *zMasterPtr = 0;
11140 0a 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72  .    int nMaster
11150 50 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  Ptr = pVfs->mxPa
11160 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f  thname+1;..    /
11170 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
11180 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11190 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
111a0 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
111b0 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61     ** sqlite3_ma
111c0 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
111d0 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
111e0 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
111f0 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
11200 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
11210 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74  lite3Malloc((int
11220 29 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  )nMasterJournal 
11230 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  + nMasterPtr);. 
11240 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
11250 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
11260 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11270 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
11280 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
11290 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74   }.    zMasterPt
112a0 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72  r = &zMasterJour
112b0 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  nal[nMasterJourn
112c0 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  al];.    rc = sq
112d0 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73  lite3OsRead(pMas
112e0 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72  ter, zMasterJour
112f0 6e 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65  nal, (int)nMaste
11300 72 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20  rJournal, 0);.  
11310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11320 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
11330 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a  ster_out;..    z
11340 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65  Journal = zMaste
11350 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68  rJournal;.    wh
11360 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a  ile( (zJournal-z
11370 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e  MasterJournal)<n
11380 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
11390 0a 20 20 20 20 20 20 69 6e 74 20 65 78 69 73 74  .      int exist
113a0 73 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  s;.      rc = sq
113b0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
113c0 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  fs, zJournal, SQ
113d0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
113e0 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20  TS, &exists);.  
113f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11400 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11410 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
11420 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
11430 20 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b     if( exists ){
11440 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  .        /* One 
11450 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
11460 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
11470 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
11480 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20   exists..       
11490 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
114a0 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
114b0 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
114c0 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
114d0 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
114e0 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
114f0 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
11500 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
11510 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
11520 69 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69  int c;.        i
11530 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49  nt flags = (SQLI
11540 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
11550 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
11560 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  N_JOURNAL);.    
11570 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11580 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f  OsOpen(pVfs, zJo
11590 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c  urnal, pJournal,
115a0 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20   flags, 0);.    
115b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
115c0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
115d0 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
115e0 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
115f0 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72  ..        rc = r
11600 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
11610 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74  (pJournal, zMast
11620 65 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74  erPtr, nMasterPt
11630 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
11640 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72  te3OsClose(pJour
11650 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66  nal);.        if
11660 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  ){.          got
11680 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
11690 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
116a0 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50      c = zMasterP
116b0 74 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63  tr[0]!=0 && strc
116c0 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a  mp(zMasterPtr, z
116d0 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20  Master)==0;.    
116e0 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20      if( c ){.   
116f0 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
11700 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
11710 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
11720 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
11730 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
11740 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
11750 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
11760 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
11770 6e 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53  nal += (sqlite3S
11780 74 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c  trlen30(zJournal
11790 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  )+1);.    }.  }.
117a0 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65    .  rc = sqlite
117b0 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20  3OsDelete(pVfs, 
117c0 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65  zMaster, 0);..de
117d0 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69  lmaster_out:.  i
117e0 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( zMasterJourna
117f0 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  l ){.    sqlite3
11800 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75  _free(zMasterJou
11810 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69  rnal);.  }  .  i
11820 66 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20  f( pMaster ){.  
11830 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
11840 28 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61  (pMaster);.    a
11850 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70  ssert( !isOpen(p
11860 4a 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a  Journal) );.  }.
11870 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11880 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72  Master);.  retur
11890 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
118a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
118b0 20 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20   used to change 
118c0 74 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20  the actual size 
118d0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
118e0 0a 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20  .** file in the 
118f0 66 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69  file-system. Thi
11900 73 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77  s only happens w
11910 68 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61  hen committing a
11920 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a   transaction,.**
11930 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
11940 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28   a transaction (
11950 69 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e  including rollin
11960 67 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75  g back a hot-jou
11970 72 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  rnal)..**.** If 
11980 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
11990 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70  e file is not op
119a0 65 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73  en, or an exclus
119b0 69 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a  ive lock is not.
119c0 2a 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  ** held, this fu
119d0 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
119e0 70 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  p. Otherwise, th
119f0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
11a00 6c 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64  le is.** changed
11a10 20 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20   to nPage pages 
11a20 28 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70  (nPage*pPager->p
11a30 61 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20  ageSize bytes). 
11a40 49 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f  If the file.** o
11a50 6e 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e  n disk is curren
11a60 74 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20  tly larger than 
11a70 6e 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65  nPage pages, the
11a80 6e 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a  n use the VFS.**
11a90 20 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74   xTruncate() met
11aa0 68 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  hod to truncate 
11ab0 69 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74  it..**.** Or, it
11ac0 20 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   might might be 
11ad0 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
11ae0 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
11af0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a  s smaller than .
11b00 2a 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20  ** nPage pages. 
11b10 53 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73  Some operating s
11b20 79 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61  ystem implementa
11b30 74 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f  tions can get co
11b40 6e 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f  nfused if .** yo
11b50 75 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74  u try to truncat
11b60 65 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65  e a file to some
11b70 20 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61   size that is la
11b80 72 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a  rger than it .**
11b90 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73   currently is, s
11ba0 6f 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61  o detect this ca
11bb0 73 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73  se and write a s
11bc0 69 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20  ingle zero byte 
11bd0 74 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f  to .** the end o
11be0 66 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69  f the new file i
11bf0 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  nstead..**.** If
11c00 20 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74   successful, ret
11c10 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49  urn SQLITE_OK. I
11c20 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  f an IO error oc
11c30 63 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66  curs while modif
11c40 79 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61  ying.** the data
11c50 62 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72  base file, retur
11c60 6e 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65  n the error code
11c70 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   to the caller..
11c80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
11c90 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
11ca0 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11cb0 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
11cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
11cd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
11ce0 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
11cf0 49 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50  IVE && isOpen(pP
11d00 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20  ager->fd) ){.   
11d10 20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65   i64 currentSize
11d20 2c 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f  , newSize;.    /
11d30 2a 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61  * TODO: Is it sa
11d40 66 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e  fe to use Pager.
11d50 64 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f  dbFileSize here?
11d60 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   */.    rc = sql
11d70 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
11d80 50 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72  Pager->fd, &curr
11d90 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65  entSize);.    ne
11da0 77 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  wSize = pPager->
11db0 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50  pageSize*(i64)nP
11dc0 61 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  age;.    if( rc=
11dd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75  =SQLITE_OK && cu
11de0 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69  rrentSize!=newSi
11df0 7a 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  ze ){.      if( 
11e00 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53  currentSize>newS
11e10 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ize ){.        r
11e20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
11e30 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64  ncate(pPager->fd
11e40 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20  , newSize);.    
11e50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11e60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
11e70 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  rite(pPager->fd,
11e80 20 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d   "", 1, newSize-
11e90 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
11ea0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11eb0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _OK ){.        p
11ec0 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a  Pager->dbFileSiz
11ed0 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20  e = nPage;.     
11ee0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
11ef0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
11f00 2a 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65  ** Set the value
11f10 20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65   of the Pager.se
11f20 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c  ctorSize variabl
11f30 65 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a  e for the given.
11f40 2a 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f  ** pager based o
11f50 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  n the value retu
11f60 72 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63  rned by the xSec
11f70 74 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a  torSize method.*
11f80 2a 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61  * of the open da
11f90 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
11fa0 20 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c   sector size wil
11fb0 6c 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a  l be used used .
11fc0 2a 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  ** to determine 
11fd0 74 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69  the size and ali
11fe0 67 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61  gnment of journa
11ff0 6c 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a  l header and .**
12000 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12010 70 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20  pointers within 
12020 63 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20  created journal 
12030 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  files..**.** For
12040 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
12050 20 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73   the effective s
12060 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c  ector size is al
12070 77 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a  ways 512 bytes..
12080 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  **.** Otherwise,
12090 20 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61   for non-tempora
120a0 72 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66  ry files, the ef
120b0 66 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73  fective sector s
120c0 69 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61  ize is.** the va
120d0 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
120e0 74 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28  the xSectorSize(
120f0 29 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64  ) method rounded
12100 20 75 70 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a   up to 512 if.**
12110 20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e   it is less than
12120 20 35 31 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64   512, or rounded
12130 20 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43   down to MAX_SEC
12140 54 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a  TOR_SIZE if it.*
12150 2a 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61  * is greater tha
12160 6e 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a  n MAX_SECTOR_SIZ
12170 45 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  E..*/.static voi
12180 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
12190 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
121a0 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
121b0 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20  (pPager->fd) || 
121c0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
121d0 20 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67   );..  if( !pPag
121e0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
121f0 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69      /* Sector si
12200 7a 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65  ze doesn't matte
12210 72 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  r for temporary 
12220 66 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65  files. Also, the
12230 20 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79   file.    ** may
12240 20 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f   not have been o
12250 70 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68  pened yet, in wh
12260 69 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53  ich case the OsS
12270 65 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20  ectorSize().    
12280 2a 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67  ** call will seg
12290 66 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  fault..    */.  
122a0 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
122b0 53 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73  Size = sqlite3Os
122c0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
122d0 72 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66  r->fd);.  }.  if
122e0 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72  ( pPager->sector
122f0 53 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20  Size<512 ){.    
12300 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
12310 7a 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20  ze = 512;.  }.  
12320 69 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74  if( pPager->sect
12330 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f  orSize>MAX_SECTO
12340 52 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73  R_SIZE ){.    as
12350 73 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52  sert( MAX_SECTOR
12360 5f 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20  _SIZE>=512 );.  
12370 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
12380 53 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f  Size = MAX_SECTO
12390 52 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f  R_SIZE;.  }.}../
123a0 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
123b0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
123c0 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
123d0 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
123e0 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
123f0 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
12400 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
12410 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
12420 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12430 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
12440 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
12450 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
12460 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
12470 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
12480 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
12490 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
124a0 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
124b0 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
124c0 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
124d0 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
124e0 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
124f0 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
12500 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
12510 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
12520 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
12530 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
12540 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
12550 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
12560 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
12570 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
12580 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
12590 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
125a0 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
125b0 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
125c0 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
125d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
125e0 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
125f0 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
12600 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
12610 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
12620 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
12630 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
12640 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
12650 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
12660 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
12670 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
12680 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
12690 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
126a0 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
126b0 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73   is the page cas
126c0 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79  e..**  (7)  4 by
126d0 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
126e0 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
126f0 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
12700 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
12710 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
12720 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
12730 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
12740 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
12750 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
12760 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29  ournal.).**  (8)
12770 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
12780 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
12790 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
127a0 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
127b0 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
127c0 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
127d0 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
127e0 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
127f0 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
12800 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
12810 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
12820 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
12830 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
12840 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
12850 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
12860 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
12870 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39  in UTF-8..**  (9
12880 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
12890 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
128a0 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
128b0 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
128c0 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
128d0 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
128e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
128f0 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
12900 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
12910 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
12920 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
12930 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
12940 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
12950 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d  the first 8 item
12960 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
12970 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
12980 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
12990 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20  ance of the 9th 
129a0 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
129b0 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
129c0 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
129d0 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
129e0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
129f0 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
12a00 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
12a10 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
12a20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
12a30 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
12a40 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
12a50 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
12a60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
12a70 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
12a80 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
12a90 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
12aa0 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
12ab0 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
12ac0 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
12ad0 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
12ae0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12af0 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
12b00 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
12b10 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
12b20 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
12b30 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
12b40 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
12b50 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
12b60 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
12b70 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
12b80 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
12b90 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
12ba0 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
12bb0 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
12bc0 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
12bd0 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
12be0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
12bf0 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
12c00 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
12c10 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
12c20 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
12c30 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
12c40 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
12c50 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
12c60 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
12c70 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
12c80 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
12c90 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
12ca0 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
12cb0 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
12cc0 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
12cd0 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
12ce0 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
12cf0 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
12d00 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
12d10 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
12d20 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
12d30 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
12d40 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
12d50 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
12d60 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
12d70 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
12d80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
12d90 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
12da0 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
12db0 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
12dc0 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
12dd0 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
12de0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
12df0 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
12e00 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
12e10 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
12e20 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
12e30 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
12e40 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
12e50 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
12e60 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
12e70 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
12e80 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
12e90 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
12ea0 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
12eb0 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
12ec0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
12ed0 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
12ee0 20 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d   The isHot param
12ef0 65 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74  eter indicates t
12f00 68 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e  hat we are tryin
12f10 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20  g to rollback a 
12f20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20  journal.** that 
12f30 6d 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a  might be a hot j
12f40 6f 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20  ournal.  Or, it 
12f50 63 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68  could be that th
12f60 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a  e journal is .**
12f70 20 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75   preserved becau
12f80 73 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44  se of JOURNALMOD
12f90 45 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55  E_PERSIST or JOU
12fa0 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54  RNALMODE_TRUNCAT
12fb0 45 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  E..** If the jou
12fc0 72 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68  rnal really is h
12fd0 6f 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61  ot, reset the pa
12fe0 67 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20  ger cache prior 
12ff0 72 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20  rolling.** back 
13000 61 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66  any content.  If
13010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
13020 6d 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e  merely persisten
13030 74 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a  t, no reset is.*
13040 2a 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61  * needed..*/.sta
13050 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
13060 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
13070 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
13080 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
13090 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
130a0 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
130b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
130c0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
130d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
130e0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
130f0 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
13100 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
13110 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
13120 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
13130 20 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   u;             
13140 20 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65        /* Unsigne
13150 64 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  d loop counter *
13160 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20  /.  Pgno mxPg = 
13170 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  0;           /* 
13180 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67  Size of the orig
13190 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67  inal file in pag
131a0 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  es */.  int rc; 
131b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
131c0 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20   /* Result code 
131d0 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20  of a subroutine 
131e0 2a 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31  */.  int res = 1
131f0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13200 20 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20   Value returned 
13210 62 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  by sqlite3OsAcce
13220 73 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a  ss() */.  char *
13230 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20  zMaster = 0;    
13240 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61     /* Name of ma
13250 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13260 65 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e  e if any */.  in
13270 74 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74  t needPagerReset
13280 3b 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74  ;      /* True t
13290 6f 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69  o reset page pri
132a0 6f 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65  or to first page
132b0 20 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20   rollback */..  
132c0 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f  /* Figure out ho
132d0 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61  w many records a
132e0 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  re in the journa
132f0 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20  l.  Abort early 
13300 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  if.  ** the jour
13310 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20  nal is empty..  
13320 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  */.  assert( isO
13330 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
13340 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   );.  rc = sqlit
13350 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
13360 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b  ger->jfd, &szJ);
13370 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13380 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29  E_OK || szJ==0 )
13390 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  {.    goto end_p
133a0 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
133b0 2f 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74  /* Read the mast
133c0 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
133d0 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
133e0 2c 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65  , if it is prese
133f0 6e 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61  nt..  ** If a ma
13400 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
13410 65 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66  e name is specif
13420 69 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c  ied, but the fil
13430 65 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72  e is not.  ** pr
13440 65 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74  esent on disk, t
13450 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
13460 69 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64  is not hot and d
13470 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20  oes not need to 
13480 62 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62  be.  ** played b
13490 61 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54  ack..  **.  ** T
134a0 4f 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79  ODO: Technically
134b0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   the following i
134c0 73 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75  s an error becau
134d0 73 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68  se it assumes th
134e0 61 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50  at.  ** buffer P
134f0 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69  ager.pTmpSpace i
13500 73 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s (mxPathname+1)
13510 20 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72   bytes or larger
13520 2e 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a  . i.e. that.  **
13530 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69   (pPager->pageSi
13540 7a 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56  ze >= pPager->pV
13550 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
13560 29 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78  ). Using os_unix
13570 2e 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68  .c,.  **  mxPath
13580 6e 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69  name is 512, whi
13590 63 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61  ch is the same a
135a0 73 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c  s the minimum al
135b0 6c 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20  lowable value.  
135c0 2a 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e  ** for pageSize.
135d0 0a 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20  .  */.  zMaster 
135e0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
135f0 61 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64  ace;.  rc = read
13600 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
13610 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
13620 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
13630 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
13640 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
13650 45 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
13660 30 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  0] ){.    rc = s
13670 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70  qlite3OsAccess(p
13680 56 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51  Vfs, zMaster, SQ
13690 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
136a0 54 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20  TS, &res);.  }. 
136b0 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   zMaster = 0;.  
136c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
136d0 4b 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20  K || !res ){.   
136e0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
136f0 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  ck;.  }.  pPager
13700 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30  ->journalOff = 0
13710 3b 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73  ;.  needPagerRes
13720 65 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f  et = isHot;..  /
13730 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d  * This loop term
13740 69 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68  inates either wh
13750 65 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c  en a readJournal
13760 48 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70  Hdr() or .  ** p
13770 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
13780 65 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65  e_page() call re
13790 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e  turns SQLITE_DON
137a0 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
137b0 20 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a   .  ** occurs. .
137c0 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20    */.  while( 1 
137d0 29 7b 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73  ){.    int isUns
137e0 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
137f0 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
13800 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
13810 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
13820 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
13830 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
13840 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
13850 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
13860 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
13870 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
13880 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
13890 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
138a0 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
138b0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
138c0 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
138d0 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
138e0 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
138f0 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
13900 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
13910 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
13920 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
13930 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
13940 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
13950 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
13960 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
13970 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
13980 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
13990 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
139a0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
139b0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
139c0 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
139d0 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
139e0 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
139f0 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
13a00 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
13a10 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
13a20 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
13a30 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
13a40 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
13a50 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
13a60 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
13a70 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
13a80 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
13a90 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
13aa0 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
13ab0 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
13ac0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
13ad0 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
13ae0 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
13af0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13b00 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
13b10 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
13b20 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69  .      nRec = (i
13b30 6e 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e  nt)((szJ - JOURN
13b40 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
13b50 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ))/JOURNAL_PG_SZ
13b60 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d  (pPager));.    }
13b70 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
13b80 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72   is 0 and this r
13b90 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20  ollback is of a 
13ba0 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61  transaction crea
13bb0 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20  ted by this.    
13bc0 2a 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69  ** process and i
13bd0 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
13be0 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68  nal header in th
13bf0 65 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20  e journal, then 
13c00 69 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  it means.    ** 
13c10 74 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f  that this part o
13c20 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  f the journal wa
13c30 73 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62  s being filled b
13c40 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62  ut has not yet b
13c50 65 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65  een.    ** synce
13c60 64 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70  d to disk.  Comp
13c70 75 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ute the number o
13c80 66 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e  f pages based on
13c90 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20   the remaining. 
13ca0 20 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68     ** size of th
13cb0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20  e file..    **. 
13cc0 20 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20     ** The third 
13cd0 74 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74  term of the test
13ce0 20 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69   was added to fi
13cf0 78 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a  x ticket #2565..
13d00 20 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c      ** When roll
13d10 69 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a  ing back a hot j
13d20 6f 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20  ournal, nRec==0 
13d30 61 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61  always means tha
13d40 74 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a  t the next.    *
13d50 2a 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a  * chunk of the j
13d60 6f 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20  ournal contains 
13d70 7a 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65  zero pages to be
13d80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42   rolled back.  B
13d90 75 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64  ut.    ** when d
13da0 6f 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20  oing a ROLLBACK 
13db0 61 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20  and the nRec==0 
13dc0 63 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73  chunk is the las
13dd0 74 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a  t chunk in.    *
13de0 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69  * the journal, i
13df0 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  t means that the
13e00 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63   journal might c
13e10 6f 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61  ontain additiona
13e20 6c 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74  l.    ** pages t
13e30 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72  hat need to be r
13e40 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74  olled back and t
13e50 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hat the number o
13e60 66 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20  f pages .    ** 
13e70 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74  should be comput
13e80 65 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20  ed based on the 
13e90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a  journal file siz
13ea0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65  e..    */.    te
13eb0 73 74 63 61 73 65 28 20 6e 52 65 63 3d 3d 30 20  stcase( nRec==0 
13ec0 26 26 20 21 69 73 48 6f 74 0a 20 20 20 20 20 20  && !isHot.      
13ed0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
13ee0 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
13ef0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21  _HDR_SZ(pPager)!
13f00 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
13f10 4f 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20  Off.         && 
13f20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
13f30 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f  journalOff) / JO
13f40 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
13f50 65 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20  er))>0.         
13f60 26 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72  && pagerNextJour
13f70 6e 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70  nalPageIsValid(p
13f80 50 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20  Pager).    );.  
13f90 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26    if( nRec==0 &&
13fa0 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20   !isHot &&.     
13fb0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
13fc0 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alHdr+JOURNAL_HD
13fd0 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50  R_SZ(pPager)==pP
13fe0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
13ff0 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d   ){.      nRec =
14000 20 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50   (int)((szJ - pP
14010 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14020 29 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ) / JOURNAL_PG_S
14030 5a 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20  Z(pPager));.    
14040 20 20 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a    isUnsync = 1;.
14050 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
14060 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
14070 73 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66  st header read f
14080 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
14090 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20   truncate the.  
140a0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69    ** database fi
140b0 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f  le back to its o
140c0 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20  riginal size..  
140d0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
140e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
140f0 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
14100 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20  pPager) ){.     
14110 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
14120 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50  cate(pPager, mxP
14130 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  g);.      if( rc
14140 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
14150 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
14160 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
14170 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
14180 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20  dbSize = mxPg;. 
14190 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70     }..    /* Cop
141a0 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73  y original pages
141b0 20 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72   out of the jour
141c0 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74  nal and back int
141d0 6f 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61  o the .    ** da
141e0 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f  tabase file and/
141f0 6f 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20  or page cache.. 
14200 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d     */.    for(u=
14210 30 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b  0; u<nRec; u++){
14220 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50  .      if( needP
14230 61 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20  agerReset ){.   
14240 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
14250 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
14260 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74    needPagerReset
14270 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
14280 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
14290 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
142a0 28 70 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79  (pPager,1,isUnsy
142b0 6e 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72  nc,&pPager->jour
142c0 6e 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20  nalOff,0,0);.   
142d0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
142e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
142f0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
14300 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
14310 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14320 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
14330 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
14340 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
14350 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
14360 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
14370 2a 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62  * If we are unab
14380 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20  le to rollback, 
14390 71 75 69 74 20 61 6e 64 20 72 65 74 75 72 6e 20  quit and return 
143a0 74 68 65 20 65 72 72 6f 72 0a 20 20 20 20 20 20  the error.      
143b0 20 20 20 20 2a 2a 20 63 6f 64 65 2e 20 20 54 68      ** code.  Th
143c0 69 73 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68  is will cause th
143d0 65 20 70 61 67 65 72 20 74 6f 20 65 6e 74 65 72  e pager to enter
143e0 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
143f0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 6f  .          ** so
14400 20 74 68 61 74 20 6e 6f 20 66 75 72 74 68 65 72   that no further
14410 20 68 61 72 6d 20 77 69 6c 6c 20 62 65 20 64 6f   harm will be do
14420 6e 65 2e 20 20 50 65 72 68 61 70 73 20 74 68 65  ne.  Perhaps the
14430 20 6e 65 78 74 0a 20 20 20 20 20 20 20 20 20 20   next.          
14440 2a 2a 20 70 72 6f 63 65 73 73 20 74 6f 20 63 6f  ** process to co
14450 6d 65 20 61 6c 6f 6e 67 20 77 69 6c 6c 20 62 65  me along will be
14460 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62 61 63   able to rollbac
14470 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  k the database..
14480 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
14490 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f         goto end_
144a0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20  playback;.      
144b0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
144c0 7d 0a 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41  }.  }.  /*NOTREA
144d0 43 48 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28  CHED*/.  assert(
144e0 20 30 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62   0 );..end_playb
144f0 61 63 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77  ack:.  /* Follow
14500 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20  ing a rollback, 
14510 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
14520 65 20 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b  e should be back
14530 20 69 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c   in its original
14540 0a 20 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f  .  ** state prio
14550 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  r to the start o
14560 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
14570 6e 2c 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65  n, so invoke the
14580 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e  .  ** SQLITE_FCN
14590 54 4c 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20  TL_DB_UNCHANGED 
145a0 66 69 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74  file-control met
145b0 68 6f 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74  hod to disable t
145c0 68 65 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f  he.  ** assertio
145d0 6e 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  n that the trans
145e0 61 63 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77  action counter w
145f0 61 73 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a  as modified..  *
14600 2f 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20  /.  assert(.    
14610 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
14620 68 6f 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73  hods==0 ||.    s
14630 71 6c 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74  qlite3OsFileCont
14640 72 6f 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53  rol(pPager->fd,S
14650 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55  QLITE_FCNTL_DB_U
14660 4e 43 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c  NCHANGED,0)>=SQL
14670 49 54 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f  ITE_OK.  );..  /
14680 2a 20 49 66 20 74 68 69 73 20 70 6c 61 79 62 61  * If this playba
14690 63 6b 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20  ck is happening 
146a0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73  automatically as
146b0 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20   a result of an 
146c0 49 4f 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c  IO or .  ** mall
146d0 6f 63 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63  oc error that oc
146e0 63 75 72 72 65 64 20 61 66 74 65 72 20 74 68 65  curred after the
146f0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
14700 77 61 73 20 75 70 64 61 74 65 64 20 62 75 74 20  was updated but 
14710 0a 20 20 2a 2a 20 62 65 66 6f 72 65 20 74 68 65  .  ** before the
14720 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
14730 20 63 6f 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e   committed, then
14740 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
14750 74 65 72 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69  ter .  ** modifi
14760 63 61 74 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20  cation may just 
14770 68 61 76 65 20 62 65 65 6e 20 72 65 76 65 72 74  have been revert
14780 65 64 2e 20 49 66 20 74 68 69 73 20 68 61 70 70  ed. If this happ
14790 65 6e 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65  ens in exclusive
147a0 20 0a 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65   .  ** mode, the
147b0 6e 20 73 75 62 73 65 71 75 65 6e 74 20 74 72 61  n subsequent tra
147c0 6e 73 61 63 74 69 6f 6e 73 20 70 65 72 66 6f 72  nsactions perfor
147d0 6d 65 64 20 62 79 20 74 68 65 20 63 6f 6e 6e 65  med by the conne
147e0 63 74 69 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20  ction will not. 
147f0 20 2a 2a 20 75 70 64 61 74 65 20 74 68 65 20 63   ** update the c
14800 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 61 74  hange-counter at
14810 20 61 6c 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c   all. This may l
14820 65 61 64 20 74 6f 20 63 61 63 68 65 20 69 6e 63  ead to cache inc
14830 6f 6e 73 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20  onsistency.  ** 
14840 70 72 6f 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68  problems for oth
14850 65 72 20 70 72 6f 63 65 73 73 65 73 20 61 74 20  er processes at 
14860 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
14870 65 20 66 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75  e future. So, ju
14880 73 74 0a 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  st.  ** in case 
14890 74 68 69 73 20 68 61 73 20 68 61 70 70 65 6e 65  this has happene
148a0 64 2c 20 63 6c 65 61 72 20 74 68 65 20 63 68 61  d, clear the cha
148b0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61  ngeCountDone fla
148c0 67 20 6e 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50  g now..  */.  pP
148d0 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e  ager->changeCoun
148e0 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e  tDone = pPager->
148f0 74 65 6d 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28  tempFile;..  if(
14900 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14910 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d 20  {.    zMaster = 
14920 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
14930 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  e;.    rc = read
14940 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50  MasterJournal(pP
14950 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74  ager->jfd, zMast
14960 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73  er, pPager->pVfs
14970 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b  ->mxPathname+1);
14980 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
14990 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
149a0 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
149b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
149c0 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
149d0 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
149e0 2c 20 7a 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c  , zMaster[0]!='\
149f0 30 27 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73  0');.    testcas
14a00 65 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc!=SQLITE_OK
14a10 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63   );.  }.  if( rc
14a20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a  ==SQLITE_OK && z
14a30 4d 61 73 74 65 72 5b 30 5d 20 26 26 20 72 65 73  Master[0] && res
14a40 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
14a50 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65 72  ere was a master
14a60 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 69   journal and thi
14a70 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
14a80 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a 20  eturn success,. 
14a90 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20     ** see if it 
14aa0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64  is possible to d
14ab0 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65 72  elete the master
14ac0 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f   journal..    */
14ad0 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
14ae0 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65 72  delmaster(pPager
14af0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
14b00 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53 51  testcase( rc!=SQ
14b10 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a  LITE_OK );.  }..
14b20 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73    /* The Pager.s
14b30 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62  ectorSize variab
14b40 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  le may have been
14b50 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20 72   updated while r
14b60 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b  olling.  ** back
14b70 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74   a journal creat
14b80 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
14b90 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e 74  with a different
14ba0 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a   sector size.  *
14bb0 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69  * value. Reset i
14bc0 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74  t to the correct
14bd0 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20   value for this 
14be0 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20  process..  */.  
14bf0 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50  setSectorSize(pP
14c00 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
14c10 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61  rc;.}../*.** Pla
14c20 79 62 61 63 6b 20 73 61 76 65 70 6f 69 6e 74 20  yback savepoint 
14c30 70 53 61 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20  pSavepoint. Or, 
14c40 69 66 20 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e  if pSavepoint==N
14c50 55 4c 4c 2c 20 74 68 65 6e 20 70 6c 61 79 62 61  ULL, then playba
14c60 63 6b 0a 2a 2a 20 74 68 65 20 65 6e 74 69 72 65  ck.** the entire
14c70 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
14c80 66 69 6c 65 2e 20 54 68 65 20 63 61 73 65 20 70  file. The case p
14c90 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20  Savepoint==NULL 
14ca0 6f 63 63 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20  occurs when .** 
14cb0 61 20 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f  a ROLLBACK TO co
14cc0 6d 6d 61 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64  mmand is invoked
14cd0 20 6f 6e 20 61 20 53 41 56 45 50 4f 49 4e 54 20   on a SAVEPOINT 
14ce0 74 68 61 74 20 69 73 20 61 20 74 72 61 6e 73 61  that is a transa
14cf0 63 74 69 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f  ction .** savepo
14d00 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  int..**.** When 
14d10 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f  pSavepoint is no
14d20 74 20 4e 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20  t NULL (meaning 
14d30 61 20 6e 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f  a non-transactio
14d40 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 0a  n savepoint is .
14d50 2a 2a 20 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20  ** being rolled 
14d60 62 61 63 6b 29 2c 20 74 68 65 6e 20 74 68 65 20  back), then the 
14d70 72 6f 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74  rollback consist
14d80 73 20 6f 66 20 75 70 20 74 6f 20 74 68 72 65 65  s of up to three
14d90 20 73 74 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66   stages,.** perf
14da0 6f 72 6d 65 64 20 69 6e 20 74 68 65 20 6f 72 64  ormed in the ord
14db0 65 72 20 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a  er specified:.**
14dc0 0a 2a 2a 20 20 20 2a 20 50 61 67 65 73 20 61 72  .**   * Pages ar
14dd0 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72  e played back fr
14de0 6f 6d 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  om the main jour
14df0 6e 61 6c 20 73 74 61 72 74 69 6e 67 20 61 74 20  nal starting at 
14e00 62 79 74 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73  byte.**     offs
14e10 65 74 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  et PagerSavepoin
14e20 74 2e 69 4f 66 66 73 65 74 20 61 6e 64 20 63 6f  t.iOffset and co
14e30 6e 74 69 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20  ntinuing to .** 
14e40 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
14e50 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 2c 20 6f  nt.iHdrOffset, o
14e60 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  r to the end of 
14e70 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14e80 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 69 66 20  .**     file if 
14e90 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14ea0 48 64 72 4f 66 66 73 65 74 20 69 73 20 7a 65 72  HdrOffset is zer
14eb0 6f 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20  o..**.**   * If 
14ec0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14ed0 48 64 72 4f 66 66 73 65 74 20 69 73 20 6e 6f 74  HdrOffset is not
14ee0 20 7a 65 72 6f 2c 20 74 68 65 6e 20 70 61 67 65   zero, then page
14ef0 73 20 61 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20  s are played.** 
14f00 20 20 20 20 62 61 63 6b 20 73 74 61 72 74 69 6e      back startin
14f10 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  g from the journ
14f20 61 6c 20 68 65 61 64 65 72 20 69 6d 6d 65 64 69  al header immedi
14f30 61 74 65 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20  ately following 
14f40 0a 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76  .**     PagerSav
14f50 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66 66 73 65  epoint.iHdrOffse
14f60 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
14f70 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14f80 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a   file..**.**   *
14f90 20 50 61 67 65 73 20 61 72 65 20 74 68 65 6e 20   Pages are then 
14fa0 70 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d  played back from
14fb0 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
14fc0 20 66 69 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a   file, starting.
14fd0 2a 2a 20 20 20 20 20 77 69 74 68 20 74 68 65 20  **     with the 
14fe0 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14ff0 53 75 62 52 65 63 20 61 6e 64 20 63 6f 6e 74 69  SubRec and conti
15000 6e 75 69 6e 67 20 74 6f 20 74 68 65 20 65 6e 64  nuing to the end
15010 20 6f 66 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a   of.**     the j
15020 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a  ournal file..**.
15030 2a 2a 20 54 68 72 6f 75 67 68 6f 75 74 20 74 68  ** Throughout th
15040 65 20 72 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65  e rollback proce
15050 73 73 2c 20 65 61 63 68 20 74 69 6d 65 20 61 20  ss, each time a 
15060 70 61 67 65 20 69 73 20 72 6f 6c 6c 65 64 20 62  page is rolled b
15070 61 63 6b 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72  ack, the.** corr
15080 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73  esponding bit is
15090 20 73 65 74 20 69 6e 20 61 20 62 69 74 76 65 63   set in a bitvec
150a0 20 73 74 72 75 63 74 75 72 65 20 28 76 61 72 69   structure (vari
150b0 61 62 6c 65 20 70 44 6f 6e 65 20 69 6e 20 74 68  able pDone in th
150c0 65 0a 2a 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74  e.** implementat
150d0 69 6f 6e 20 62 65 6c 6f 77 29 2e 20 54 68 69 73  ion below). This
150e0 20 69 73 20 75 73 65 64 20 74 6f 20 65 6e 73 75   is used to ensu
150f0 72 65 20 74 68 61 74 20 61 20 70 61 67 65 20 69  re that a page i
15100 73 20 6f 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64  s only.** rolled
15110 20 62 61 63 6b 20 74 68 65 20 66 69 72 73 74 20   back the first 
15120 74 69 6d 65 20 69 74 20 69 73 20 65 6e 63 6f 75  time it is encou
15130 6e 74 65 72 65 64 20 69 6e 20 65 69 74 68 65 72  ntered in either
15140 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
15150 49 66 20 70 53 61 76 65 70 6f 69 6e 74 20 69 73  If pSavepoint is
15160 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65   NULL, then page
15170 73 20 61 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65  s are only playe
15180 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  d back from the 
15190 6d 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  main.** journal 
151a0 66 69 6c 65 2e 20 54 68 65 72 65 20 69 73 20 6e  file. There is n
151b0 6f 20 6e 65 65 64 20 66 6f 72 20 61 20 62 69 74  o need for a bit
151c0 76 65 63 20 69 6e 20 74 68 69 73 20 63 61 73 65  vec in this case
151d0 2e 0a 2a 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65  ..**.** In eithe
151e0 72 20 63 61 73 65 2c 20 62 65 66 6f 72 65 20 70  r case, before p
151f0 6c 61 79 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65  layback commence
15200 73 20 74 68 65 20 50 61 67 65 72 2e 64 62 53 69  s the Pager.dbSi
15210 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ze variable.** i
15220 73 20 72 65 73 65 74 20 74 6f 20 74 68 65 20 76  s reset to the v
15230 61 6c 75 65 20 74 68 61 74 20 69 74 20 68 65 6c  alue that it hel
15240 64 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  d at the start o
15250 66 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20  f the savepoint 
15260 0a 2a 2a 20 28 6f 72 20 74 72 61 6e 73 61 63 74  .** (or transact
15270 69 6f 6e 29 2e 20 4e 6f 20 70 61 67 65 20 77 69  ion). No page wi
15280 74 68 20 61 20 70 61 67 65 2d 6e 75 6d 62 65 72  th a page-number
15290 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
152a0 69 73 20 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70  is value.** is p
152b0 6c 61 79 65 64 20 62 61 63 6b 2e 20 49 66 20 6f  layed back. If o
152c0 6e 65 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  ne is encountere
152d0 64 20 69 74 20 69 73 20 73 69 6d 70 6c 79 20 73  d it is simply s
152e0 6b 69 70 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  kipped..*/.stati
152f0 63 20 69 6e 74 20 70 61 67 65 72 50 6c 61 79 62  c int pagerPlayb
15300 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 50 61 67  ackSavepoint(Pag
15310 65 72 20 2a 70 50 61 67 65 72 2c 20 50 61 67 65  er *pPager, Page
15320 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53 61 76  rSavepoint *pSav
15330 65 70 6f 69 6e 74 29 7b 0a 20 20 69 36 34 20 73  epoint){.  i64 s
15340 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  zJ;             
15350 20 20 20 20 2f 2a 20 45 66 66 65 63 74 69 76 65      /* Effective
15360 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6d 61 69   size of the mai
15370 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69  n journal */.  i
15380 36 34 20 69 48 64 72 4f 66 66 3b 20 20 20 20 20  64 iHdrOff;     
15390 20 20 20 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f          /* End o
153a0 66 20 66 69 72 73 74 20 73 65 67 6d 65 6e 74 20  f first segment 
153b0 6f 66 20 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20  of main-journal 
153c0 72 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  records */.  int
153d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
153e0 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
153f0 63 6f 64 65 20 2a 2f 0a 20 20 42 69 74 76 65 63  code */.  Bitvec
15400 20 2a 70 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20   *pDone = 0;    
15410 20 20 20 2f 2a 20 42 69 74 76 65 63 20 74 6f 20     /* Bitvec to 
15420 65 6e 73 75 72 65 20 70 61 67 65 73 20 70 6c 61  ensure pages pla
15430 79 65 64 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e  yed back only on
15440 63 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  ce */..  assert(
15450 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
15460 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
15470 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61  .  /* Allocate a
15480 20 62 69 74 76 65 63 20 74 6f 20 75 73 65 20 74   bitvec to use t
15490 6f 20 73 74 6f 72 65 20 74 68 65 20 73 65 74 20  o store the set 
154a0 6f 66 20 70 61 67 65 73 20 72 6f 6c 6c 65 64 20  of pages rolled 
154b0 62 61 63 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53  back */.  if( pS
154c0 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20  avepoint ){.    
154d0 70 44 6f 6e 65 20 3d 20 73 71 6c 69 74 65 33 42  pDone = sqlite3B
154e0 69 74 76 65 63 43 72 65 61 74 65 28 70 53 61 76  itvecCreate(pSav
154f0 65 70 6f 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a  epoint->nOrig);.
15500 20 20 20 20 69 66 28 20 21 70 44 6f 6e 65 20 29      if( !pDone )
15510 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15520 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
15530 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74   }.  }..  /* Set
15540 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
15550 7a 65 20 62 61 63 6b 20 74 6f 20 74 68 65 20 76  ze back to the v
15560 61 6c 75 65 20 69 74 20 77 61 73 20 62 65 66 6f  alue it was befo
15570 72 65 20 74 68 65 20 73 61 76 65 70 6f 69 6e 74  re the savepoint
15580 20 0a 20 20 2a 2a 20 62 65 69 6e 67 20 72 65 76   .  ** being rev
15590 65 72 74 65 64 20 77 61 73 20 6f 70 65 6e 65 64  erted was opened
155a0 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
155b0 3e 64 62 53 69 7a 65 20 3d 20 70 53 61 76 65 70  >dbSize = pSavep
155c0 6f 69 6e 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  oint ? pSavepoin
155d0 74 2d 3e 6e 4f 72 69 67 20 3a 20 70 50 61 67 65  t->nOrig : pPage
155e0 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a  r->dbOrigSize;..
155f0 20 20 2f 2a 20 55 73 65 20 70 50 61 67 65 72 2d    /* Use pPager-
15600 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 61 73 20 74  >journalOff as t
15610 68 65 20 65 66 66 65 63 74 69 76 65 20 73 69 7a  he effective siz
15620 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 72 6f  e of the main ro
15630 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72  llback.  ** jour
15640 6e 61 6c 2e 20 20 54 68 65 20 61 63 74 75 61 6c  nal.  The actual
15650 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c   file might be l
15660 61 72 67 65 72 20 74 68 61 6e 20 74 68 69 73 20  arger than this 
15670 69 6e 0a 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f  in.  ** PAGER_JO
15680 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41  URNALMODE_TRUNCA
15690 54 45 20 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52  TE or PAGER_JOUR
156a0 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e  NALMODE_PERSIST.
156b0 20 20 42 75 74 20 61 6e 79 74 68 69 6e 67 0a 20    But anything. 
156c0 20 2a 2a 20 70 61 73 74 20 70 50 61 67 65 72 2d   ** past pPager-
156d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f  >journalOff is o
156e0 66 66 2d 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e  ff-limits to us.
156f0 0a 20 20 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50  .  */.  szJ = pP
15700 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
15710 3b 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 62 79  ;..  /* Begin by
15720 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65   rolling back re
15730 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6d  cords from the m
15740 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72  ain journal star
15750 74 69 6e 67 20 61 74 0a 20 20 2a 2a 20 50 61 67  ting at.  ** Pag
15760 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66  erSavepoint.iOff
15770 73 65 74 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  set and continui
15780 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6a  ng to the next j
15790 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20  ournal header.. 
157a0 20 2a 2a 20 54 68 65 72 65 20 6d 69 67 68 74 20   ** There might 
157b0 62 65 20 72 65 63 6f 72 64 73 20 69 6e 20 74 68  be records in th
157c0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74  e main journal t
157d0 68 61 74 20 68 61 76 65 20 61 20 70 61 67 65 20  hat have a page 
157e0 6e 75 6d 62 65 72 0a 20 20 2a 2a 20 67 72 65 61  number.  ** grea
157f0 74 65 72 20 74 68 61 6e 20 74 68 65 20 63 75 72  ter than the cur
15800 72 65 6e 74 20 64 61 74 61 62 61 73 65 20 73 69  rent database si
15810 7a 65 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ze (pPager->dbSi
15820 7a 65 29 20 62 75 74 20 74 68 6f 73 65 0a 20 20  ze) but those.  
15830 2a 2a 20 77 69 6c 6c 20 62 65 20 73 6b 69 70 70  ** will be skipp
15840 65 64 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  ed automatically
15850 2e 20 20 50 61 67 65 73 20 61 72 65 20 61 64 64  .  Pages are add
15860 65 64 20 74 6f 20 70 44 6f 6e 65 20 61 73 20 74  ed to pDone as t
15870 68 65 79 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61  hey.  ** are pla
15880 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  yed back..  */. 
15890 20 69 66 28 20 70 53 61 76 65 70 6f 69 6e 74 20   if( pSavepoint 
158a0 29 7b 0a 20 20 20 20 69 48 64 72 4f 66 66 20 3d  ){.    iHdrOff =
158b0 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64   pSavepoint->iHd
158c0 72 4f 66 66 73 65 74 20 3f 20 70 53 61 76 65 70  rOffset ? pSavep
158d0 6f 69 6e 74 2d 3e 69 48 64 72 4f 66 66 73 65 74  oint->iHdrOffset
158e0 20 3a 20 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67   : szJ;.    pPag
158f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
15900 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66   pSavepoint->iOf
15910 66 73 65 74 3b 0a 20 20 20 20 77 68 69 6c 65 28  fset;.    while(
15920 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
15930 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
15940 6c 4f 66 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a  lOff<iHdrOff ){.
15950 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15960 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
15970 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 30 2c  ge(pPager, 1, 0,
15980 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61   &pPager->journa
15990 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b  lOff, 1, pDone);
159a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
159b0 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
159c0 4e 45 20 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NE );.  }else{. 
159d0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
159e0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a  alOff = 0;.  }..
159f0 20 20 2f 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f    /* Continue ro
15a00 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
15a10 64 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61  ds out of the ma
15a20 69 6e 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74  in journal start
15a30 69 6e 67 20 61 74 0a 20 20 2a 2a 20 74 68 65 20  ing at.  ** the 
15a40 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
15a50 61 64 65 72 20 73 65 65 6e 20 61 6e 64 20 63 6f  ader seen and co
15a60 6e 74 69 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74  ntinuing until t
15a70 68 65 20 65 66 66 65 63 74 69 76 65 20 65 6e 64  he effective end
15a80 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69  .  ** of the mai
15a90 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  n journal file. 
15aa0 20 43 6f 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69   Continue to ski
15ab0 70 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70  p out-of-range p
15ac0 61 67 65 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f  ages and.  ** co
15ad0 6e 74 69 6e 75 65 20 61 64 64 69 6e 67 20 70 61  ntinue adding pa
15ae0 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  ges rolled back 
15af0 74 6f 20 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20  to pDone..  */. 
15b00 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49   while( rc==SQLI
15b10 54 45 5f 4f 4b 20 26 26 20 70 50 61 67 65 72 2d  TE_OK && pPager-
15b20 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20  >journalOff<szJ 
15b30 29 7b 0a 20 20 20 20 75 33 32 20 69 69 3b 20 20  ){.    u32 ii;  
15b40 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
15b50 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
15b60 20 75 33 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20   u32 nJRec = 0; 
15b70 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15b80 20 4a 6f 75 72 6e 61 6c 20 52 65 63 6f 72 64 73   Journal Records
15b90 20 2a 2f 0a 20 20 20 20 75 33 32 20 64 75 6d 6d   */.    u32 dumm
15ba0 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
15bb0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
15bc0 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20  r, szJ, &nJRec, 
15bd0 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73  &dummy);.    ass
15be0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15bf0 44 4f 4e 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a  DONE );..    /*.
15c00 20 20 20 20 2a 2a 20 54 68 65 20 22 70 50 61 67      ** The "pPag
15c10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a  er->journalHdr+J
15c20 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
15c30 61 67 65 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a  ager)==pPager->j
15c40 6f 75 72 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a  ournalOff".    *
15c50 2a 20 74 65 73 74 20 69 73 20 72 65 6c 61 74 65  * test is relate
15c60 64 20 74 6f 20 74 69 63 6b 65 74 20 23 32 35 36  d to ticket #256
15c70 35 2e 20 20 53 65 65 20 74 68 65 20 64 69 73 63  5.  See the disc
15c80 75 73 73 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20  ussion in the.  
15c90 20 20 2a 2a 20 70 61 67 65 72 5f 70 6c 61 79 62    ** pager_playb
15ca0 61 63 6b 28 29 20 66 75 6e 63 74 69 6f 6e 20 66  ack() function f
15cb0 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
15cc0 66 6f 72 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a  formation..    *
15cd0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 28  /.    assert( !(
15ce0 6e 4a 52 65 63 3d 3d 30 0a 20 20 20 20 20 20 20  nJRec==0.       
15cf0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
15d00 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
15d10 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d  HDR_SZ(pPager)!=
15d20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15d30 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ff.         && (
15d40 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
15d50 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
15d60 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
15d70 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26  r))>0.         &
15d80 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e  & pagerNextJourn
15d90 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70 50  alPageIsValid(pP
15da0 61 67 65 72 29 29 0a 20 20 20 20 29 3b 0a 20 20  ager)).    );.  
15db0 20 20 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a    if( nJRec==0 .
15dc0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
15dd0 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e  journalHdr+JOURN
15de0 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
15df0 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  )==pPager->journ
15e00 61 6c 4f 66 66 0a 20 20 20 20 29 7b 0a 20 20 20  alOff.    ){.   
15e10 20 20 20 6e 4a 52 65 63 20 3d 20 28 75 33 32 29     nJRec = (u32)
15e20 28 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e  ((szJ - pPager->
15e30 6a 6f 75 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52  journalOff)/JOUR
15e40 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
15e50 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  ));.    }.    fo
15e60 72 28 69 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49  r(ii=0; rc==SQLI
15e70 54 45 5f 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65  TE_OK && ii<nJRe
15e80 63 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c && pPager->jou
15e90 72 6e 61 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b  rnalOff<szJ; ii+
15ea0 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  +){.      rc = p
15eb0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
15ec0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 31  e_page(pPager, 1
15ed0 2c 20 30 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f  , 0, &pPager->jo
15ee0 75 72 6e 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f  urnalOff, 1, pDo
15ef0 6e 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  ne);.    }.    a
15f00 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
15f10 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20  E_DONE );.  }.  
15f20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
15f30 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
15f40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a  >journalOff==szJ
15f50 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c   );..  /* Finall
15f60 79 2c 20 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67  y,  rollback pag
15f70 65 73 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d  es from the sub-
15f80 6a 6f 75 72 6e 61 6c 2e 20 20 50 61 67 65 20 74  journal.  Page t
15f90 68 61 74 20 77 65 72 65 0a 20 20 2a 2a 20 70 72  hat were.  ** pr
15fa0 65 76 69 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20  eviously rolled 
15fb0 62 61 63 6b 20 6f 75 74 20 6f 66 20 74 68 65 20  back out of the 
15fc0 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e  main journal (an
15fd0 64 20 61 72 65 20 68 65 6e 63 65 20 69 6e 20 70  d are hence in p
15fe0 44 6f 6e 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20  Done).  ** will 
15ff0 62 65 20 73 6b 69 70 70 65 64 2e 20 20 4f 75 74  be skipped.  Out
16000 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65 73 20  -of-range pages 
16010 61 72 65 20 61 6c 73 6f 20 73 6b 69 70 70 65 64  are also skipped
16020 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 53 61  ..  */.  if( pSa
16030 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75  vepoint ){.    u
16040 33 32 20 69 69 3b 20 20 20 20 20 20 20 20 20 20  32 ii;          
16050 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
16060 72 20 2a 2f 0a 20 20 20 20 69 36 34 20 6f 66 66  r */.    i64 off
16070 73 65 74 20 3d 20 70 53 61 76 65 70 6f 69 6e 74  set = pSavepoint
16080 2d 3e 69 53 75 62 52 65 63 2a 28 34 2b 70 50 61  ->iSubRec*(4+pPa
16090 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
160a0 20 20 20 20 66 6f 72 28 69 69 3d 70 53 61 76 65      for(ii=pSave
160b0 70 6f 69 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20  point->iSubRec; 
160c0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
160d0 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62   ii<pPager->nSub
160e0 52 65 63 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  Rec; ii++){.    
160f0 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
16100 3d 3d 69 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e  ==ii*(4+pPager->
16110 70 61 67 65 53 69 7a 65 29 20 29 3b 0a 20 20 20  pageSize) );.   
16120 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
16130 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
16140 70 50 61 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f  pPager, 0, 0, &o
16150 66 66 73 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29  ffset, 1, pDone)
16160 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
16170 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
16180 4f 4e 45 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71  ONE );.  }..  sq
16190 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
161a0 6f 79 28 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28  oy(pDone);.  if(
161b0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
161c0 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  {.    pPager->jo
161d0 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
161e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
161f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
16200 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d   the maximum num
16210 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79  ber of in-memory
16220 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
16230 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64  allowed..*/.void
16240 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
16250 43 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  Cachesize(Pager 
16260 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
16270 61 67 65 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  age){.  sqlite3P
16280 63 61 63 68 65 53 65 74 43 61 63 68 65 73 69 7a  cacheSetCachesiz
16290 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  e(pPager->pPCach
162a0 65 2c 20 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f  e, mxPage);.}../
162b0 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20  *.** Adjust the 
162c0 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68  robustness of th
162d0 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 61  e database to da
162e0 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63  mage due to OS c
162f0 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77  rashes.** or pow
16300 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20 63  er failures by c
16310 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62  hanging the numb
16320 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77  er of syncs()s w
16330 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74  hen writing.** t
16340 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72  he rollback jour
16350 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20  nal.  There are 
16360 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a  three levels:.**
16370 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20  .**    OFF      
16380 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29   sqlite3OsSync()
16390 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64   is never called
163a0 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20 64  .  This is the d
163b0 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20  efault.**       
163c0 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f         for tempo
163d0 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65  rary and transie
163e0 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  nt files..**.** 
163f0 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65     NORMAL    The
16400 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
16410 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77  ed once before w
16420 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
16430 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
16440 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54 68     database.  Th
16450 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61  is is normally a
16460 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74 69  dequate protecti
16470 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20  on, but.**      
16480 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74 68          it is th
16490 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73  eoretically poss
164a0 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72  ible, though ver
164b0 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20  y unlikely,.**  
164c0 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61 74              that
164d0 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70   an inopertune p
164e0 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75  ower failure cou
164f0 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75  ld leave the jou
16500 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20  rnal.**         
16510 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65 20       in a state 
16520 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73  which would caus
16530 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  e damage to the 
16540 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
16550 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69 74           when it
16560 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
16570 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20  .**.**    FULL  
16580 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20      The journal 
16590 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65 20  is synced twice 
165a0 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
165b0 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
165c0 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
165d0 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61  ase (with some a
165e0 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
165f0 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63  ation - the nRec
16600 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20   field.**       
16610 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f         of the jo
16620 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62  urnal header - b
16630 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20  eing written in 
16640 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a  between the two.
16650 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16660 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61  syncs).  If we a
16670 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74 69  ssume that writi
16680 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20  ng a.**         
16690 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b       single disk
166a0 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69   sector is atomi
166b0 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64  c, then this mod
166c0 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20  e provides.**   
166d0 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75 72             assur
166e0 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f  ance that the jo
166f0 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62  urnal will not b
16700 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74  e corrupted to t
16710 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
16720 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73     point of caus
16730 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68  ing damage to th
16740 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69 6e  e database durin
16750 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a  g rollback..**.*
16760 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73  * Numeric values
16770 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
16780 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61 72   these states ar
16790 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c  e OFF==1, NORMAL
167a0 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d  =2,.** and FULL=
167b0 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  3..*/.#ifndef SQ
167c0 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f  LITE_OMIT_PAGER_
167d0 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c  PRAGMAS.void sql
167e0 69 74 65 33 50 61 67 65 72 53 65 74 53 61 66 65  ite3PagerSetSafe
167f0 74 79 4c 65 76 65 6c 28 50 61 67 65 72 20 2a 70  tyLevel(Pager *p
16800 50 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c  Pager, int level
16810 2c 20 69 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63  , int bFullFsync
16820 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53  ){.  pPager->noS
16830 79 6e 63 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31  ync =  (level==1
16840 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70   || pPager->temp
16850 46 69 6c 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50  File) ?1:0;.  pP
16860 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
16870 20 28 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70   (level==3 && !p
16880 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
16890 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d   ?1:0;.  pPager-
168a0 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62  >sync_flags = (b
168b0 46 75 6c 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45  FullFsync?SQLITE
168c0 5f 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54  _SYNC_FULL:SQLIT
168d0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a  E_SYNC_NORMAL);.
168e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f    if( pPager->no
168f0 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e  Sync ) pPager->n
16900 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23  eedSync = 0;.}.#
16910 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
16920 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61   following globa
16930 6c 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e  l variable is in
16940 63 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76  cremented whenev
16950 65 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a  er the library.*
16960 2a 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70  * attempts to op
16970 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
16980 69 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72  ile.  This infor
16990 6d 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66  mation is used f
169a0 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e  or.** testing an
169b0 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e  d analysis only.
169c0 20 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c    .*/.#ifdef SQL
169d0 49 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c  ITE_TEST.int sql
169e0 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f  ite3_opentemp_co
169f0 75 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  unt = 0;.#endif.
16a00 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65  ./*.** Open a te
16a10 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a  mporary file..**
16a20 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
16a30 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
16a40 74 6f 20 2a 70 46 69 6c 65 2e 20 52 65 74 75 72  to *pFile. Retur
16a50 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
16a60 75 63 63 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f  uccess .** or so
16a70 6d 65 20 6f 74 68 65 72 20 65 72 72 6f 72 20 63  me other error c
16a80 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c 2e 20  ode if we fail. 
16a90 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
16aa0 6d 61 74 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65  matically .** de
16ab0 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
16ac0 72 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20  ry file when it 
16ad0 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a  is closed..**.**
16ae0 20 54 68 65 20 66 6c 61 67 73 20 70 61 73 73 65   The flags passe
16af0 64 20 74 6f 20 74 68 65 20 56 46 53 20 6c 61 79  d to the VFS lay
16b00 65 72 20 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20  er xOpen() call 
16b10 61 72 65 20 74 68 6f 73 65 20 73 70 65 63 69 66  are those specif
16b20 69 65 64 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65  ied.** by parame
16b30 74 65 72 20 76 66 73 46 6c 61 67 73 20 4f 52 65  ter vfsFlags ORe
16b40 64 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  d with the follo
16b50 77 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  wing:.**.**     
16b60 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16b70 57 52 49 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c  WRITE.**     SQL
16b80 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a  ITE_OPEN_CREATE.
16b90 2a 2a 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50  **     SQLITE_OP
16ba0 45 4e 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  EN_EXCLUSIVE.** 
16bb0 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16bc0 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f  DELETEONCLOSE.*/
16bd0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
16be0 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 50 61 67  rOpentemp(.  Pag
16bf0 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
16c00 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20     /* The pager 
16c10 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69  object */.  sqli
16c20 74 65 33 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c  te3_file *pFile,
16c30 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 66    /* Write the f
16c40 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 68  ile descriptor h
16c50 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73  ere */.  int vfs
16c60 46 6c 61 67 73 20 20 20 20 20 20 20 20 20 20 2f  Flags          /
16c70 2a 20 46 6c 61 67 73 20 70 61 73 73 65 64 20 74  * Flags passed t
16c80 68 72 6f 75 67 68 20 74 6f 20 74 68 65 20 56 46  hrough to the VF
16c90 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  S */.){.  int rc
16ca0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
16cb0 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
16cc0 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  /..#ifdef SQLITE
16cd0 5f 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f  _TEST.  sqlite3_
16ce0 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b  opentemp_count++
16cf0 3b 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74  ;  /* Used for t
16d00 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79  esting and analy
16d10 73 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64  sis only */.#end
16d20 69 66 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c  if..  vfsFlags |
16d30 3d 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  =  SQLITE_OPEN_R
16d40 45 41 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54  EADWRITE | SQLIT
16d50 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a  E_OPEN_CREATE |.
16d60 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
16d70 54 45 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56  TE_OPEN_EXCLUSIV
16d80 45 20 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  E | SQLITE_OPEN_
16d90 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20  DELETEONCLOSE;. 
16da0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
16db0 70 65 6e 28 70 50 61 67 65 72 2d 3e 70 56 66 73  pen(pPager->pVfs
16dc0 2c 20 30 2c 20 70 46 69 6c 65 2c 20 76 66 73 46  , 0, pFile, vfsF
16dd0 6c 61 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65  lags, 0);.  asse
16de0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  rt( rc!=SQLITE_O
16df0 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c  K || isOpen(pFil
16e00 65 29 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e) );.  return r
16e10 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  c;.}../*.** Set 
16e20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72  the busy handler
16e30 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a   function..**.**
16e40 20 54 68 65 20 70 61 67 65 72 20 69 6e 76 6f 6b   The pager invok
16e50 65 73 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64  es the busy-hand
16e60 6c 65 72 20 69 66 20 73 71 6c 69 74 65 33 4f 73  ler if sqlite3Os
16e70 4c 6f 63 6b 28 29 20 72 65 74 75 72 6e 73 20 0a  Lock() returns .
16e80 2a 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 77  ** SQLITE_BUSY w
16e90 68 65 6e 20 74 72 79 69 6e 67 20 74 6f 20 75 70  hen trying to up
16ea0 67 72 61 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f  grade from no-lo
16eb0 63 6b 20 74 6f 20 61 20 53 48 41 52 45 44 20 6c  ck to a SHARED l
16ec0 6f 63 6b 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20  ock,.** or when 
16ed0 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61 64  trying to upgrad
16ee0 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
16ef0 44 20 6c 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43  D lock to an EXC
16f00 4c 55 53 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e  LUSIVE .** lock.
16f10 20 49 74 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69   It does *not* i
16f20 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 68  nvoke the busy h
16f30 61 6e 64 6c 65 72 20 77 68 65 6e 20 75 70 67 72  andler when upgr
16f40 61 64 69 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48  ading from.** SH
16f50 41 52 45 44 20 74 6f 20 52 45 53 45 52 56 45 44  ARED to RESERVED
16f60 2c 20 6f 72 20 77 68 65 6e 20 75 70 67 72 61 64  , or when upgrad
16f70 69 6e 67 20 66 72 6f 6d 20 53 48 41 52 45 44 20  ing from SHARED 
16f80 74 6f 20 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  to EXCLUSIVE.** 
16f90 28 77 68 69 63 68 20 6f 63 63 75 72 73 20 64 75  (which occurs du
16fa0 72 69 6e 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ring hot-journal
16fb0 20 72 6f 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d   rollback). Summ
16fc0 61 72 79 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61  ary:.**.**   Tra
16fd0 6e 73 69 74 69 6f 6e 20 20 20 20 20 20 20 20 20  nsition         
16fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
16ff0 20 49 6e 76 6f 6b 65 73 20 78 42 75 73 79 48 61   Invokes xBusyHa
17000 6e 64 6c 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d  ndler.**   -----
17010 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17020 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17030 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
17040 2d 2d 2d 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b  ---.**   NO_LOCK
17050 20 20 20 20 20 20 20 2d 3e 20 53 48 41 52 45 44         -> SHARED
17060 5f 4c 4f 43 4b 20 20 20 20 20 20 7c 20 59 65 73  _LOCK      | Yes
17070 0a 2a 2a 20 20 20 53 48 41 52 45 44 5f 4c 4f 43  .**   SHARED_LOC
17080 4b 20 20 20 2d 3e 20 52 45 53 45 52 56 45 44 5f  K   -> RESERVED_
17090 4c 4f 43 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20  LOCK    | No.** 
170a0 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20    SHARED_LOCK   
170b0 2d 3e 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  -> EXCLUSIVE_LOC
170c0 4b 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45  K   | No.**   RE
170d0 53 45 52 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45  SERVED_LOCK -> E
170e0 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20  XCLUSIVE_LOCK   
170f0 7c 20 59 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74  | Yes.**.** If t
17100 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72 20  he busy-handler 
17110 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
17120 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c   non-zero, the l
17130 6f 63 6b 20 69 73 20 0a 2a 2a 20 72 65 74 72 69  ock is .** retri
17140 65 64 2e 20 49 66 20 69 74 20 72 65 74 75 72 6e  ed. If it return
17150 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
17160 20 53 51 4c 49 54 45 5f 42 55 53 59 20 65 72 72   SQLITE_BUSY err
17170 6f 72 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65  or is.** returne
17180 64 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20  d to the caller 
17190 6f 66 20 74 68 65 20 70 61 67 65 72 20 41 50 49  of the pager API
171a0 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f   function..*/.vo
171b0 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
171c0 65 74 42 75 73 79 68 61 6e 64 6c 65 72 28 0a 20  etBusyhandler(. 
171d0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
171e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
171f0 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
17200 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28  bject */.  int (
17210 2a 78 42 75 73 79 48 61 6e 64 6c 65 72 29 28 76  *xBusyHandler)(v
17220 6f 69 64 20 2a 29 2c 20 20 20 20 20 20 20 20 20  oid *),         
17230 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75  /* Pointer to bu
17240 73 79 2d 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy-handler funct
17250 69 6f 6e 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ion */.  void *p
17260 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 20 20  BusyHandlerArg  
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
17280 20 41 72 67 75 6d 65 6e 74 20 74 6f 20 70 61 73   Argument to pas
17290 73 20 74 6f 20 78 42 75 73 79 48 61 6e 64 6c 65  s to xBusyHandle
172a0 72 20 2a 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67  r */.){  .  pPag
172b0 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c 65 72  er->xBusyHandler
172c0 20 3d 20 78 42 75 73 79 48 61 6e 64 6c 65 72 3b   = xBusyHandler;
172d0 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79  .  pPager->pBusy
172e0 48 61 6e 64 6c 65 72 41 72 67 20 3d 20 70 42 75  HandlerArg = pBu
172f0 73 79 48 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a  syHandlerArg;.}.
17300 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
17310 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
17320 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 66 20   this pager. If 
17330 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  not NULL, the re
17340 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69  initializer.** i
17350 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
17360 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
17370 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20  age in cache is 
17380 6d 6f 64 69 66 69 65 64 20 28 72 65 73 74 6f 72  modified (restor
17390 65 64 29 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f  ed).** as part o
173a0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
173b0 6f 72 20 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c  or savepoint rol
173c0 6c 62 61 63 6b 2e 20 54 68 65 20 63 61 6c 6c 62  lback. The callb
173d0 61 63 6b 20 67 69 76 65 73 20 0a 2a 2a 20 68 69  ack gives .** hi
173e0 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 20  gher-level code 
173f0 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74  an opportunity t
17400 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58  o restore the EX
17410 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 0a  TRA section to .
17420 2a 2a 20 61 67 72 65 65 20 77 69 74 68 20 74 68  ** agree with th
17430 65 20 72 65 73 74 6f 72 65 64 20 70 61 67 65 20  e restored page 
17440 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
17450 6c 69 74 65 33 50 61 67 65 72 53 65 74 52 65 69  lite3PagerSetRei
17460 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
17470 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
17480 6e 69 74 29 28 44 62 50 61 67 65 2a 29 29 7b 0a  nit)(DbPage*)){.
17490 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
174a0 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
174b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 74  ../*.** Report t
174c0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
174d0 73 69 7a 65 20 61 6e 64 20 6e 75 6d 62 65 72 20  size and number 
174e0 6f 66 20 72 65 73 65 72 76 65 64 20 62 79 74 65  of reserved byte
174f0 73 20 62 61 63 6b 0a 2a 2a 20 74 6f 20 74 68 65  s back.** to the
17500 20 63 6f 64 65 63 2e 0a 2a 2f 0a 23 69 66 64 65   codec..*/.#ifde
17510 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
17520 45 43 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  EC.static void p
17530 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28 50  agerReportSize(P
17540 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
17550 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
17560 64 65 63 53 69 7a 65 43 68 6e 67 20 29 7b 0a 20  decSizeChng ){. 
17570 20 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65     pPager->xCode
17580 63 53 69 7a 65 43 68 6e 67 28 70 50 61 67 65 72  cSizeChng(pPager
17590 2d 3e 70 43 6f 64 65 63 2c 20 70 50 61 67 65 72  ->pCodec, pPager
175a0 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20 20  ->pageSize,.    
175b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
175c0 20 20 20 20 20 20 20 28 69 6e 74 29 70 50 61 67         (int)pPag
175d0 65 72 2d 3e 6e 52 65 73 65 72 76 65 29 3b 0a 20  er->nReserve);. 
175e0 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
175f0 69 6e 65 20 70 61 67 65 72 52 65 70 6f 72 74 53  ine pagerReportS
17600 69 7a 65 28 58 29 20 20 20 20 20 2f 2a 20 4e 6f  ize(X)     /* No
17610 2d 6f 70 20 69 66 20 77 65 20 64 6f 20 6e 6f 74  -op if we do not
17620 20 73 75 70 70 6f 72 74 20 61 20 63 6f 64 65 63   support a codec
17630 20 2a 2f 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a   */.#endif../*.*
17640 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67  * Change the pag
17650 65 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74  e size used by t
17660 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 2e  he Pager object.
17670 20 54 68 65 20 6e 65 77 20 70 61 67 65 20 73 69   The new page si
17680 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73 73 65 64  ze .** is passed
17690 20 69 6e 20 2a 70 50 61 67 65 53 69 7a 65 2e 0a   in *pPageSize..
176a0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
176b0 65 72 20 69 73 20 69 6e 20 74 68 65 20 65 72 72  er is in the err
176c0 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74 68  or state when th
176d0 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
176e0 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20 69 73 20  alled, it.** is 
176f0 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20 76 61 6c  a no-op. The val
17700 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 74  ue returned is t
17710 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 65  he error state e
17720 72 72 6f 72 20 63 6f 64 65 20 28 69 2e 65 2e 20  rror code (i.e. 
17730 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51 4c 49 54  .** one of SQLIT
17740 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
17750 43 4f 52 52 55 50 54 20 6f 72 20 53 51 4c 49 54  CORRUPT or SQLIT
17760 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a 2a 20 4f  E_FULL)..**.** O
17770 74 68 65 72 77 69 73 65 2c 20 69 66 20 61 6c 6c  therwise, if all
17780 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
17790 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a  g are true:.**.*
177a0 2a 20 20 20 2a 20 74 68 65 20 6e 65 77 20 70 61  *   * the new pa
177b0 67 65 20 73 69 7a 65 20 28 76 61 6c 75 65 20 6f  ge size (value o
177c0 66 20 2a 70 50 61 67 65 53 69 7a 65 29 20 69 73  f *pPageSize) is
177d0 20 76 61 6c 69 64 20 28 61 20 70 6f 77 65 72 20   valid (a power 
177e0 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77 6f 20 62  .**     of two b
177f0 65 74 77 65 65 6e 20 35 31 32 20 61 6e 64 20 53  etween 512 and S
17800 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
17810 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76 65 29 2c  IZE, inclusive),
17820 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 74   and.**.**   * t
17830 68 65 72 65 20 61 72 65 20 6e 6f 20 6f 75 74 73  here are no outs
17840 74 61 6e 64 69 6e 67 20 70 61 67 65 20 72 65 66  tanding page ref
17850 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a 2a 2a 0a  erences, and.**.
17860 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
17870 61 73 65 20 69 73 20 65 69 74 68 65 72 20 6e 6f  ase is either no
17880 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  t an in-memory d
17890 61 74 61 62 61 73 65 20 6f 72 20 69 74 20 69 73  atabase or it is
178a0 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e 2d 6d 65  .**     an in-me
178b0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 74 68  mory database th
178c0 61 74 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e  at currently con
178d0 73 69 73 74 73 20 6f 66 20 7a 65 72 6f 20 70 61  sists of zero pa
178e0 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68 65 6e 20  ges..**.** then 
178f0 74 68 65 20 70 61 67 65 72 20 6f 62 6a 65 63 74  the pager object
17900 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 73 65   page size is se
17910 74 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e  t to *pPageSize.
17920 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61  .**.** If the pa
17930 67 65 20 73 69 7a 65 20 69 73 20 63 68 61 6e 67  ge size is chang
17940 65 64 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ed, then this fu
17950 6e 63 74 69 6f 6e 20 75 73 65 73 20 73 71 6c 69  nction uses sqli
17960 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f 63 28 29  te3PagerMalloc()
17970 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61   .** to obtain a
17980 20 6e 65 77 20 50 61 67 65 72 2e 70 54 6d 70 53   new Pager.pTmpS
17990 70 61 63 65 20 62 75 66 66 65 72 2e 20 49 66 20  pace buffer. If 
179a0 74 68 69 73 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  this allocation 
179b0 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66 61 69 6c  attempt .** fail
179c0 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  s, SQLITE_NOMEM 
179d0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
179e0 74 68 65 20 70 61 67 65 20 73 69 7a 65 20 72 65  the page size re
179f0 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e  mains unchanged.
17a00 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f 74 68 65   .** In all othe
17a10 72 20 63 61 73 65 73 2c 20 53 51 4c 49 54 45 5f  r cases, SQLITE_
17a20 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
17a30 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
17a40 65 20 73 69 7a 65 20 69 73 20 6e 6f 74 20 63 68  e size is not ch
17a50 61 6e 67 65 64 2c 20 65 69 74 68 65 72 20 62 65  anged, either be
17a60 63 61 75 73 65 20 6f 6e 65 20 6f 66 20 74 68 65  cause one of the
17a70 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a 2a 20 63   enumerated.** c
17a80 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f 76 65 20  onditions above 
17a90 69 73 20 6e 6f 74 20 74 72 75 65 2c 20 74 68 65  is not true, the
17aa0 20 70 61 67 65 72 20 77 61 73 20 69 6e 20 65 72   pager was in er
17ab0 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e 20 74  ror state when t
17ac0 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
17ad0 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f 72 20 62  was called, or b
17ae0 65 63 61 75 73 65 20 74 68 65 20 6d 65 6d 6f 72  ecause the memor
17af0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 61 74 74  y allocation att
17b00 65 6d 70 74 20 66 61 69 6c 65 64 2c 20 0a 2a 2a  empt failed, .**
17b10 20 74 68 65 6e 20 2a 70 50 61 67 65 53 69 7a 65   then *pPageSize
17b20 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f   is set to the o
17b30 6c 64 2c 20 72 65 74 61 69 6e 65 64 20 70 61 67  ld, retained pag
17b40 65 20 73 69 7a 65 20 62 65 66 6f 72 65 20 72 65  e size before re
17b50 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
17b60 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
17b70 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
17b80 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
17b90 65 53 69 7a 65 2c 20 69 6e 74 20 6e 52 65 73 65  eSize, int nRese
17ba0 72 76 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rve){.  int rc =
17bb0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
17bc0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17bd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 31 36  TE_OK ){.    u16
17be0 20 70 61 67 65 53 69 7a 65 20 3d 20 2a 70 50 61   pageSize = *pPa
17bf0 67 65 53 69 7a 65 3b 0a 20 20 20 20 61 73 73 65  geSize;.    asse
17c00 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30 20  rt( pageSize==0 
17c10 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35 31  || (pageSize>=51
17c20 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d 53  2 && pageSize<=S
17c30 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53  QLITE_MAX_PAGE_S
17c40 49 5a 45 29 20 29 3b 0a 20 20 20 20 69 66 28 20  IZE) );.    if( 
17c50 70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65  pageSize && page
17c60 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61  Size!=pPager->pa
17c70 67 65 53 69 7a 65 20 0a 20 20 20 20 20 26 26 20  geSize .     && 
17c80 28 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 3d 3d  (pPager->memDb==
17c90 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 64 62 53  0 || pPager->dbS
17ca0 69 7a 65 3d 3d 30 29 0a 20 20 20 20 20 26 26 20  ize==0).     && 
17cb0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
17cc0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
17cd0 43 61 63 68 65 29 3d 3d 30 20 0a 20 20 20 20 29  Cache)==0 .    )
17ce0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70 4e  {.      char *pN
17cf0 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ew = (char *)sql
17d00 69 74 65 33 50 61 67 65 4d 61 6c 6c 6f 63 28 70  ite3PageMalloc(p
17d10 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
17d20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
17d30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
17d40 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 65  _NOMEM;.      }e
17d50 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 61 67  lse{.        pag
17d60 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
17d70 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  ;.        pPager
17d80 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67  ->pageSize = pag
17d90 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 73  eSize;.        s
17da0 71 6c 69 74 65 33 50 61 67 65 46 72 65 65 28 70  qlite3PageFree(p
17db0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
17dc0 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
17dd0 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 3d 20 70  r->pTmpSpace = p
17de0 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  New;.        sql
17df0 69 74 65 33 50 63 61 63 68 65 53 65 74 50 61 67  ite3PcacheSetPag
17e00 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 70 50  eSize(pPager->pP
17e10 43 61 63 68 65 2c 20 70 61 67 65 53 69 7a 65 29  Cache, pageSize)
17e20 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
17e30 20 20 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d      *pPageSize =
17e40 20 28 75 31 36 29 70 50 61 67 65 72 2d 3e 70 61   (u16)pPager->pa
17e50 67 65 53 69 7a 65 3b 0a 20 20 20 20 69 66 28 20  geSize;.    if( 
17e60 6e 52 65 73 65 72 76 65 3c 30 20 29 20 6e 52 65  nReserve<0 ) nRe
17e70 73 65 72 76 65 20 3d 20 70 50 61 67 65 72 2d 3e  serve = pPager->
17e80 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20 61 73  nReserve;.    as
17e90 73 65 72 74 28 20 6e 52 65 73 65 72 76 65 3e 3d  sert( nReserve>=
17ea0 30 20 26 26 20 6e 52 65 73 65 72 76 65 3c 31 30  0 && nReserve<10
17eb0 30 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  00 );.    pPager
17ec0 2d 3e 6e 52 65 73 65 72 76 65 20 3d 20 28 69 31  ->nReserve = (i1
17ed0 36 29 6e 52 65 73 65 72 76 65 3b 0a 20 20 20 20  6)nReserve;.    
17ee0 70 61 67 65 72 52 65 70 6f 72 74 53 69 7a 65 28  pagerReportSize(
17ef0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
17f00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
17f10 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e  ** Return a poin
17f20 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d 70  ter to the "temp
17f30 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66 66  orary page" buff
17f40 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61 6c  er held internal
17f50 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61 67  ly.** by the pag
17f60 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20 62  er.  This is a b
17f70 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62 69  uffer that is bi
17f80 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c 64  g enough to hold
17f90 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20 63   the.** entire c
17fa0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74 61  ontent of a data
17fb0 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69 73  base page.  This
17fc0 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64 20   buffer is used 
17fd0 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64 75  internally.** du
17fe0 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61 6e  ring rollback an
17ff0 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77 72  d will be overwr
18000 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20 61  itten whenever a
18010 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63   rollback.** occ
18020 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72 20  urs.  But other 
18030 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65 65  modules are free
18040 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c 20   to use it too, 
18050 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e 6f  as long as.** no
18060 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20 68   rollbacks are h
18070 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f 69  appening..*/.voi
18080 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 54  d *sqlite3PagerT
18090 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20 2a  empSpace(Pager *
180a0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
180b0 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  n pPager->pTmpSp
180c0 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  ace;.}../*.** At
180d0 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68 65  tempt to set the
180e0 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61 73   maximum databas
180f0 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66 20  e page count if 
18100 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74 69  mxPage is positi
18110 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f 20  ve. .** Make no 
18120 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61 67  changes if mxPag
18130 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65 67  e is zero or neg
18140 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76 65  ative.  And neve
18150 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a 20  r reduce the.** 
18160 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75  maximum page cou
18170 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75 72  nt below the cur
18180 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68 65  rent size of the
18190 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
181a0 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20 6d   Regardless of m
181b0 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74 68  xPage, return th
181c0 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d 75  e current maximu
181d0 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2f  m page count..*/
181e0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
181f0 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50 61  rMaxPageCount(Pa
18200 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
18210 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
18220 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20 20  mxPage>0 ){.    
18230 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
18240 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 73   mxPage;.  }.  s
18250 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
18260 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b  ount(pPager, 0);
18270 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
18280 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
18290 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
182a0 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
182b0 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
182c0 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
182d0 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
182e0 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
182f0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
18300 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
18310 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
18320 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
18330 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
18340 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
18350 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
18360 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
18370 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
18380 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
18390 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
183a0 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
183b0 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
183c0 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
183d0 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
183e0 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
183f0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
18400 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
18410 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
18420 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
18430 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
18440 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
18450 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
18460 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
18470 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
18480 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
18490 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
184a0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
184b0 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
184c0 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
184d0 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
184e0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
184f0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
18500 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
18510 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
18520 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
18530 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
18540 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
18550 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
18560 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
18570 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
18580 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
18590 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
185a0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
185b0 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20 61   was opened on a
185c0 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 20   transient file 
185d0 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d 22 22 29 2c  (zFilename==""),
185e0 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65 64 20 6f 6e   or.** opened on
185f0 20 61 20 66 69 6c 65 20 6c 65 73 73 20 74 68 61   a file less tha
18600 6e 20 4e 20 62 79 74 65 73 20 69 6e 20 73 69 7a  n N bytes in siz
18610 65 2c 20 74 68 65 20 6f 75 74 70 75 74 20 62 75  e, the output bu
18620 66 66 65 72 20 69 73 0a 2a 2a 20 7a 65 72 6f 65  ffer is.** zeroe
18630 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  d and SQLITE_OK 
18640 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 72 61  returned. The ra
18650 74 69 6f 6e 61 6c 65 20 66 6f 72 20 74 68 69 73  tionale for this
18660 20 69 73 20 74 68 61 74 20 74 68 69 73 20 0a 2a   is that this .*
18670 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73  * function is us
18680 65 64 20 74 6f 20 72 65 61 64 20 64 61 74 61 62  ed to read datab
18690 61 73 65 20 68 65 61 64 65 72 73 2c 20 61 6e 64  ase headers, and
186a0 20 61 20 6e 65 77 20 74 72 61 6e 73 69 65 6e 74   a new transient
186b0 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20 73 69 7a 65   or.** zero size
186c0 64 20 64 61 74 61 62 61 73 65 20 68 61 73 20 61  d database has a
186d0 20 68 65 61 64 65 72 20 74 68 61 6e 20 63 6f 6e   header than con
186e0 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
186f0 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a 0a 2a 2a 20  f zeroes..**.** 
18700 49 66 20 61 6e 79 20 49 4f 20 65 72 72 6f 72 20  If any IO error 
18710 61 70 61 72 74 20 66 72 6f 6d 20 53 51 4c 49 54  apart from SQLIT
18720 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
18730 41 44 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  AD is encountere
18740 64 2c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20  d,.** the error 
18750 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
18760 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 61   to the caller a
18770 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  nd the contents 
18780 6f 66 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74  of the.** output
18790 20 62 75 66 66 65 72 20 75 6e 64 65 66 69 6e 65   buffer undefine
187a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
187b0 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68 65  3PagerReadFilehe
187c0 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
187d0 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
187e0 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
187f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
18800 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65 74  ITE_OK;.  memset
18810 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20  (pDest, 0, N);. 
18820 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
18830 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
18840 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
18850 29 3b 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28  );.  if( isOpen(
18860 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20  pPager->fd) ){. 
18870 20 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48     IOTRACE(("DBH
18880 44 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70  DR %p 0 %d\n", p
18890 50 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72  Pager, N)).    r
188a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
188b0 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44  d(pPager->fd, pD
188c0 65 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20  est, N, 0);.    
188d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49  if( rc==SQLITE_I
188e0 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
188f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
18900 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20  LITE_OK;.    }. 
18910 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
18920 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
18930 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72  the total number
18940 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
18950 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
18960 73 73 6f 63 69 61 74 65 64 20 0a 2a 2a 20 77 69  ssociated .** wi
18970 74 68 20 70 50 61 67 65 72 2e 20 4e 6f 72 6d 61  th pPager. Norma
18980 6c 6c 79 2c 20 74 68 69 73 20 69 73 20 63 61 6c  lly, this is cal
18990 63 75 6c 61 74 65 64 20 61 73 20 28 3c 64 62 20  culated as (<db 
189a0 66 69 6c 65 20 73 69 7a 65 3e 2f 3c 70 61 67 65  file size>/<page
189b0 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20 48 6f 77 65  -size>)..** Howe
189c0 76 65 72 2c 20 69 66 20 74 68 65 20 66 69 6c 65  ver, if the file
189d0 20 69 73 20 62 65 74 77 65 65 6e 20 31 20 61 6e   is between 1 an
189e0 64 20 3c 70 61 67 65 2d 73 69 7a 65 3e 20 62 79  d <page-size> by
189f0 74 65 73 20 69 6e 20 73 69 7a 65 2c 20 74 68 65  tes in size, the
18a00 6e 20 0a 2a 2a 20 74 68 69 73 20 69 73 20 63 6f  n .** this is co
18a10 6e 73 69 64 65 72 65 64 20 61 20 31 20 70 61 67  nsidered a 1 pag
18a20 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e file..**.** If
18a30 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
18a40 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
18a50 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
18a60 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20  is called, then 
18a70 74 68 65 0a 2a 2a 20 65 72 72 6f 72 20 73 74 61  the.** error sta
18a80 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
18a90 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
18aa0 6e 50 61 67 65 20 6c 65 66 74 20 75 6e 63 68 61  nPage left uncha
18ab0 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20  nged. Or,.** if 
18ac0 74 68 65 20 66 69 6c 65 20 73 79 73 74 65 6d 20  the file system 
18ad0 68 61 73 20 74 6f 20 62 65 20 71 75 65 72 69 65  has to be querie
18ae0 64 20 66 6f 72 20 74 68 65 20 73 69 7a 65 20 6f  d for the size o
18af0 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 0a 2a  f the file and.*
18b00 2a 20 74 68 65 20 71 75 65 72 79 20 61 74 74 65  * the query atte
18b10 6d 70 74 20 72 65 74 75 72 6e 73 20 61 6e 20 49  mpt returns an I
18b20 4f 20 65 72 72 6f 72 2c 20 74 68 65 20 49 4f 20  O error, the IO 
18b30 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
18b40 74 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70  turned.** and *p
18b50 6e 50 61 67 65 20 69 73 20 6c 65 66 74 20 75 6e  nPage is left un
18b60 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f  changed..**.** O
18b70 74 68 65 72 77 69 73 65 2c 20 69 66 20 65 76 65  therwise, if eve
18b80 72 79 74 68 69 6e 67 20 69 73 20 73 75 63 63 65  rything is succe
18b90 73 73 66 75 6c 2c 20 74 68 65 6e 20 53 51 4c 49  ssful, then SQLI
18ba0 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
18bb0 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e 50 61 67 65  d.** and *pnPage
18bc0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
18bd0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
18be0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  n the database..
18bf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
18c00 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67  gerPagecount(Pag
18c10 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
18c20 2a 70 6e 50 61 67 65 29 7b 0a 20 20 50 67 6e 6f  *pnPage){.  Pgno
18c30 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 20   nPage;         
18c40 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 74        /* Value t
18c50 6f 20 72 65 74 75 72 6e 20 76 69 61 20 2a 70 6e  o return via *pn
18c60 50 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66  Page */..  /* If
18c70 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 6c   the pager is al
18c80 72 65 61 64 79 20 69 6e 20 74 68 65 20 65 72 72  ready in the err
18c90 6f 72 20 73 74 61 74 65 2c 20 72 65 74 75 72 6e  or state, return
18ca0 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 2e   the error code.
18cb0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
18cc0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
18cd0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18ce0 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
18cf0 2f 2a 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  /* Determine the
18d00 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18d10 20 69 6e 20 74 68 65 20 66 69 6c 65 2e 20 53 74   in the file. St
18d20 6f 72 65 20 74 68 69 73 20 69 6e 20 6e 50 61 67  ore this in nPag
18d30 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  e. */.  if( pPag
18d40 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20  er->dbSizeValid 
18d50 29 7b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20 70  ){.    nPage = p
18d60 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
18d70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
18d80 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
18d90 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 72 65 74      /* Error ret
18da0 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53  urned by OsFileS
18db0 69 7a 65 28 29 20 2a 2f 0a 20 20 20 20 69 36 34  ize() */.    i64
18dc0 20 6e 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20   n = 0;         
18dd0 20 20 20 20 20 2f 2a 20 46 69 6c 65 20 73 69 7a       /* File siz
18de0 65 20 69 6e 20 62 79 74 65 73 20 72 65 74 75 72  e in bytes retur
18df0 6e 65 64 20 62 79 20 4f 73 46 69 6c 65 53 69 7a  ned by OsFileSiz
18e00 65 28 29 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65  e() */..    asse
18e10 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
18e20 72 2d 3e 66 64 29 20 7c 7c 20 70 50 61 67 65 72  r->fd) || pPager
18e30 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
18e40 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
18e50 67 65 72 2d 3e 66 64 29 20 26 26 20 28 30 20 21  ger->fd) && (0 !
18e60 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  = (rc = sqlite3O
18e70 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
18e80 2d 3e 66 64 2c 20 26 6e 29 29 29 20 29 7b 0a 20  ->fd, &n))) ){. 
18e90 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
18ea0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
18eb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
18ec0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
18ed0 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
18ee0 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
18ef0 6e 50 61 67 65 20 3d 20 31 3b 0a 20 20 20 20 7d  nPage = 1;.    }
18f00 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67  else{.      nPag
18f10 65 20 3d 20 28 50 67 6e 6f 29 28 6e 20 2f 20 70  e = (Pgno)(n / p
18f20 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
18f30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
18f40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
18f50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20  AGER_UNLOCK ){. 
18f60 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
18f70 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
18f80 20 20 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c     pPager->dbFil
18f90 65 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  eSize = nPage;. 
18fa0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
18fb0 69 7a 65 56 61 6c 69 64 20 3d 20 31 3b 0a 20 20  izeValid = 1;.  
18fc0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
18fd0 20 74 68 65 20 63 75 72 72 65 6e 74 20 6e 75 6d   the current num
18fe0 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ber of pages in 
18ff0 74 68 65 20 66 69 6c 65 20 69 73 20 67 72 65 61  the file is grea
19000 74 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20  ter than the .  
19010 2a 2a 20 63 6f 6e 66 69 67 75 72 65 64 20 6d 61  ** configured ma
19020 78 69 6d 75 6d 20 70 61 67 65 72 20 6e 75 6d 62  ximum pager numb
19030 65 72 2c 20 69 6e 63 72 65 61 73 65 20 74 68 65  er, increase the
19040 20 61 6c 6c 6f 77 65 64 20 6c 69 6d 69 74 20 73   allowed limit s
19050 6f 0a 20 20 2a 2a 20 74 68 61 74 20 74 68 65 20  o.  ** that the 
19060 66 69 6c 65 20 63 61 6e 20 62 65 20 72 65 61 64  file can be read
19070 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 50 61  ..  */.  if( nPa
19080 67 65 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  ge>pPager->mxPgn
19090 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  o ){.    pPager-
190a0 3e 6d 78 50 67 6e 6f 20 3d 20 28 50 67 6e 6f 29  >mxPgno = (Pgno)
190b0 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  nPage;.  }..  /*
190c0 20 53 65 74 20 74 68 65 20 6f 75 74 70 75 74 20   Set the output 
190d0 76 61 72 69 61 62 6c 65 20 61 6e 64 20 72 65 74  variable and ret
190e0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 2a 2f  urn SQLITE_OK */
190f0 0a 20 20 69 66 28 20 70 6e 50 61 67 65 20 29 7b  .  if( pnPage ){
19100 0a 20 20 20 20 2a 70 6e 50 61 67 65 20 3d 20 6e  .    *pnPage = n
19110 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Page;.  }.  retu
19120 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
19130 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
19140 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 66 20  btain a lock of 
19150 74 79 70 65 20 6c 6f 63 6b 74 79 70 65 20 6f 6e  type locktype on
19160 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19170 6c 65 2e 20 49 66 0a 2a 2a 20 61 20 73 69 6d 69  le. If.** a simi
19180 6c 61 72 20 6f 72 20 67 72 65 61 74 65 72 20 6c  lar or greater l
19190 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
191a0 65 6c 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69  eld, this functi
191b0 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 0a 2a 2a  on is a no-op.**
191c0 20 28 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49   (returning SQLI
191d0 54 45 5f 4f 4b 20 69 6d 6d 65 64 69 61 74 65 6c  TE_OK immediatel
191e0 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  y)..**.** Otherw
191f0 69 73 65 2c 20 61 74 74 65 6d 70 74 20 74 6f 20  ise, attempt to 
19200 6f 62 74 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20  obtain the lock 
19210 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 4c  using sqlite3OsL
19220 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b 65 20 0a 2a  ock(). Invoke .*
19230 2a 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  * the busy callb
19240 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 20  ack if the lock 
19250 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
19260 20 61 76 61 69 6c 61 62 6c 65 2e 20 52 65 70 65   available. Repe
19270 61 74 20 0a 2a 2a 20 75 6e 74 69 6c 20 74 68 65  at .** until the
19280 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
19290 65 74 75 72 6e 73 20 66 61 6c 73 65 20 6f 72 20  eturns false or 
192a0 75 6e 74 69 6c 20 74 68 65 20 61 74 74 65 6d 70  until the attemp
192b0 74 20 74 6f 20 0a 2a 2a 20 6f 62 74 61 69 6e 20  t to .** obtain 
192c0 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
192d0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
192e0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
192f0 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
19300 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
19310 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
19320 65 20 6c 6f 63 6b 2e 20 49 66 20 74 68 65 20 6c  e lock. If the l
19330 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ock is obtained 
19340 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 73 65  successfully, se
19350 74 20 74 68 65 20 50 61 67 65 72 2e 73 74 61 74  t the Pager.stat
19360 65 20 0a 2a 2a 20 76 61 72 69 61 62 6c 65 20 74  e .** variable t
19370 6f 20 6c 6f 63 6b 74 79 70 65 20 62 65 66 6f 72  o locktype befor
19380 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
19390 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
193a0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61  _wait_on_lock(Pa
193b0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
193c0 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e   locktype){.  in
193d0 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
193e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193f0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
19400 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65 20 4f  e */..  /* The O
19410 53 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75  S lock values mu
19420 73 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61  st be the same a
19430 73 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b  s the Pager lock
19440 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73   values */.  ass
19450 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
19460 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
19470 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
19480 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
19490 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
194a0 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
194b0 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
194c0 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20  E_LOCK );..  /* 
194d0 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  If the file is c
194e0 75 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65  urrently unlocke
194f0 64 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20  d then the size 
19500 6d 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20  must be unknown 
19510 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
19520 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
19530 52 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67  R_SHARED || pPag
19540 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d  er->dbSizeValid=
19550 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 43 68 65 63  =0 );..  /* Chec
19560 6b 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65  k that this is e
19570 69 74 68 65 72 20 61 20 6e 6f 2d 6f 70 20 28 62  ither a no-op (b
19580 65 63 61 75 73 65 20 74 68 65 20 72 65 71 75 65  ecause the reque
19590 73 74 65 64 20 6c 6f 63 6b 20 69 73 20 0a 20 20  sted lock is .  
195a0 2a 2a 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c  ** already held,
195b0 20 6f 72 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   or one of the t
195c0 72 61 6e 73 69 73 74 69 6f 6e 73 20 74 68 61 74  ransistions that
195d0 20 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65   the busy-handle
195e0 72 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 69 6e  r.  ** may be in
195f0 76 6f 6b 65 64 20 64 75 72 69 6e 67 2c 20 61 63  voked during, ac
19600 63 6f 72 64 69 6e 67 20 74 6f 20 74 68 65 20 63  cording to the c
19610 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 0a 20 20 2a  omment above.  *
19620 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  * sqlite3PagerSe
19630 74 42 75 73 79 68 61 6e 64 6c 65 72 28 29 2e 0a  tBusyhandler()..
19640 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 28    */.  assert( (
19650 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
19660 6f 63 6b 74 79 70 65 29 0a 20 20 20 20 20 20 20  ocktype).       
19670 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  || (pPager->stat
19680 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
19690 26 26 20 6c 6f 63 6b 74 79 70 65 3d 3d 50 41 47  && locktype==PAG
196a0 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  ER_SHARED).     
196b0 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 73 74    || (pPager->st
196c0 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52  ate==PAGER_RESER
196d0 56 45 44 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  VED && locktype=
196e0 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45  =PAGER_EXCLUSIVE
196f0 29 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  ).  );..  if( pP
19700 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
19710 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
19720 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
19730 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a 20  else{.    do {. 
19740 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
19750 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
19760 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
19770 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
19780 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 70 50  QLITE_BUSY && pP
19790 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
197a0 65 72 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79  er(pPager->pBusy
197b0 48 61 6e 64 6c 65 72 41 72 67 29 20 29 3b 0a 20  HandlerArg) );. 
197c0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
197d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
197e0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 28 75  ager->state = (u
197f0 38 29 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20  8)locktype;.    
19800 20 20 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b    IOTRACE(("LOCK
19810 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
19820 72 2c 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20  r, locktype)).  
19830 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19840 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
19850 75 6e 63 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  uncate the in-me
19860 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 66 69  mory database fi
19870 6c 65 20 69 6d 61 67 65 20 74 6f 20 6e 50 61 67  le image to nPag
19880 65 20 70 61 67 65 73 2e 20 54 68 69 73 20 0a 2a  e pages. This .*
19890 2a 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  * function does 
198a0 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d 6f 64  not actually mod
198b0 69 66 79 20 74 68 65 20 64 61 74 61 62 61 73 65  ify the database
198c0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 2e 20 49   file on disk. I
198d0 74 20 0a 2a 2a 20 6a 75 73 74 20 73 65 74 73 20  t .** just sets 
198e0 74 68 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  the internal sta
198f0 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  te of the pager 
19900 6f 62 6a 65 63 74 20 73 6f 20 74 68 61 74 20 74  object so that t
19910 68 65 20 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6f  he .** truncatio
19920 6e 20 77 69 6c 6c 20 62 65 20 64 6f 6e 65 20 77  n will be done w
19930 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20  hen the current 
19940 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63  transaction is c
19950 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f 0a 76 6f 69  ommitted..*/.voi
19960 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  d sqlite3PagerTr
19970 75 6e 63 61 74 65 49 6d 61 67 65 28 50 61 67 65  uncateImage(Page
19980 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
19990 6e 50 61 67 65 29 7b 0a 20 20 61 73 73 65 72 74  nPage){.  assert
199a0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
199b0 56 61 6c 69 64 20 29 3b 0a 20 20 61 73 73 65 72  Valid );.  asser
199c0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
199d0 65 3e 3d 6e 50 61 67 65 20 29 3b 0a 20 20 61 73  e>=nPage );.  as
199e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
199f0 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
19a00 56 45 44 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  VED );.  pPager-
19a10 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
19a20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
19a30 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
19a40 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
19a50 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
19a60 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
19a70 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
19a80 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
19a90 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
19aa0 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
19ab0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
19ac0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
19ad0 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
19ae0 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
19af0 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
19b00 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
19b10 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
19b20 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
19b30 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
19b40 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
19b50 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
19b60 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
19b70 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
19b80 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
19b90 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ump..**.** This 
19ba0 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20  function always 
19bb0 73 75 63 63 65 65 64 73 2e 20 49 66 20 61 20 74  succeeds. If a t
19bc0 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
19bd0 74 69 76 65 20 61 6e 20 61 74 74 65 6d 70 74 0a  tive an attempt.
19be0 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f 20 72 6f  ** is made to ro
19bf0 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49 66 20 61  ll it back. If a
19c00 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 64  n error occurs d
19c10 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62 61  uring the rollba
19c20 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20 6a 6f 75  ck .** a hot jou
19c30 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c 65 66 74  rnal may be left
19c40 20 69 6e 20 74 68 65 20 66 69 6c 65 73 79 73 74   in the filesyst
19c50 65 6d 20 62 75 74 20 6e 6f 20 65 72 72 6f 72 20  em but no error 
19c60 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 74  is returned.** t
19c70 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
19c80 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
19c90 72 43 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50  rClose(Pager *pP
19ca0 61 67 65 72 29 7b 0a 20 20 64 69 73 61 62 6c 65  ager){.  disable
19cb0 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
19cc0 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65  rors();.  sqlite
19cd0 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c  3BeginBenignMall
19ce0 6f 63 28 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  oc();.  pPager->
19cf0 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70  errCode = 0;.  p
19d00 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
19d10 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Mode = 0;.  page
19d20 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
19d30 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
19d40 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
19d50 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c 73  (pPager);.  }els
19d60 65 7b 0a 20 20 20 20 2f 2a 20 53 65 74 20 50 61  e{.    /* Set Pa
19d70 67 65 72 2e 6a 6f 75 72 6e 61 6c 48 64 72 20 74  ger.journalHdr t
19d80 6f 20 2d 31 20 66 6f 72 20 74 68 65 20 62 65 6e  o -1 for the ben
19d90 65 66 69 74 20 6f 66 20 74 68 65 20 70 61 67 65  efit of the page
19da0 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 0a 20 20  r_playback() .  
19db0 20 20 2a 2a 20 63 61 6c 6c 20 77 68 69 63 68 20    ** call which 
19dc0 6d 61 79 20 62 65 20 6d 61 64 65 20 66 72 6f 6d  may be made from
19dd0 20 77 69 74 68 69 6e 20 70 61 67 65 72 55 6e 6c   within pagerUnl
19de0 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 29  ockAndRollback()
19df0 2e 20 49 66 20 69 74 0a 20 20 20 20 2a 2a 20 69  . If it.    ** i
19e00 73 20 6e 6f 74 20 2d 31 2c 20 74 68 65 6e 20 74  s not -1, then t
19e10 68 65 20 75 6e 73 79 6e 63 65 64 20 70 6f 72 74  he unsynced port
19e20 69 6f 6e 20 6f 66 20 61 6e 20 6f 70 65 6e 20 6a  ion of an open j
19e30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 0a  ournal file may.
19e40 20 20 20 20 2a 2a 20 62 65 20 70 6c 61 79 65 64      ** be played
19e50 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64   back into the d
19e60 61 74 61 62 61 73 65 2e 20 49 66 20 61 20 70 6f  atabase. If a po
19e70 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75  wer failure occu
19e80 72 73 20 77 68 69 6c 65 0a 20 20 20 20 2a 2a 20  rs while.    ** 
19e90 74 68 69 73 20 69 73 20 68 61 70 70 65 6e 69 6e  this is happenin
19ea0 67 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  g, the database 
19eb0 6d 61 79 20 62 65 63 6f 6d 65 20 63 6f 72 72 75  may become corru
19ec0 70 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  pt..    */.    p
19ed0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
19ee0 72 20 3d 20 2d 31 3b 0a 20 20 20 20 70 61 67 65  r = -1;.    page
19ef0 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
19f00 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
19f10 20 20 73 71 6c 69 74 65 33 45 6e 64 42 65 6e 69    sqlite3EndBeni
19f20 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 65 6e  gnMalloc();.  en
19f30 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
19f40 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41  o_errors();.  PA
19f50 47 45 52 54 52 41 43 45 28 28 22 43 4c 4f 53 45  GERTRACE(("CLOSE
19f60 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19f70 70 50 61 67 65 72 29 29 29 3b 0a 20 20 49 4f 54  pPager)));.  IOT
19f80 52 41 43 45 28 28 22 43 4c 4f 53 45 20 25 70 5c  RACE(("CLOSE %p\
19f90 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 73  n", pPager)).  s
19fa0 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
19fb0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 73 71 6c  ager->fd);.  sql
19fc0 69 74 65 33 50 61 67 65 46 72 65 65 28 70 50 61  ite3PageFree(pPa
19fd0 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b  ger->pTmpSpace);
19fe0 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  .  sqlite3Pcache
19ff0 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 70 50  Close(pPager->pP
1a000 43 61 63 68 65 29 3b 0a 0a 23 69 66 64 65 66 20  Cache);..#ifdef 
1a010 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
1a020 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78  .  if( pPager->x
1a030 43 6f 64 65 63 46 72 65 65 20 29 20 70 50 61 67  CodecFree ) pPag
1a040 65 72 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70  er->xCodecFree(p
1a050 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a  Pager->pCodec);.
1a060 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
1a070 28 20 21 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ( !pPager->aSave
1a080 70 6f 69 6e 74 20 26 26 20 21 70 50 61 67 65 72  point && !pPager
1a090 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->pInJournal );.
1a0a0 20 20 61 73 73 65 72 74 28 20 21 69 73 4f 70 65    assert( !isOpe
1a0b0 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26  n(pPager->jfd) &
1a0c0 26 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72  & !isOpen(pPager
1a0d0 2d 3e 73 6a 66 64 29 20 29 3b 0a 0a 20 20 73 71  ->sjfd) );..  sq
1a0e0 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
1a0f0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
1a100 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21  ITE_OK;.}..#if !
1a110 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20  defined(NDEBUG) 
1a120 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1a130 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1a140 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75  turn the page nu
1a150 6d 62 65 72 20 66 6f 72 20 70 61 67 65 20 70 50  mber for page pP
1a160 67 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74  g..*/.Pgno sqlit
1a170 65 33 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65  e3PagerPagenumbe
1a180 72 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  r(DbPage *pPg){.
1a190 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 70 67    return pPg->pg
1a1a0 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  no;.}.#endif../*
1a1b0 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
1a1c0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
1a1d0 74 20 66 6f 72 20 70 61 67 65 20 70 50 67 2e 0a  t for page pPg..
1a1e0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
1a1f0 61 67 65 72 52 65 66 28 44 62 50 61 67 65 20 2a  agerRef(DbPage *
1a200 70 50 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 50  pPg){.  sqlite3P
1a210 63 61 63 68 65 52 65 66 28 70 50 67 29 3b 0a 7d  cacheRef(pPg);.}
1a220 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65  ../*.** Sync the
1a230 20 6a 6f 75 72 6e 61 6c 2e 20 49 6e 20 6f 74 68   journal. In oth
1a240 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
1a250 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
1a260 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
1a270 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1a280 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
1a290 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
1a2a0 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
1a2b0 74 68 65 0a 2a 2a 20 64 69 73 6b 20 61 6e 64 20  the.** disk and 
1a2c0 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65 64 20  can be restored 
1a2d0 69 6e 20 74 68 65 20 65 76 65 6e 74 20 6f 66 20  in the event of 
1a2e0 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  a hot-journal ro
1a2f0 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66  llback..**.** If
1a300 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
1a310 79 6e 63 20 66 6c 61 67 20 69 73 20 6e 6f 74 20  ync flag is not 
1a320 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20 66  set, then this f
1a330 75 6e 63 74 69 6f 6e 20 69 73 20 61 0a 2a 2a 20  unction is a.** 
1a340 6e 6f 2d 6f 70 2e 20 4f 74 68 65 72 77 69 73 65  no-op. Otherwise
1a350 2c 20 74 68 65 20 61 63 74 69 6f 6e 73 20 72 65  , the actions re
1a360 71 75 69 72 65 64 20 64 65 70 65 6e 64 20 6f 6e  quired depend on
1a370 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64   the journal-mod
1a380 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 65 76  e.** and the dev
1a390 69 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74  ice characterist
1a3a0 69 63 73 20 6f 66 20 74 68 65 20 74 68 65 20 66  ics of the the f
1a3b0 69 6c 65 2d 73 79 73 74 65 6d 2c 20 61 73 20 66  ile-system, as f
1a3c0 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  ollows:.**.**   
1a3d0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
1a3e0 20 66 69 6c 65 20 69 73 20 61 6e 20 69 6e 2d 6d   file is an in-m
1a3f0 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c 20 66 69  emory journal fi
1a400 6c 65 2c 20 6e 6f 20 61 63 74 69 6f 6e 20 6e 65  le, no action ne
1a410 65 64 0a 2a 2a 20 20 20 20 20 62 65 20 74 61 6b  ed.**     be tak
1a420 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 4f 74  en..**.**   * Ot
1a430 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20  herwise, if the 
1a440 64 65 76 69 63 65 20 64 6f 65 73 20 6e 6f 74 20  device does not 
1a450 73 75 70 70 6f 72 74 20 74 68 65 20 53 41 46 45  support the SAFE
1a460 5f 41 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79  _APPEND property
1a470 2c 0a 2a 2a 20 20 20 20 20 74 68 65 6e 20 74 68  ,.**     then th
1a480 65 20 6e 52 65 63 20 66 69 65 6c 64 20 6f 66 20  e nRec field of 
1a490 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
1a4a0 79 20 77 72 69 74 74 65 6e 20 6a 6f 75 72 6e 61  y written journa
1a4b0 6c 20 68 65 61 64 65 72 0a 2a 2a 20 20 20 20 20  l header.**     
1a4c0 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 63 6f  is updated to co
1a4d0 6e 74 61 69 6e 20 74 68 65 20 6e 75 6d 62 65 72  ntain the number
1a4e0 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f   of journal reco
1a4f0 72 64 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a  rds that have.**
1a500 20 20 20 20 20 62 65 65 6e 20 77 72 69 74 74 65       been writte
1a510 6e 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 74 2e 20  n following it. 
1a520 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1a530 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 66 75 6c  operating in ful
1a540 6c 2d 73 79 6e 63 0a 2a 2a 20 20 20 20 20 6d 6f  l-sync.**     mo
1a550 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  de, then the jou
1a560 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e  rnal file is syn
1a570 63 65 64 20 62 65 66 6f 72 65 20 74 68 69 73 20  ced before this 
1a580 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64  field is updated
1a590 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 74  ..**.**   * If t
1a5a0 68 65 20 64 65 76 69 63 65 20 64 6f 65 73 20 6e  he device does n
1a5b0 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65 20 53  ot support the S
1a5c0 45 51 55 45 4e 54 49 41 4c 20 70 72 6f 70 65 72  EQUENTIAL proper
1a5d0 74 79 2c 20 74 68 65 6e 20 0a 2a 2a 20 20 20 20  ty, then .**    
1a5e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
1a5f0 20 73 79 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f   synced..**.** O
1a600 72 2c 20 69 6e 20 70 73 65 75 64 6f 2d 63 6f 64  r, in pseudo-cod
1a610 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 4e  e:.**.**   if( N
1a620 4f 54 20 3c 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f  OT <in-memory jo
1a630 75 72 6e 61 6c 3e 20 29 7b 0a 2a 2a 20 20 20 20  urnal> ){.**    
1a640 20 69 66 28 20 4e 4f 54 20 53 41 46 45 5f 41 50   if( NOT SAFE_AP
1a650 50 45 4e 44 20 29 7b 0a 2a 2a 20 20 20 20 20 20  PEND ){.**      
1a660 20 69 66 28 20 3c 66 75 6c 6c 2d 73 79 6e 63 20   if( <full-sync 
1a670 6d 6f 64 65 3e 20 29 20 78 53 79 6e 63 28 3c 6a  mode> ) xSync(<j
1a680 6f 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a  ournal file>);.*
1a690 2a 20 20 20 20 20 20 20 3c 75 70 64 61 74 65 20  *       <update 
1a6a0 6e 52 65 63 20 66 69 65 6c 64 3e 0a 2a 2a 20 20  nRec field>.**  
1a6b0 20 20 20 7d 20 0a 2a 2a 20 20 20 20 20 69 66 28     } .**     if(
1a6c0 20 4e 4f 54 20 53 45 51 55 45 4e 54 49 41 4c 20   NOT SEQUENTIAL 
1a6d0 29 20 78 53 79 6e 63 28 3c 6a 6f 75 72 6e 61 6c  ) xSync(<journal
1a6e0 20 66 69 6c 65 3e 29 3b 0a 2a 2a 20 20 20 7d 0a   file>);.**   }.
1a6f0 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72 2e  **.** The Pager.
1a700 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
1a710 20 6e 65 76 65 72 20 62 65 20 73 65 74 20 66 6f   never be set fo
1a720 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  r temporary file
1a730 73 2c 20 6f 72 20 61 6e 79 0a 2a 2a 20 66 69 6c  s, or any.** fil
1a740 65 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 6e  e operating in n
1a750 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 28 50 61 67  o-sync mode (Pag
1a760 65 72 2e 6e 6f 53 79 6e 63 20 73 65 74 20 74 6f  er.noSync set to
1a770 20 6e 6f 6e 2d 7a 65 72 6f 29 2e 0a 2a 2a 0a 2a   non-zero)..**.*
1a780 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
1a790 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   this routine cl
1a7a0 65 61 72 73 20 74 68 65 20 50 47 48 44 52 5f 4e  ears the PGHDR_N
1a7b0 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 66  EED_SYNC flag of
1a7c0 20 65 76 65 72 79 20 0a 2a 2a 20 70 61 67 65 20   every .** page 
1a7d0 63 75 72 72 65 6e 74 6c 79 20 68 65 6c 64 20 69  currently held i
1a7e0 6e 20 6d 65 6d 6f 72 79 20 62 65 66 6f 72 65 20  n memory before 
1a7f0 72 65 74 75 72 6e 69 6e 67 20 53 51 4c 49 54 45  returning SQLITE
1a800 5f 4f 4b 2e 20 49 66 20 61 6e 20 49 4f 0a 2a 2a  _OK. If an IO.**
1a810 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1a820 74 65 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20  tered, then the 
1a830 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  IO error code is
1a840 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1a850 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 73 74 61 74   caller..*/.stat
1a860 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
1a870 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
1a880 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
1a890 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1a8a0 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1a8b0 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1a8c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
1a8d0 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52  urnalMode!=PAGER
1a8e0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
1a8f0 4f 52 59 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ORY ){.      int
1a900 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
1a910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a920 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
1a930 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
1a940 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
1a950 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1a960 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1a970 3e 66 64 29 3b 0a 20 20 20 20 20 20 61 73 73 65  >fd);.      asse
1a980 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  rt( isOpen(pPage
1a990 72 2d 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 20 20  r->jfd) );..    
1a9a0 20 20 69 66 28 20 30 3d 3d 28 69 44 63 26 53 51    if( 0==(iDc&SQ
1a9b0 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f  LITE_IOCAP_SAFE_
1a9c0 41 50 50 45 4e 44 29 20 29 7b 0a 20 20 20 20 20  APPEND) ){.     
1a9d0 20 20 20 2f 2a 20 56 61 72 69 61 62 6c 65 20 69     /* Variable i
1a9e0 4e 52 65 63 4f 66 66 73 65 74 20 69 73 20 73 65  NRecOffset is se
1a9f0 74 20 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20  t to the offset 
1aa00 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
1aa10 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ile.        ** o
1aa20 66 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  f the nRec field
1aa30 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
1aa40 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a 6f  ently written jo
1aa50 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20  urnal header..  
1aa60 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 66 69        ** This fi
1aa70 65 6c 64 20 77 69 6c 6c 20 62 65 20 75 70 64 61  eld will be upda
1aa80 74 65 64 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68  ted following th
1aa90 65 20 78 53 79 6e 63 28 29 20 6f 70 65 72 61 74  e xSync() operat
1aaa0 69 6f 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  ion.        ** o
1aab0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1aac0 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  le. */.        i
1aad0 36 34 20 69 4e 52 65 63 4f 66 66 73 65 74 20 3d  64 iNRecOffset =
1aae0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1aaf0 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
1ab00 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 0a 20 20  urnalMagic);..  
1ab10 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 62 6c        /* This bl
1ab20 6f 63 6b 20 64 65 61 6c 73 20 77 69 74 68 20 61  ock deals with a
1ab30 6e 20 6f 62 73 63 75 72 65 20 70 72 6f 62 6c 65  n obscure proble
1ab40 6d 2e 20 49 66 20 74 68 65 20 6c 61 73 74 20 63  m. If the last c
1ab50 6f 6e 6e 65 63 74 69 6f 6e 0a 20 20 20 20 20 20  onnection.      
1ab60 20 20 2a 2a 20 74 68 61 74 20 77 72 6f 74 65 20    ** that wrote 
1ab70 74 6f 20 74 68 69 73 20 64 61 74 61 62 61 73 65  to this database
1ab80 20 77 61 73 20 6f 70 65 72 61 74 69 6e 67 20 69   was operating i
1ab90 6e 20 70 65 72 73 69 73 74 65 6e 74 2d 6a 6f 75  n persistent-jou
1aba0 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20  rnal.        ** 
1abb0 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 6a  mode, then the j
1abc0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 61 79 20  ournal file may 
1abd0 61 74 20 74 68 69 73 20 70 6f 69 6e 74 20 61 63  at this point ac
1abe0 74 75 61 6c 6c 79 20 62 65 20 6c 61 72 67 65 72  tually be larger
1abf0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 6e  .        ** than
1ac00 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
1ac10 66 20 62 79 74 65 73 2e 20 49 66 20 74 68 65 20  f bytes. If the 
1ac20 6e 65 78 74 20 74 68 69 6e 67 20 69 6e 20 74 68  next thing in th
1ac30 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  e journal.      
1ac40 20 20 2a 2a 20 66 69 6c 65 20 68 61 70 70 65 6e    ** file happen
1ac50 73 20 74 6f 20 62 65 20 61 20 6a 6f 75 72 6e 61  s to be a journa
1ac60 6c 2d 68 65 61 64 65 72 20 28 77 72 69 74 74 65  l-header (writte
1ac70 6e 20 61 73 20 70 61 72 74 20 6f 66 20 74 68 65  n as part of the
1ac80 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 65 76  .        ** prev
1ac90 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  ious connections
1aca0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 61   transaction), a
1acb0 6e 64 20 61 20 63 72 61 73 68 20 6f 72 20 70 6f  nd a crash or po
1acc0 77 65 72 2d 66 61 69 6c 75 72 65 20 0a 20 20 20  wer-failure .   
1acd0 20 20 20 20 20 2a 2a 20 6f 63 63 75 72 73 20 61       ** occurs a
1ace0 66 74 65 72 20 6e 52 65 63 20 69 73 20 75 70 64  fter nRec is upd
1acf0 61 74 65 64 20 62 75 74 20 62 65 66 6f 72 65 20  ated but before 
1ad00 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  this connection 
1ad10 77 72 69 74 65 73 20 0a 20 20 20 20 20 20 20 20  writes .        
1ad20 2a 2a 20 61 6e 79 74 68 69 6e 67 20 65 6c 73 65  ** anything else
1ad30 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
1ad40 66 69 6c 65 20 28 6f 72 20 63 6f 6d 6d 69 74 73  file (or commits
1ad50 2f 72 6f 6c 6c 73 20 62 61 63 6b 20 69 74 73 20  /rolls back its 
1ad60 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
1ad70 73 61 63 74 69 6f 6e 29 2c 20 74 68 65 6e 20 53  saction), then S
1ad80 51 4c 69 74 65 20 6d 61 79 20 62 65 63 6f 6d 65  QLite may become
1ad90 20 63 6f 6e 66 75 73 65 64 20 77 68 65 6e 20 64   confused when d
1ada0 6f 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20  oing the .      
1adb0 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
1adc0 20 72 6f 6c 6c 62 61 63 6b 20 66 6f 6c 6c 6f 77   rollback follow
1add0 69 6e 67 20 72 65 63 6f 76 65 72 79 2e 20 49 74  ing recovery. It
1ade0 20 6d 61 79 20 72 6f 6c 6c 20 62 61 63 6b 20 61   may roll back a
1adf0 6c 6c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 66  ll.        ** of
1ae00 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f 6e   this connection
1ae10 73 20 64 61 74 61 2c 20 74 68 65 6e 20 70 72 6f  s data, then pro
1ae20 63 65 65 64 20 74 6f 20 72 6f 6c 6c 69 6e 67 20  ceed to rolling 
1ae30 62 61 63 6b 20 74 68 65 20 6f 6c 64 2c 0a 20 20  back the old,.  
1ae40 20 20 20 20 20 20 2a 2a 20 6f 75 74 2d 6f 66 2d        ** out-of-
1ae50 64 61 74 65 20 64 61 74 61 20 74 68 61 74 20 66  date data that f
1ae60 6f 6c 6c 6f 77 73 20 69 74 2e 20 44 61 74 61 62  ollows it. Datab
1ae70 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a  ase corruption..
1ae80 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1ae90 20 20 20 2a 2a 20 54 6f 20 77 6f 72 6b 20 61 72     ** To work ar
1aea0 6f 75 6e 64 20 74 68 69 73 2c 20 69 66 20 74 68  ound this, if th
1aeb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
1aec0 6f 65 73 20 61 70 70 65 61 72 20 74 6f 20 63 6f  oes appear to co
1aed0 6e 74 61 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ntain.        **
1aee0 20 61 20 76 61 6c 69 64 20 68 65 61 64 65 72 20   a valid header 
1aef0 66 6f 6c 6c 6f 77 69 6e 67 20 50 61 67 65 72 2e  following Pager.
1af00 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 74 68 65 6e  journalOff, then
1af10 20 77 72 69 74 65 20 61 20 30 78 30 30 0a 20 20   write a 0x00.  
1af20 20 20 20 20 20 20 2a 2a 20 62 79 74 65 20 74 6f        ** byte to
1af30 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
1af40 20 74 6f 20 70 72 65 76 65 6e 74 20 69 74 20 66   to prevent it f
1af50 72 6f 6d 20 62 65 69 6e 67 20 72 65 63 6f 67 6e  rom being recogn
1af60 69 7a 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2a  ized..        **
1af70 0a 20 20 20 20 20 20 20 20 2a 2a 20 56 61 72 69  .        ** Vari
1af80 61 62 6c 65 20 69 4e 65 78 74 48 64 72 4f 66 66  able iNextHdrOff
1af90 73 65 74 20 69 73 20 73 65 74 20 74 6f 20 74 68  set is set to th
1afa0 65 20 6f 66 66 73 65 74 20 61 74 20 77 68 69 63  e offset at whic
1afb0 68 20 74 68 69 73 0a 20 20 20 20 20 20 20 20 2a  h this.        *
1afc0 2a 20 70 72 6f 62 6c 65 6d 61 74 69 63 20 68 65  * problematic he
1afd0 61 64 65 72 20 77 69 6c 6c 20 6f 63 63 75 72 2c  ader will occur,
1afe0 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 20 61   if it exists. a
1aff0 4d 61 67 69 63 20 69 73 20 75 73 65 64 20 0a 20  Magic is used . 
1b000 20 20 20 20 20 20 20 2a 2a 20 61 73 20 61 20 74         ** as a t
1b010 65 6d 70 6f 72 61 72 79 20 62 75 66 66 65 72 20  emporary buffer 
1b020 74 6f 20 69 6e 73 70 65 63 74 20 74 68 65 20 66  to inspect the f
1b030 69 72 73 74 20 63 6f 75 70 6c 65 20 6f 66 20 62  irst couple of b
1b040 79 74 65 73 20 6f 66 0a 20 20 20 20 20 20 20 20  ytes of.        
1b050 2a 2a 20 74 68 65 20 70 6f 74 65 6e 74 69 61 6c  ** the potential
1b060 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e   journal header.
1b070 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1b080 20 20 20 20 69 36 34 20 69 4e 65 78 74 48 64 72      i64 iNextHdr
1b090 4f 66 66 73 65 74 20 3d 20 6a 6f 75 72 6e 61 6c  Offset = journal
1b0a0 48 64 72 4f 66 66 73 65 74 28 70 50 61 67 65 72  HdrOffset(pPager
1b0b0 29 3b 0a 20 20 20 20 20 20 20 20 75 38 20 61 4d  );.        u8 aM
1b0c0 61 67 69 63 5b 38 5d 3b 0a 20 20 20 20 20 20 20  agic[8];.       
1b0d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
1b0e0 65 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ead(pPager->jfd,
1b0f0 20 61 4d 61 67 69 63 2c 20 38 2c 20 69 4e 65 78   aMagic, 8, iNex
1b100 74 48 64 72 4f 66 66 73 65 74 29 3b 0a 20 20 20  tHdrOffset);.   
1b110 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
1b120 49 54 45 5f 4f 4b 20 26 26 20 30 3d 3d 6d 65 6d  ITE_OK && 0==mem
1b130 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
1b140 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 7b  rnalMagic, 8) ){
1b150 0a 20 20 20 20 20 20 20 20 20 20 73 74 61 74 69  .          stati
1b160 63 20 63 6f 6e 73 74 20 75 38 20 7a 65 72 6f 62  c const u8 zerob
1b170 79 74 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  yte = 0;.       
1b180 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1b190 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
1b1a0 66 64 2c 20 26 7a 65 72 6f 62 79 74 65 2c 20 31  fd, &zerobyte, 1
1b1b0 2c 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74  , iNextHdrOffset
1b1c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1b1d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b1e0 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1b1f0 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54  LITE_IOERR_SHORT
1b200 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20 20  _READ ){.       
1b210 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b220 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1b230 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
1b240 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
1b250 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
1b260 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
1b270 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
1b280 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
1b290 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
1b2a0 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
1b2b0 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
1b2c0 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
1b2d0 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
1b2e0 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
1b2f0 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
1b300 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
1b310 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
1b320 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20   for rollback.. 
1b330 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1b340 20 20 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74    ** This is not
1b350 20 72 65 71 75 69 72 65 64 20 69 66 20 74 68 65   required if the
1b360 20 70 65 72 73 69 73 74 65 6e 74 20 6d 65 64 69   persistent medi
1b370 61 20 73 75 70 70 6f 72 74 73 20 74 68 65 0a 20  a supports the. 
1b380 20 20 20 20 20 20 20 2a 2a 20 53 41 46 45 5f 41         ** SAFE_A
1b390 50 50 45 4e 44 20 70 72 6f 70 65 72 74 79 2e 20  PPEND property. 
1b3a0 42 65 63 61 75 73 65 20 69 6e 20 74 68 69 73 20  Because in this 
1b3b0 63 61 73 65 20 69 74 20 69 73 20 6e 6f 74 20 70  case it is not p
1b3c0 6f 73 73 69 62 6c 65 20 0a 20 20 20 20 20 20 20  ossible .       
1b3d0 20 2a 2a 20 66 6f 72 20 67 61 72 62 61 67 65 20   ** for garbage 
1b3e0 64 61 74 61 20 74 6f 20 62 65 20 61 70 70 65 6e  data to be appen
1b3f0 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2c  ded to the file,
1b400 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
1b410 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20 70 6f          ** is po
1b420 70 75 6c 61 74 65 64 20 77 69 74 68 20 30 78 46  pulated with 0xF
1b430 46 46 46 46 46 46 46 20 77 68 65 6e 20 74 68 65  FFFFFFF when the
1b440 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
1b450 69 73 20 77 72 69 74 74 65 6e 0a 20 20 20 20 20  is written.     
1b460 20 20 20 2a 2a 20 61 6e 64 20 6e 65 76 65 72 20     ** and never 
1b470 6e 65 65 64 73 20 74 6f 20 62 65 20 75 70 64 61  needs to be upda
1b480 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
1b490 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1b4a0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
1b4b0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1b4c0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
1b4d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
1b4e0 47 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20  GERTRACE(("SYNC 
1b4f0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
1b500 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1b510 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  )));.          I
1b520 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
1b530 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1b540 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1b550 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
1b560 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
1b570 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
1b580 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1b590 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b5a0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d  rn rc;.        }
1b5b0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
1b5c0 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
1b5d0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 69  %d\n", pPager, i
1b5e0 4e 52 65 63 4f 66 66 73 65 74 2c 20 34 29 29 3b  NRecOffset, 4));
1b5f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
1b600 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1b610 2d 3e 6a 66 64 2c 20 69 4e 52 65 63 4f 66 66 73  ->jfd, iNRecOffs
1b620 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  et, pPager->nRec
1b630 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1b640 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1b650 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1b660 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28  }.      if( 0==(
1b670 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1b680 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b 0a  _SEQUENTIAL) ){.
1b690 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
1b6a0 43 45 28 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61  CE(("SYNC journa
1b6b0 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47 45  l of %d\n", PAGE
1b6c0 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
1b6d0 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1b6e0 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
1b6f0 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
1b700 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
1b710 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
1b720 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1b730 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
1b740 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
1b750 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
1b760 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
1b770 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
1b780 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
1b790 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1b7a0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
1b7b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
1b7c0 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
1b7d0 66 69 6c 65 20 77 61 73 20 6a 75 73 74 20 73 75  file was just su
1b7e0 63 63 65 73 73 66 75 6c 6c 79 20 73 79 6e 63 65  ccessfully synce
1b7f0 64 2e 20 53 65 74 20 50 61 67 65 72 2e 6e 65 65  d. Set Pager.nee
1b800 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20 74 6f  dSync .    ** to
1b810 20 7a 65 72 6f 20 61 6e 64 20 63 6c 65 61 72 20   zero and clear 
1b820 74 68 65 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  the PGHDR_NEED_S
1b830 59 4e 43 20 66 6c 61 67 20 6f 6e 20 61 6c 6c 20  YNC flag on all 
1b840 70 61 67 65 73 73 2e 0a 20 20 20 20 2a 2f 0a 20  pagess..    */. 
1b850 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
1b860 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
1b870 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
1b880 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c  ted = 1;.    sql
1b890 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 53  ite3PcacheClearS
1b8a0 79 6e 63 46 6c 61 67 73 28 70 50 61 67 65 72 2d  yncFlags(pPager-
1b8b0 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 7d 0a 0a  >pPCache);.  }..
1b8c0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1b8d0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  OK;.}../*.** The
1b8e0 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 68 65   argument is the
1b8f0 20 66 69 72 73 74 20 69 6e 20 61 20 6c 69 6e 6b   first in a link
1b900 65 64 20 6c 69 73 74 20 6f 66 20 64 69 72 74 79  ed list of dirty
1b910 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
1b920 0a 2a 2a 20 62 79 20 74 68 65 20 50 67 48 64 72  .** by the PgHdr
1b930 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 2e  .pDirty pointer.
1b940 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 77   This function w
1b950 72 69 74 65 73 20 65 61 63 68 20 6f 6e 65 20 6f  rites each one o
1b960 66 20 74 68 65 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f  f the.** in-memo
1b970 72 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ry pages in the 
1b980 6c 69 73 74 20 74 6f 20 74 68 65 20 64 61 74 61  list to the data
1b990 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 61  base file. The a
1b9a0 72 67 75 6d 65 6e 74 20 6d 61 79 0a 2a 2a 20 62  rgument may.** b
1b9b0 65 20 4e 55 4c 4c 2c 20 72 65 70 72 65 73 65 6e  e NULL, represen
1b9c0 74 69 6e 67 20 61 6e 20 65 6d 70 74 79 20 6c 69  ting an empty li
1b9d0 73 74 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  st. In this case
1b9e0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
1b9f0 73 0a 2a 2a 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  s.** a no-op..**
1ba00 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 6d 75  .** The pager mu
1ba10 73 74 20 68 6f 6c 64 20 61 74 20 6c 65 61 73 74  st hold at least
1ba20 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
1ba30 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
1ba40 69 6f 6e 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64  ion.** is called
1ba50 2e 20 42 65 66 6f 72 65 20 77 72 69 74 69 6e 67  . Before writing
1ba60 20 61 6e 79 74 68 69 6e 67 20 74 6f 20 74 68 65   anything to the
1ba70 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
1ba80 74 68 69 73 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20  this lock.** is 
1ba90 75 70 67 72 61 64 65 64 20 74 6f 20 61 6e 20 45  upgraded to an E
1baa0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
1bab0 66 20 74 68 65 20 6c 6f 63 6b 20 63 61 6e 6e 6f  f the lock canno
1bac0 74 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 0a 2a  t be obtained,.*
1bad0 2a 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73  * SQLITE_BUSY is
1bae0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 6e 6f   returned and no
1baf0 20 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e   data is written
1bb00 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1bb10 20 66 69 6c 65 2e 0a 2a 2a 20 0a 2a 2a 20 49 66   file..** .** If
1bb20 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61 20   the pager is a 
1bb30 74 65 6d 70 2d 66 69 6c 65 20 70 61 67 65 72 20  temp-file pager 
1bb40 61 6e 64 20 74 68 65 20 61 63 74 75 61 6c 20 66  and the actual f
1bb50 69 6c 65 2d 73 79 73 74 65 6d 20 66 69 6c 65 0a  ile-system file.
1bb60 2a 2a 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70  ** is not yet op
1bb70 65 6e 2c 20 69 74 20 69 73 20 63 72 65 61 74 65  en, it is create
1bb80 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 62 65 66  d and opened bef
1bb90 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73 20  ore any data is 
1bba0 0a 2a 2a 20 77 72 69 74 74 65 6e 20 6f 75 74 2e  .** written out.
1bbb0 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65 20 74 68 65 20  .**.** Once the 
1bbc0 6c 6f 63 6b 20 68 61 73 20 62 65 65 6e 20 75 70  lock has been up
1bbd0 67 72 61 64 65 64 20 61 6e 64 2c 20 69 66 20 6e  graded and, if n
1bbe0 65 63 65 73 73 61 72 79 2c 20 74 68 65 20 66 69  ecessary, the fi
1bbf0 6c 65 20 6f 70 65 6e 65 64 2c 0a 2a 2a 20 74 68  le opened,.** th
1bc00 65 20 70 61 67 65 73 20 61 72 65 20 77 72 69 74  e pages are writ
1bc10 74 65 6e 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ten out to the d
1bc20 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20  atabase file in 
1bc30 6c 69 73 74 20 6f 72 64 65 72 2e 20 57 72 69 74  list order. Writ
1bc40 69 6e 67 0a 2a 2a 20 61 20 70 61 67 65 20 69 73  ing.** a page is
1bc50 20 73 6b 69 70 70 65 64 20 69 66 20 69 74 20 6d   skipped if it m
1bc60 65 65 74 73 20 65 69 74 68 65 72 20 6f 66 20 74  eets either of t
1bc70 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 72 69  he following cri
1bc80 74 65 72 69 61 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  teria:.**.**   *
1bc90 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
1bca0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
1bcb0 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 6f   Pager.dbSize, o
1bcc0 72 0a 2a 2a 20 20 20 2a 20 54 68 65 20 50 47 48  r.**   * The PGH
1bcd0 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
1bce0 61 67 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  ag is set on the
1bcf0 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
1bd00 77 72 69 74 69 6e 67 20 6f 75 74 20 61 20 70 61  writing out a pa
1bd10 67 65 20 63 61 75 73 65 73 20 74 68 65 20 64 61  ge causes the da
1bd20 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67  tabase file to g
1bd30 72 6f 77 2c 20 50 61 67 65 72 2e 64 62 46 69 6c  row, Pager.dbFil
1bd40 65 53 69 7a 65 0a 2a 2a 20 69 73 20 75 70 64 61  eSize.** is upda
1bd50 74 65 64 20 61 63 63 6f 72 64 69 6e 67 6c 79 2e  ted accordingly.
1bd60 20 49 66 20 70 61 67 65 20 31 20 69 73 20 77 72   If page 1 is wr
1bd70 69 74 74 65 6e 20 6f 75 74 2c 20 74 68 65 6e 20  itten out, then 
1bd80 74 68 65 20 76 61 6c 75 65 20 63 61 63 68 65 64  the value cached
1bd90 0a 2a 2a 20 69 6e 20 50 61 67 65 72 2e 64 62 46  .** in Pager.dbF
1bda0 69 6c 65 56 65 72 73 5b 5d 20 69 73 20 75 70 64  ileVers[] is upd
1bdb0 61 74 65 64 20 74 6f 20 6d 61 74 63 68 20 74 68  ated to match th
1bdc0 65 20 6e 65 77 20 76 61 6c 75 65 20 73 74 6f 72  e new value stor
1bdd0 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ed in.** the dat
1bde0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  abase file..**.*
1bdf0 2a 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20  * If everything 
1be00 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  is successful, S
1be10 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
1be20 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1be30 72 72 6f 72 20 0a 2a 2a 20 6f 63 63 75 72 73 2c  rror .** occurs,
1be40 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
1be50 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  e is returned. O
1be60 72 2c 20 69 66 20 74 68 65 20 45 58 43 4c 55 53  r, if the EXCLUS
1be70 49 56 45 20 6c 6f 63 6b 20 63 61 6e 6e 6f 74 0a  IVE lock cannot.
1be80 2a 2a 20 62 65 20 6f 62 74 61 69 6e 65 64 2c 20  ** be obtained, 
1be90 53 51 4c 49 54 45 5f 42 55 53 59 20 69 73 20 72  SQLITE_BUSY is r
1bea0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
1beb0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69  ic int pager_wri
1bec0 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  te_pagelist(PgHd
1bed0 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67  r *pList){.  Pag
1bee0 65 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20  er *pPager;     
1bef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf00 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
1bf10 74 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  t */.  int rc;  
1bf20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
1bf40 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20  eturn code */.. 
1bf50 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
1bf60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1bf70 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
1bf80 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
1bf90 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
1bfa0 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
1bfb0 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
1bfc0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
1bfd0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
1bfe0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
1bff0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
1c000 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
1c010 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
1c020 0a 20 20 2a 2a 20 63 61 6c 6c 20 69 73 20 61 20  .  ** call is a 
1c030 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  no-op..  **.  **
1c040 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b   Moving the lock
1c050 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74   from RESERVED t
1c060 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75  o EXCLUSIVE actu
1c070 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f  ally involves go
1c080 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68  ing.  ** through
1c090 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65   an intermediate
1c0a0 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20   state PENDING. 
1c0b0 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b    A PENDING lock
1c0c0 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20   prevents new.  
1c0d0 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20  ** readers from 
1c0e0 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65  attaching to the
1c0f0 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73   database but is
1c100 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f   unsufficient fo
1c110 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69  r us to.  ** wri
1c120 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66  te.  The idea of
1c130 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   a PENDING lock 
1c140 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65  is to prevent ne
1c150 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20  w readers from. 
1c160 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68   ** coming in wh
1c170 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20  ile we wait for 
1c180 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73  existing readers
1c190 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a   to clear..  **.
1c1a0 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70    ** While the p
1c1b0 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52  ager is in the R
1c1c0 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74  ESERVED state, t
1c1d0 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
1c1e0 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69  base file.  ** i
1c1f0 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20  s unchanged and 
1c200 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20  we can rollback 
1c210 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74  without having t
1c220 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20  o playback the. 
1c230 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f   ** journal into
1c240 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
1c250 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e  tabase file.  On
1c260 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e  ce we transition
1c270 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49   to.  ** EXCLUSI
1c280 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65  VE, it means the
1c290 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68   database file h
1c2a0 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20  as been changed 
1c2b0 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b  and any rollback
1c2c0 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69  .  ** will requi
1c2d0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61  re a journal pla
1c2e0 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 61 73  yback..  */.  as
1c2f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1c300 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1c310 56 45 44 20 29 3b 0a 20 20 72 63 20 3d 20 70 61  VED );.  rc = pa
1c320 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
1c330 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
1c340 56 45 5f 4c 4f 43 4b 29 3b 0a 0a 20 20 2f 2a 20  VE_LOCK);..  /* 
1c350 49 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 61  If the file is a
1c360 20 74 65 6d 70 2d 66 69 6c 65 20 68 61 73 20 6e   temp-file has n
1c370 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
1c380 65 64 2c 20 6f 70 65 6e 20 69 74 20 6e 6f 77 2e  ed, open it now.
1c390 20 49 74 0a 20 20 2a 2a 20 69 73 20 6e 6f 74 20   It.  ** is not 
1c3a0 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 72 63 20  possible for rc 
1c3b0 74 6f 20 62 65 20 6f 74 68 65 72 20 74 68 61 6e  to be other than
1c3c0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 74 68   SQLITE_OK if th
1c3d0 69 73 20 62 72 61 6e 63 68 0a 20 20 2a 2a 20 69  is branch.  ** i
1c3e0 73 20 74 61 6b 65 6e 2c 20 61 73 20 70 61 67 65  s taken, as page
1c3f0 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 29  r_wait_on_lock()
1c400 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72 20   is a no-op for 
1c410 74 65 6d 70 2d 66 69 6c 65 73 2e 0a 20 20 2a 2f  temp-files..  */
1c420 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e 28 70  .  if( !isOpen(p
1c430 50 61 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20  Pager->fd) ){.  
1c440 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1c450 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 72 63  ->tempFile && rc
1c460 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  ==SQLITE_OK );. 
1c470 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70 65     rc = pagerOpe
1c480 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70 50  ntemp(pPager, pP
1c490 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72  ager->fd, pPager
1c4a0 2d 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 7d  ->vfsFlags);.  }
1c4b0 0a 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ..  while( rc==S
1c4c0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 4c 69 73  QLITE_OK && pLis
1c4d0 74 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 70 67  t ){.    Pgno pg
1c4e0 6e 6f 20 3d 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  no = pList->pgno
1c4f0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
1c500 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
1c510 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
1c520 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
1c530 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
1c540 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
1c550 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
1c560 61 6e 73 20 73 71 6c 69 74 65 33 50 61 67 65 72  ans sqlite3Pager
1c570 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28 29 20  TruncateImage() 
1c580 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20  was called to.  
1c590 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69    ** make the fi
1c5a0 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73  le smaller (pres
1c5b0 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76  umably by auto-v
1c5c0 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20  acuum code). Do 
1c5d0 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a  not write.    **
1c5e0 20 61 6e 79 20 73 75 63 68 20 70 61 67 65 73 20   any such pages 
1c5f0 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  to the file..   
1c600 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 6c 73 6f 2c   **.    ** Also,
1c610 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20 6f 75   do not write ou
1c620 74 20 61 6e 79 20 70 61 67 65 20 74 68 61 74 20  t any page that 
1c630 68 61 73 20 74 68 65 20 50 47 48 44 52 5f 44 4f  has the PGHDR_DO
1c640 4e 54 5f 57 52 49 54 45 20 66 6c 61 67 0a 20 20  NT_WRITE flag.  
1c650 20 20 2a 2a 20 73 65 74 20 28 73 65 74 20 62 79    ** set (set by
1c660 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
1c670 74 57 72 69 74 65 28 29 29 2e 0a 20 20 20 20 2a  tWrite())..    *
1c680 2f 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d  /.    if( pgno<=
1c690 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 26  pPager->dbSize &
1c6a0 26 20 30 3d 3d 28 70 4c 69 73 74 2d 3e 66 6c 61  & 0==(pList->fla
1c6b0 67 73 26 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52  gs&PGHDR_DONT_WR
1c6c0 49 54 45 29 20 29 7b 0a 20 20 20 20 20 20 69 36  ITE) ){.      i6
1c6d0 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
1c6e0 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
1c6f0 3e 70 61 67 65 53 69 7a 65 3b 20 20 20 2f 2a 20  >pageSize;   /* 
1c700 4f 66 66 73 65 74 20 74 6f 20 77 72 69 74 65 20  Offset to write 
1c710 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 70  */.      char *p
1c720 44 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20  Data;           
1c730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c740 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 20          /* Data 
1c750 74 6f 20 77 72 69 74 65 20 2a 2f 20 20 20 20 0a  to write */    .
1c760 0a 20 20 20 20 20 20 2f 2a 20 45 6e 63 6f 64 65  .      /* Encode
1c770 20 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   the database */
1c780 0a 20 20 20 20 20 20 43 4f 44 45 43 32 28 70 50  .      CODEC2(pP
1c790 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 44 61  ager, pList->pDa
1c7a0 74 61 2c 20 70 67 6e 6f 2c 20 36 2c 20 72 65 74  ta, pgno, 6, ret
1c7b0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
1c7c0 2c 20 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20  , pData);..     
1c7d0 20 2f 2a 20 57 72 69 74 65 20 6f 75 74 20 74 68   /* Write out th
1c7e0 65 20 70 61 67 65 20 64 61 74 61 2e 20 2a 2f 0a  e page data. */.
1c7f0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1c800 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
1c810 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50 61  ->fd, pData, pPa
1c820 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f  ger->pageSize, o
1c830 66 66 73 65 74 29 3b 0a 0a 20 20 20 20 20 20 2f  ffset);..      /
1c840 2a 20 49 66 20 70 61 67 65 20 31 20 77 61 73 20  * If page 1 was 
1c850 6a 75 73 74 20 77 72 69 74 74 65 6e 2c 20 75 70  just written, up
1c860 64 61 74 65 20 50 61 67 65 72 2e 64 62 46 69 6c  date Pager.dbFil
1c870 65 56 65 72 73 20 74 6f 20 6d 61 74 63 68 0a 20  eVers to match. 
1c880 20 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75       ** the valu
1c890 65 20 6e 6f 77 20 73 74 6f 72 65 64 20 69 6e 20  e now stored in 
1c8a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c8b0 65 2e 20 49 66 20 77 72 69 74 69 6e 67 20 74 68  e. If writing th
1c8c0 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 70 61 67  is .      ** pag
1c8d0 65 20 63 61 75 73 65 64 20 74 68 65 20 64 61 74  e caused the dat
1c8e0 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 67 72  abase file to gr
1c8f0 6f 77 2c 20 75 70 64 61 74 65 20 64 62 46 69 6c  ow, update dbFil
1c900 65 53 69 7a 65 2e 20 0a 20 20 20 20 20 20 2a 2f  eSize. .      */
1c910 0a 20 20 20 20 20 20 69 66 28 20 70 67 6e 6f 3d  .      if( pgno=
1c920 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  =1 ){.        me
1c930 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
1c940 46 69 6c 65 56 65 72 73 2c 20 26 70 44 61 74 61  FileVers, &pData
1c950 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28 70 50 61  [24], sizeof(pPa
1c960 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1c970 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c980 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
1c990 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a  ->dbFileSize ){.
1c9a0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c9b0 64 62 46 69 6c 65 53 69 7a 65 20 3d 20 70 67 6e  dbFileSize = pgn
1c9c0 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  o;.      }..    
1c9d0 20 20 2f 2a 20 55 70 64 61 74 65 20 61 6e 79 20    /* Update any 
1c9e0 62 61 63 6b 75 70 20 6f 62 6a 65 63 74 73 20 63  backup objects c
1c9f0 6f 70 79 69 6e 67 20 74 68 65 20 63 6f 6e 74 65  opying the conte
1ca00 6e 74 73 20 6f 66 20 74 68 69 73 20 70 61 67 65  nts of this page
1ca10 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  r. */.      sqli
1ca20 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65 28  te3BackupUpdate(
1ca30 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 2c  pPager->pBackup,
1ca40 20 70 67 6e 6f 2c 20 28 75 38 2a 29 70 4c 69 73   pgno, (u8*)pLis
1ca50 74 2d 3e 70 44 61 74 61 29 3b 0a 0a 20 20 20 20  t->pData);..    
1ca60 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 53    PAGERTRACE(("S
1ca70 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 20  TORE %d page %d 
1ca80 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1cab0 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70  ), pgno, pager_p
1cac0 61 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 29  agehash(pList)))
1cad0 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
1cae0 28 22 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22  ("PGOUT %p %d\n"
1caf0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1cb00 3b 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e  ;.      PAGER_IN
1cb10 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
1cb20 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b  _writedb_count);
1cb30 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
1cb40 52 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  R(pPager->nWrite
1cb50 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1cb60 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28      PAGERTRACE((
1cb70 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
1cb80 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1cb90 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b  pPager), pgno));
1cba0 0a 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51  .    }.#ifdef SQ
1cbb0 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
1cbc0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65  .    pList->page
1cbd0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1cbe0 65 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65  ehash(pList);.#e
1cbf0 6e 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d  ndif.    pList =
1cc00 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a   pList->pDirty;.
1cc10 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
1cc20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e  ;.}../*.** Appen
1cc30 64 20 61 20 72 65 63 6f 72 64 20 6f 66 20 74 68  d a record of th
1cc40 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 20  e current state 
1cc50 6f 66 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  of page pPg to t
1cc60 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20  he sub-journal. 
1cc70 0a 2a 2a 20 49 74 20 69 73 20 74 68 65 20 63 61  .** It is the ca
1cc80 6c 6c 65 72 73 20 72 65 73 70 6f 6e 73 69 62 69  llers responsibi
1cc90 6c 69 74 79 20 74 6f 20 75 73 65 20 73 75 62 6a  lity to use subj
1cca0 52 65 71 75 69 72 65 73 50 61 67 65 28 29 20 74  RequiresPage() t
1ccb0 6f 20 63 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74  o check .** that
1ccc0 20 69 74 20 69 73 20 72 65 61 6c 6c 79 20 72 65   it is really re
1ccd0 71 75 69 72 65 64 20 62 65 66 6f 72 65 20 63 61  quired before ca
1cce0 6c 6c 69 6e 67 20 74 68 69 73 20 66 75 6e 63 74  lling this funct
1ccf0 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ion..**.** If su
1cd00 63 63 65 73 73 66 75 6c 2c 20 73 65 74 20 74 68  ccessful, set th
1cd10 65 20 62 69 74 20 63 6f 72 72 65 73 70 6f 6e 64  e bit correspond
1cd20 69 6e 67 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f  ing to pPg->pgno
1cd30 20 69 6e 20 74 68 65 20 62 69 74 76 65 63 73 0a   in the bitvecs.
1cd40 2a 2a 20 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20  ** for all open 
1cd50 73 61 76 65 70 6f 69 6e 74 73 20 62 65 66 6f 72  savepoints befor
1cd60 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a  e returning..**.
1cd70 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
1cd80 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
1cd90 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1cda0 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
1cdb0 61 6e 20 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63  an IO.** error c
1cdc0 6f 64 65 20 69 66 20 74 68 65 20 61 74 74 65 6d  ode if the attem
1cdd0 70 74 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  pt to write to t
1cde0 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66  he sub-journal f
1cdf0 61 69 6c 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c  ails, or .** SQL
1ce00 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d  ITE_NOMEM if a m
1ce10 61 6c 6c 6f 63 20 66 61 69 6c 73 20 77 68 69 6c  alloc fails whil
1ce20 65 20 73 65 74 74 69 6e 67 20 61 20 62 69 74 20  e setting a bit 
1ce30 69 6e 20 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a  in a savepoint.*
1ce40 2a 20 62 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61  * bitvec..*/.sta
1ce50 74 69 63 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e  tic int subjourn
1ce60 61 6c 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  alPage(PgHdr *pP
1ce70 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ce80 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65  QLITE_OK;.  Page
1ce90 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
1cea0 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20 69  >pPager;.  if( i
1ceb0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
1cec0 66 64 29 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  fd) ){.    void 
1ced0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
1cee0 61 74 61 3b 0a 20 20 20 20 69 36 34 20 6f 66 66  ata;.    i64 off
1cef0 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53  set = pPager->nS
1cf00 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72 2d  ubRec*(4+pPager-
1cf10 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1cf20 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
1cf30 20 20 20 43 4f 44 45 43 32 28 70 50 61 67 65 72     CODEC2(pPager
1cf40 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1cf50 6e 6f 2c 20 37 2c 20 72 65 74 75 72 6e 20 53 51  no, 7, return SQ
1cf60 4c 49 54 45 5f 4e 4f 4d 45 4d 2c 20 70 44 61 74  LITE_NOMEM, pDat
1cf70 61 32 29 3b 0a 20 20 20 20 50 41 47 45 52 54 52  a2);.    PAGERTR
1cf80 41 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE(("STMT-JOURN
1cf90 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
1cfa0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
1cfb0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  ), pPg->pgno));.
1cfc0 20 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70    .    assert( p
1cfd0 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67  ageInJournal(pPg
1cfe0 29 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70  ) || pPg->pgno>p
1cff0 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
1d000 65 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72  e );.    rc = wr
1d010 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
1d020 2d 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20  ->sjfd, offset, 
1d030 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
1d040 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
1d050 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
1d060 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
1d070 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61  Pager->sjfd, pDa
1d080 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
1d090 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
1d0a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
1d0b0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1d0c0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ){.    pPager->n
1d0d0 53 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73  SubRec++;.    as
1d0e0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53  sert( pPager->nS
1d0f0 61 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20  avepoint>0 );.  
1d100 20 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65    rc = addToSave
1d110 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
1d120 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
1d130 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72  .    testcase( r
1d140 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
1d150 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
1d160 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1d170 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1d180 65 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65  ed by the pcache
1d190 20 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68   layer when it h
1d1a0 61 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a  as reached some.
1d1b0 2a 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c  ** soft memory l
1d1c0 69 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20  imit. The first 
1d1d0 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f  argument is a po
1d1e0 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72  inter to a Pager
1d1f0 20 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74   object.** (cast
1d200 20 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68   as a void*). Th
1d210 65 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79  e pager is alway
1d220 73 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e  s 'purgeable' (n
1d230 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a  ot an in-memory.
1d240 2a 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68  ** database). Th
1d250 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
1d260 74 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  t is a reference
1d270 20 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20   to a page that 
1d280 69 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79  is .** currently
1d290 20 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e   dirty but has n
1d2a0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65  o outstanding re
1d2b0 66 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61  ferences. The pa
1d2c0 67 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20  ge.** is always 
1d2d0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1d2e0 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74  the Pager object
1d2f0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66   passed as the f
1d300 69 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e  irst .** argumen
1d310 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62  t..**.** The job
1d320 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
1d330 6e 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67  n is to make pPg
1d340 20 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e   clean by writin
1d350 67 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a  g its contents.*
1d360 2a 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  * out to the dat
1d370 61 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70  abase file, if p
1d380 6f 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61  ossible. This ma
1d390 79 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e  y involve syncin
1d3a0 67 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  g the.** journal
1d3b0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66   file. .**.** If
1d3c0 20 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c   successful, sql
1d3d0 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c  ite3PcacheMakeCl
1d3e0 65 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ean() is called 
1d3f0 6f 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a  on the page and.
1d400 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  ** SQLITE_OK ret
1d410 75 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20  urned. If an IO 
1d420 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69  error occurs whi
1d430 6c 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b  le trying to mak
1d440 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c  e the.** page cl
1d450 65 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f  ean, the IO erro
1d460 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1d470 65 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20  ed. If the page 
1d480 63 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64  cannot be.** mad
1d490 65 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65  e clean for some
1d4a0 20 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62   other reason, b
1d4b0 75 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75  ut no error occu
1d4c0 72 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f  rs, then SQLITE_
1d4d0 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65  OK.** is returne
1d4e0 64 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63  d by sqlite3Pcac
1d4f0 68 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73  heMakeClean() is
1d500 20 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a   not called..*/.
1d510 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
1d520 53 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20  Stress(void *p, 
1d530 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
1d540 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28  ager *pPager = (
1d550 50 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74  Pager *)p;.  int
1d560 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d570 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ..  assert( pPg-
1d580 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
1d590 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1d5a0 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
1d5b0 52 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65  RTY );..  /* The
1d5c0 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20   doNotSync flag 
1d5d0 69 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71  is set by the sq
1d5e0 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1d5f0 29 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65  ) function while
1d600 20 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72   it.  ** is jour
1d610 6e 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66  nalling a set of
1d620 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74   two or more dat
1d630 61 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74  abase pages that
1d640 20 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a   are stored.  **
1d650 20 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73   on the same dis
1d660 6b 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e  k sector. Syncin
1d670 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  g the journal is
1d680 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69   not allowed whi
1d690 6c 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20  le.  ** this is 
1d6a0 68 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20  happening as it 
1d6b0 69 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  is important tha
1d6c0 74 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  t all members of
1d6d0 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74   such a.  ** set
1d6e0 20 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79   of pages are sy
1d6f0 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67  nced to disk tog
1d700 65 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68  ether. So, if th
1d710 65 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63  e page this func
1d720 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79  tion.  ** is try
1d730 69 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61  ing to make clea
1d740 6e 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61  n will require a
1d750 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e   journal sync an
1d760 64 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a  d the doNotSync.
1d770 20 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74    ** flag is set
1d780 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74  , return without
1d790 20 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e   doing anything.
1d7a0 20 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65   The pcache laye
1d7b0 72 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74  r will.  ** just
1d7c0 20 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61   have to go ahea
1d7d0 64 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61  d and allocate a
1d7e0 20 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72   new page buffer
1d7f0 20 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a   instead of.  **
1d800 20 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20   reusing pPg..  
1d810 2a 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c  **.  ** Similarl
1d820 79 2c 20 69 66 20 74 68 65 20 70 61 67 65 72 20  y, if the pager 
1d830 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
1d840 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74  red the error st
1d850 61 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a  ate, do not.  **
1d860 20 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68   try to write th
1d870 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50  e contents of pP
1d880 67 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a  g to disk..  */.
1d890 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1d8a0 72 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72  rCode || (pPager
1d8b0 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70  ->doNotSync && p
1d8c0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
1d8d0 4e 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a 20 20  NEED_SYNC) ){.  
1d8e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1d8f0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79  OK;.  }..  /* Sy
1d900 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
1d910 69 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e  ile if required.
1d920 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66   */.  if( pPg->f
1d930 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
1d940 53 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d  SYNC ){.    rc =
1d950 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1d960 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
1d970 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
1d980 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1d990 26 26 20 0a 20 20 20 20 20 20 21 28 70 50 61 67  && .      !(pPag
1d9a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
1d9b0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
1d9c0 44 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20  DE_MEMORY) &&.  
1d9d0 20 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44      !(sqlite3OsD
1d9e0 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
1d9f0 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
1da00 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41  &SQLITE_IOCAP_SA
1da10 46 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29  FE_APPEND).    )
1da20 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1da30 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
1da40 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
1da50 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
1da60 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
1da70 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1da80 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73   of this page is
1da90 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65   larger than the
1daa0 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1dab0 0a 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61  .  ** the databa
1dac0 73 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79  se image, it may
1dad0 20 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74   need to be writ
1dae0 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a  ten to the sub-j
1daf0 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69  ournal..  ** Thi
1db00 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
1db10 20 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77   call to pager_w
1db20 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20  rite_pagelist() 
1db30 62 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20  below will not. 
1db40 20 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69   ** actually wri
1db50 74 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66  te data to the f
1db60 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  ile in this case
1db70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73  ..  **.  ** Cons
1db80 69 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ider the followi
1db90 6e 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65  ng sequence of e
1dba0 76 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  vents:.  **.  **
1dbb0 20 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20     BEGIN;.  **  
1dbc0 20 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65     <journal page
1dbd0 20 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f   X>.  **     <mo
1dbe0 64 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a  dify page X>.  *
1dbf0 2a 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20  *     SAVEPOINT 
1dc00 73 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c  sp;.  **       <
1dc10 73 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20  shrink database 
1dc20 66 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e  file to Y pages>
1dc30 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65  .  **       page
1dc40 72 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a  rStress(page X).
1dc50 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43    **     ROLLBAC
1dc60 4b 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20  K TO sp;.  **.  
1dc70 2a 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65  ** If (X>Y), the
1dc80 6e 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65  n when pagerStre
1dc90 73 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67  ss is called pag
1dca0 65 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  e X will not be 
1dcb0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74  written.  ** out
1dcc0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1dcd0 20 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20   file, but will 
1dce0 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
1dcf0 74 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c  the cache. Then,
1dd00 0a 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20  .  ** following 
1dd10 74 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  the "ROLLBACK TO
1dd20 20 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20   sp" statement, 
1dd30 72 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77  reading page X w
1dd40 69 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61  ill read.  ** da
1dd50 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61  ta from the data
1dd60 62 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20  base file. This 
1dd70 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79  will be the copy
1dd80 20 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74   of page X as it
1dd90 0a 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74  .  ** was when t
1dda0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  he transaction s
1ddb0 74 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69  tarted, not as i
1ddc0 74 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45  t was when "SAVE
1ddd0 50 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77  POINT sp".  ** w
1dde0 61 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a  as executed..  *
1ddf0 2a 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74  *.  ** The solut
1de00 69 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20  ion is to write 
1de10 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61  the current data
1de20 20 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f   for page X into
1de30 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a   the .  ** sub-j
1de40 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20  ournal file now 
1de50 28 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c  (if it is not al
1de60 72 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f  ready there), so
1de70 20 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20   that it will.  
1de80 2a 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74  ** be restored t
1de90 6f 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61  o its current va
1dea0 6c 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f  lue when the "RO
1deb0 4c 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73  LLBACK TO sp" is
1dec0 20 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e   .  ** executed.
1ded0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1dee0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67  SQLITE_OK && pPg
1def0 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64  ->pgno>pPager->d
1df00 62 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71  bSize && subjReq
1df10 75 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29  uiresPage(pPg) )
1df20 7b 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f  {.    rc = subjo
1df30 75 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a  urnalPage(pPg);.
1df40 20 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20    }..  /* Write 
1df50 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1df60 74 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20  the page out to 
1df70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1df80 65 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  e. */.  if( rc==
1df90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1dfa0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
1dfb0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1dfc0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1dfd0 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  pPg);.  }..  /* 
1dfe0 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
1dff0 20 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28   clean. */.  if(
1e000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1e010 7b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  {.    PAGERTRACE
1e020 28 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67  (("STRESS %d pag
1e030 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1e040 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1e050 67 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74  gno));.    sqlit
1e060 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61  e3PcacheMakeClea
1e070 6e 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72  n(pPg);.  }..  r
1e080 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1e090 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d  r(pPager, rc);.}
1e0a0 0a 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  .../*.** Allocat
1e0b0 65 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65  e and initialize
1e0c0 20 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a   a new Pager obj
1e0d0 65 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f  ect and put a po
1e0e0 69 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69  inter to it.** i
1e0f0 6e 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20  n *ppPager. The 
1e100 70 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65  pager should eve
1e110 6e 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64  ntually be freed
1e120 20 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a   by passing it.*
1e130 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  * to sqlite3Page
1e140 72 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  rClose()..**.** 
1e150 54 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72  The zFilename ar
1e160 67 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61  gument is the pa
1e170 74 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  th to the databa
1e180 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e  se file to open.
1e190 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
1e1a0 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
1e1b0 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
1e1c0 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
1e1d0 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
1e1e0 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
1e1f0 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54   to be cached. T
1e200 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61  emporary files a
1e210 72 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  re be deleted.**
1e220 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
1e230 68 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f  hen they are clo
1e240 73 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d  sed. If zFilenam
1e250 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
1e260 74 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66  then .** all inf
1e270 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64  ormation is held
1e280 20 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73   in cache. It is
1e290 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
1e2a0 6f 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73  o disk. .** This
1e2b0 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20   can be used to 
1e2c0 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d  implement an in-
1e2d0 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
1e2e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72  .**.** The nExtr
1e2f0 61 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63  a parameter spec
1e300 69 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72  ifies the number
1e310 20 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61   of bytes of spa
1e320 63 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20  ce allocated.** 
1e330 61 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20  along with each 
1e340 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1e350 54 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76  This space is av
1e360 61 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75  ailable to the u
1e370 73 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73  ser.** via the s
1e380 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
1e390 74 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a  tra() API..**.**
1e3a0 20 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d   The flags argum
1e3b0 65 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73  ent is used to s
1e3c0 70 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65  pecify propertie
1e3d0 73 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68  s that affect th
1e3e0 65 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f  e.** operation o
1e3f0 66 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20  f the pager. It 
1e400 73 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64  should be passed
1e410 20 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f   some bitwise co
1e420 6d 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20  mbination.** of 
1e430 74 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a  the PAGER_OMIT_J
1e440 4f 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52  OURNAL and PAGER
1e450 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61  _NO_READLOCK fla
1e460 67 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66  gs..**.** The vf
1e470 73 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72  sFlags parameter
1e480 20 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f   is a bitmask to
1e490 20 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61   pass to the fla
1e4a0 67 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20  gs parameter.** 
1e4b0 6f 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d  of the xOpen() m
1e4c0 65 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70  ethod of the sup
1e4d0 70 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f  plied VFS when o
1e4e0 70 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a  pening files. .*
1e4f0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65  *.** If the page
1e500 72 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f  r object is allo
1e510 63 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70  cated and the sp
1e520 65 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65  ecified file ope
1e530 6e 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66  ned .** successf
1e540 75 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20  ully, SQLITE_OK 
1e550 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1e560 2a 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20  *ppPager set to 
1e570 70 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20  point to.** the 
1e580 6e 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74  new pager object
1e590 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
1e5a0 63 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69  curs, *ppPager i
1e5b0 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a  s set to NULL.**
1e5c0 20 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20   and error code 
1e5d0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66  returned. This f
1e5e0 75 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75  unction may retu
1e5f0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a  rn SQLITE_NOMEM.
1e600 2a 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  ** (sqlite3Mallo
1e610 63 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61  c() is used to a
1e620 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c  llocate memory),
1e630 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1e640 20 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20   or .** various 
1e650 53 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72  SQLITE_IO_XXX er
1e660 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rors..*/.int sql
1e670 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
1e680 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1e690 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
1e6a0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
1e6b0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
1e6c0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
1e6d0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54  ,         /* OUT
1e6e0 3a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  : Return the Pag
1e6f0 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
1e700 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
1e710 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
1e720 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
1e730 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
1e740 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
1e750 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
1e760 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
1e770 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
1e780 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
1e790 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20  */.  int flags, 
1e7a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e7b0 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
1e7c0 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
1e7d0 20 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20    int vfsFlags  
1e7e0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c             /* fl
1e7f0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
1e800 67 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66  gh to sqlite3_vf
1e810 73 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a  s.xOpen() */.){.
1e820 20 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61    u8 *pPtr;.  Pa
1e830 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b  ger *pPager = 0;
1e840 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1e850 6f 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61  object to alloca
1e860 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f  te and return */
1e870 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1e880 54 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52  TE_OK;      /* R
1e890 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
1e8a0 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
1e8b0 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e8c0 20 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20   for temp files 
1e8d0 28 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79  (incl. in-memory
1e8e0 20 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74   files) */.  int
1e8f0 20 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20   memDb = 0;     
1e900 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1e910 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
1e920 65 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20  emory file */.  
1e930 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30  int readOnly = 0
1e940 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  ;        /* True
1e950 20 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65   if this is a re
1e960 61 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a  ad-only file */.
1e970 20 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c    int journalFil
1e980 65 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79  eSize;     /* By
1e990 74 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20  tes to allocate 
1e9a0 66 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c  for each journal
1e9b0 20 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a   fd */.  char *z
1e9c0 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20  Pathname = 0;   
1e9d0 20 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74    /* Full path t
1e9e0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
1e9f0 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61  */.  int nPathna
1ea00 6d 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  me = 0;       /*
1ea10 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1ea20 20 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f   in zPathname */
1ea30 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61  .  int useJourna
1ea40 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  l = (flags & PAG
1ea50 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29  ER_OMIT_JOURNAL)
1ea60 3d 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f  ==0; /* False to
1ea70 20 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f   omit journal */
1ea80 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
1ea90 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
1eaa0 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
1eab0 3d 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20  =0;  /* True to 
1eac0 6f 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a  omit read-lock *
1ead0 2f 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69  /.  int pcacheSi
1eae0 7a 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63  ze = sqlite3Pcac
1eaf0 68 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20  heSize();       
1eb00 2f 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f  /* Bytes to allo
1eb10 63 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20  cate for PCache 
1eb20 2a 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44  */.  u16 szPageD
1eb30 66 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46  flt = SQLITE_DEF
1eb40 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20  AULT_PAGE_SIZE; 
1eb50 20 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65   /* Default page
1eb60 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46   size */..  /* F
1eb70 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75  igure out how mu
1eb80 63 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75  ch space is requ
1eb90 69 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f  ired for each jo
1eba0 75 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c  urnal file-handl
1ebb0 65 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72  e.  ** (there ar
1ebc0 65 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74  e two of them, t
1ebd0 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
1ebe0 61 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72  and the sub-jour
1ebf0 6e 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20  nal). This.  ** 
1ec00 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73  is the maximum s
1ec10 70 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f  pace required fo
1ec20 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a  r an in-memory j
1ec30 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64  ournal file hand
1ec40 6c 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72  le .  ** and a r
1ec50 65 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66  egular journal f
1ec60 69 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65  ile-handle. Note
1ec70 20 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72   that a "regular
1ec80 20 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22   journal-handle"
1ec90 0a 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77  .  ** may be a w
1eca0 72 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f  rapper capable o
1ecb0 66 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69  f caching the fi
1ecc0 72 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74  rst portion of t
1ecd0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
1ece0 66 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74  file in memory t
1ecf0 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20  o implement the 
1ed00 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
1ed10 69 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a  imization (see .
1ed20 20 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65    ** source file
1ed30 20 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a   journal.c)..  *
1ed40 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a  /.  if( sqlite3J
1ed50 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29  ournalSize(pVfs)
1ed60 3e 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e  >sqlite3MemJourn
1ed70 61 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20  alSize() ){.    
1ed80 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20  journalFileSize 
1ed90 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65 33  = ROUND8(sqlite3
1eda0 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73  JournalSize(pVfs
1edb0 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
1edc0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
1edd0 20 3d 20 52 4f 55 4e 44 38 28 73 71 6c 69 74 65   = ROUND8(sqlite
1ede0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
1edf0 29 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  ));.  }..  /* Se
1ee00 74 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72  t the output var
1ee10 69 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e  iable to NULL in
1ee20 20 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f   case an error o
1ee30 63 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50  ccurs. */.  *ppP
1ee40 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ager = 0;..  /* 
1ee50 43 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72  Compute and stor
1ee60 65 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  e the full pathn
1ee70 61 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61  ame in an alloca
1ee80 74 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74  ted buffer point
1ee90 65 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50  ed.  ** to by zP
1eea0 61 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20  athname, length 
1eeb0 6e 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69  nPathname. Or, i
1eec0 66 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70  f this is a temp
1eed0 6f 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a  orary file,.  **
1eee0 20 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74   leave both nPat
1eef0 68 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e  hname and zPathn
1ef00 61 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20  ame set to 0..  
1ef10 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61  */.  if( zFilena
1ef20 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b  me && zFilename[
1ef30 30 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e  0] ){.    nPathn
1ef40 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61  ame = pVfs->mxPa
1ef50 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50  thname+1;.    zP
1ef60 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
1ef70 33 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d  3Malloc(nPathnam
1ef80 65 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50  e*2);.    if( zP
1ef90 61 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20  athname==0 ){.  
1efa0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1efb0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23  E_NOMEM;.    }.#
1efc0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1efd0 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20  IT_MEMORYDB.    
1efe0 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
1eff0 6e 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29  name,":memory:")
1f000 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  ==0 ){.      mem
1f010 44 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50  Db = 1;.      zP
1f020 61 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a  athname[0] = 0;.
1f030 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
1f040 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 50 61  .    {.      zPa
1f050 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 20 2f  thname[0] = 0; /
1f060 2a 20 4d 61 6b 65 20 73 75 72 65 20 69 6e 69 74  * Make sure init
1f070 69 61 6c 69 7a 65 64 20 65 76 65 6e 20 69 66 20  ialized even if 
1f080 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 29 20 66  FullPathname() f
1f090 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 63  ails */.      rc
1f0a0 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c   = sqlite3OsFull
1f0b0 50 61 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a  Pathname(pVfs, z
1f0c0 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
1f0d0 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b  ame, zPathname);
1f0e0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74  .    }..    nPat
1f0f0 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53  hname = sqlite3S
1f100 74 72 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d  trlen30(zPathnam
1f110 65 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  e);.    if( rc==
1f120 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61  SQLITE_OK && nPa
1f130 74 68 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d  thname+8>pVfs->m
1f140 78 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  xPathname ){.   
1f150 20 20 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63     /* This branc
1f160 68 20 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20  h is taken when 
1f170 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68  the journal path
1f180 20 72 65 71 75 69 72 65 64 20 62 79 0a 20 20 20   required by.   
1f190 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61     ** the databa
1f1a0 73 65 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20  se being opened 
1f1b0 77 69 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61  will be more tha
1f1c0 6e 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  n pVfs->mxPathna
1f1d0 6d 65 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65  me.      ** byte
1f1e0 73 20 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69  s in length. Thi
1f1f0 73 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  s means the data
1f200 62 61 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f  base cannot be o
1f210 70 65 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20  pened,.      ** 
1f220 61 73 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62  as it will not b
1f230 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70  e possible to op
1f240 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
1f250 69 6c 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20  ile or even.    
1f260 20 20 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61    ** check for a
1f270 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66   hot-journal bef
1f280 6f 72 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20  ore reading..   
1f290 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
1f2a0 20 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e   SQLITE_CANTOPEN
1f2b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1f2c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1f2d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
1f2e0 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1f2f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1f300 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
1f310 20 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79   Allocate memory
1f320 20 66 6f 72 20 74 68 65 20 50 61 67 65 72 20 73   for the Pager s
1f330 74 72 75 63 74 75 72 65 2c 20 50 43 61 63 68 65  tructure, PCache
1f340 20 6f 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a   object, the.  *
1f350 2a 20 74 68 72 65 65 20 66 69 6c 65 20 64 65 73  * three file des
1f360 63 72 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61  criptors, the da
1f370 74 61 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65  tabase file name
1f380 20 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c   and the journal
1f390 20 0a 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65   .  ** file name
1f3a0 2e 20 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20  . The layout in 
1f3b0 6d 65 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c  memory is as fol
1f3c0 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
1f3d0 20 20 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74      Pager object
1f3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f3f0 20 20 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65      (sizeof(Page
1f400 72 29 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20  r) bytes).  **  
1f410 20 20 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74     PCache object
1f420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f430 20 20 20 28 73 71 6c 69 74 65 33 50 63 61 63 68     (sqlite3Pcach
1f440 65 53 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20  eSize() bytes). 
1f450 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
1f460 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20   file handle    
1f470 20 20 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73          (pVfs->s
1f480 7a 4f 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20  zOsFile bytes). 
1f490 20 2a 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72   **     Sub-jour
1f4a0 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
1f4b0 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c          (journal
1f4c0 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a  FileSize bytes).
1f4d0 20 20 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f    **     Main jo
1f4e0 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1f4f0 65 20 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61  e        (journa
1f500 6c 46 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29  lFileSize bytes)
1f510 0a 20 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61  .  **     Databa
1f520 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20  se file name    
1f530 20 20 20 20 20 20 20 20 20 20 28 6e 50 61 74 68            (nPath
1f540 6e 61 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20  name+1 bytes).  
1f550 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
1f560 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20  ile name        
1f570 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d         (nPathnam
1f580 65 2b 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a  e+8+1 bytes).  *
1f590 2f 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a  /.  pPtr = (u8 *
1f5a0 29 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65  )sqlite3MallocZe
1f5b0 72 6f 28 0a 20 20 20 20 52 4f 55 4e 44 38 28 73  ro(.    ROUND8(s
1f5c0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 20  izeof(*pPager)) 
1f5d0 2b 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20  +      /* Pager 
1f5e0 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 20  structure */.   
1f5f0 20 52 4f 55 4e 44 38 28 70 63 61 63 68 65 53 69   ROUND8(pcacheSi
1f600 7a 65 29 20 2b 20 20 20 20 20 20 20 20 20 20 20  ze) +           
1f610 2f 2a 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  /* PCache object
1f620 20 2a 2f 0a 20 20 20 20 52 4f 55 4e 44 38 28 70   */.    ROUND8(p
1f630 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 20 2b  Vfs->szOsFile) +
1f640 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6d 61         /* The ma
1f650 69 6e 20 64 62 20 66 69 6c 65 20 2a 2f 0a 20 20  in db file */.  
1f660 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
1f670 65 20 2a 20 32 20 2b 20 20 20 20 20 20 20 20 20  e * 2 +         
1f680 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f 75 72   /* The two jour
1f690 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
1f6a0 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 20    nPathname + 1 
1f6b0 2b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  +               
1f6c0 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f   /* zFilename */
1f6d0 0a 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b  .    nPathname +
1f6e0 20 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20   8 + 1          
1f6f0 20 20 20 20 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20      /* zJournal 
1f700 2a 2f 0a 20 20 29 3b 0a 20 20 61 73 73 65 72 74  */.  );.  assert
1f710 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1f720 47 4e 4d 45 4e 54 28 53 51 4c 49 54 45 5f 49 4e  GNMENT(SQLITE_IN
1f730 54 5f 54 4f 5f 50 54 52 28 6a 6f 75 72 6e 61 6c  T_TO_PTR(journal
1f740 46 69 6c 65 53 69 7a 65 29 29 20 29 3b 0a 20 20  FileSize)) );.  
1f750 69 66 28 20 21 70 50 74 72 20 29 7b 0a 20 20 20  if( !pPtr ){.   
1f760 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
1f770 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72 65  athname);.    re
1f780 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
1f790 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 20  M;.  }.  pPager 
1f7a0 3d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28  =              (
1f7b0 50 61 67 65 72 2a 29 28 70 50 74 72 29 3b 0a 20  Pager*)(pPtr);. 
1f7c0 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65   pPager->pPCache
1f7d0 20 3d 20 20 20 20 28 50 43 61 63 68 65 2a 29 28   =    (PCache*)(
1f7e0 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28 73  pPtr += ROUND8(s
1f7f0 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 29  izeof(*pPager)))
1f800 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d  ;.  pPager->fd =
1f810 20 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65     (sqlite3_file
1f820 2a 29 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44  *)(pPtr += ROUND
1f830 38 28 70 63 61 63 68 65 53 69 7a 65 29 29 3b 0a  8(pcacheSize));.
1f840 20 20 70 50 61 67 65 72 2d 3e 73 6a 66 64 20 3d    pPager->sjfd =
1f850 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f860 28 70 50 74 72 20 2b 3d 20 52 4f 55 4e 44 38 28  (pPtr += ROUND8(
1f870 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 29  pVfs->szOsFile))
1f880 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20  ;.  pPager->jfd 
1f890 3d 20 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  =  (sqlite3_file
1f8a0 2a 29 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e  *)(pPtr += journ
1f8b0 61 6c 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70  alFileSize);.  p
1f8c0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
1f8d0 20 3d 20 20 20 20 28 63 68 61 72 2a 29 28 70 50   =    (char*)(pP
1f8e0 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c  tr += journalFil
1f8f0 65 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  eSize);.  assert
1f900 28 20 45 49 47 48 54 5f 42 59 54 45 5f 41 4c 49  ( EIGHT_BYTE_ALI
1f910 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 6a  GNMENT(pPager->j
1f920 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c  fd) );..  /* Fil
1f930 6c 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a  l in the Pager.z
1f940 46 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67  Filename and Pag
1f950 65 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66  er.zJournal buff
1f960 65 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64  ers, if required
1f970 2e 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68  . */.  if( zPath
1f980 6e 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67  name ){.    pPag
1f990 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20  er->zJournal =  
1f9a0 20 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d   (char*)(pPtr +=
1f9b0 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b   nPathname + 1);
1f9c0 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67  .    memcpy(pPag
1f9d0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a  er->zFilename, z
1f9e0 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Pathname, nPathn
1f9f0 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  ame);.    memcpy
1fa00 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
1fa10 6c 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50  l, zPathname, nP
1fa20 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65  athname);.    me
1fa30 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a  mcpy(&pPager->zJ
1fa40 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65  ournal[nPathname
1fa50 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38  ], "-journal", 8
1fa60 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1fa70 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1fa80 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56    }.  pPager->pV
1fa90 66 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61  fs = pVfs;.  pPa
1faa0 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
1fab0 76 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20  vfsFlags;..  /* 
1fac0 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
1fad0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
1fae0 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
1faf0 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65  lename[0] && !me
1fb00 6d 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66  mDb ){.    int f
1fb10 6f 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  out = 0;        
1fb20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56              /* V
1fb30 46 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65  FS flags returne
1fb40 64 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a  d by xOpen() */.
1fb50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fb60 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
1fb70 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
1fb80 70 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46  pPager->fd, vfsF
1fb90 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
1fba0 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f    readOnly = (fo
1fbb0 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52  ut&SQLITE_OPEN_R
1fbc0 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f  EADONLY);..    /
1fbd0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
1fbe0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
1fbf0 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
1fc00 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
1fc10 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66   ** choose a def
1fc20 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69  ault page size i
1fc30 6e 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74  n case we have t
1fc40 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20  o create the.   
1fc50 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
1fc60 65 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70  e. The default p
1fc70 61 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20  age size is the 
1fc80 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20  maximum of:.    
1fc90 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53  **.    **    + S
1fca0 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
1fcb0 47 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20  GE_SIZE,.    ** 
1fcc0 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
1fcd0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
1fce0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
1fcf0 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
1fd00 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
1fd10 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
1fd20 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
1fd30 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
1fd40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1fd50 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
1fd60 20 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53        setSectorS
1fd70 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ize(pPager);.   
1fd80 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
1fd90 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
1fda0 5a 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ZE<=SQLITE_MAX_D
1fdb0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1fdc0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50  );.      if( szP
1fdd0 61 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e  ageDflt<pPager->
1fde0 73 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20  sectorSize ){.  
1fdf0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1fe00 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c  ->sectorSize>SQL
1fe10 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f  ITE_MAX_DEFAULT_
1fe20 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20  PAGE_SIZE ){.   
1fe30 20 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c         szPageDfl
1fe40 74 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44  t = SQLITE_MAX_D
1fe50 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1fe60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
1fe70 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67  .          szPag
1fe80 65 44 66 6c 74 20 3d 20 28 75 31 36 29 70 50 61  eDflt = (u16)pPa
1fe90 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b  ger->sectorSize;
1fea0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1feb0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
1fec0 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
1fed0 52 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20  RITE.      {.   
1fee0 20 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73       int iDc = s
1fef0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1ff00 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1ff10 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
1ff20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20     int ii;.     
1ff30 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
1ff40 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32  _IOCAP_ATOMIC512
1ff50 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20  ==(512>>8));.   
1ff60 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
1ff70 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
1ff80 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
1ff90 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
1ffa0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
1ffb0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
1ffc0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  536);.        fo
1ffd0 72 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b  r(ii=szPageDflt;
1ffe0 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
1fff0 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
20000 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
20010 20 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28         if( iDc&(
20020 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
20030 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a  MIC|(ii>>8)) ){.
20040 20 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61              szPa
20050 67 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20  geDflt = ii;.   
20060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
20070 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
20080 66 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  f.    }.  }else{
20090 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d  .    /* If a tem
200a0 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72  porary file is r
200b0 65 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20  equested, it is 
200c0 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64  not opened immed
200d0 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49  iately..    ** I
200e0 6e 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61  n this case we a
200f0 63 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c  ccept the defaul
20100 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20  t page size and 
20110 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20  delay actually. 
20120 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68     ** opening th
20130 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65  e file until the
20140 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f   first call to O
20150 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a  sWrite()..    **
20160 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61  .    ** This bra
20170 6e 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20  nch is also run 
20180 66 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  for an in-memory
20190 20 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e   database. An in
201a0 2d 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64  -memory.    ** d
201b0 61 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73  atabase is the s
201c0 61 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69  ame as a temp-fi
201d0 6c 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72  le that is never
201e0 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a   written out to.
201f0 20 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20      ** disk and 
20200 75 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  uses an in-memor
20210 79 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  y rollback journ
20220 61 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20  al..    */ .    
20230 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
20240 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
20250 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  = PAGER_EXCLUSIV
20260 45 3b 0a 20 20 20 20 72 65 61 64 4f 6e 6c 79 20  E;.    readOnly 
20270 3d 20 28 76 66 73 46 6c 61 67 73 26 53 51 4c 49  = (vfsFlags&SQLI
20280 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
20290 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
202a0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
202b0 74 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73  to PagerSetPages
202c0 69 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20  ize() serves to 
202d0 73 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  set the value of
202e0 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67   .  ** Pager.pag
202f0 65 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c  eSize and to all
20300 6f 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e  ocate the Pager.
20310 70 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72  pTmpSpace buffer
20320 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d  ..  */.  if( rc=
20330 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20340 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20350 2d 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20  ->memDb==0 );.  
20360 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
20370 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70  gerSetPagesize(p
20380 50 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66  Pager, &szPageDf
20390 6c 74 2c 20 2d 31 29 3b 0a 20 20 20 20 74 65 73  lt, -1);.    tes
203a0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
203b0 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
203c0 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
203d0 63 75 72 72 65 64 20 69 6e 20 65 69 74 68 65 72  curred in either
203e0 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73 20 61   of the blocks a
203f0 62 6f 76 65 2c 20 66 72 65 65 20 74 68 65 20 0a  bove, free the .
20400 20 20 2a 2a 20 50 61 67 65 72 20 73 74 72 75 63    ** Pager struc
20410 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20 74  ture and close t
20420 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  he file..  */.  
20430 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20440 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
20450 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
20460 61 63 65 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  ace );.    sqlit
20470 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
20480 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
20490 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
204a0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
204b0 20 20 7d 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61    }..  /* Initia
204c0 6c 69 7a 65 20 74 68 65 20 50 43 61 63 68 65 20  lize the PCache 
204d0 6f 62 6a 65 63 74 2e 20 2a 2f 0a 20 20 61 73 73  object. */.  ass
204e0 65 72 74 28 20 6e 45 78 74 72 61 3c 31 30 30 30  ert( nExtra<1000
204f0 20 29 3b 0a 20 20 6e 45 78 74 72 61 20 3d 20 52   );.  nExtra = R
20500 4f 55 4e 44 38 28 6e 45 78 74 72 61 29 3b 0a 20  OUND8(nExtra);. 
20510 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 4f 70   sqlite3PcacheOp
20520 65 6e 28 73 7a 50 61 67 65 44 66 6c 74 2c 20 6e  en(szPageDflt, n
20530 45 78 74 72 61 2c 20 21 6d 65 6d 44 62 2c 0a 20  Extra, !memDb,. 
20540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20550 20 20 20 21 6d 65 6d 44 62 3f 70 61 67 65 72 53     !memDb?pagerS
20560 74 72 65 73 73 3a 30 2c 20 28 76 6f 69 64 20 2a  tress:0, (void *
20570 29 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d  )pPager, pPager-
20580 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 50 41  >pPCache);..  PA
20590 47 45 52 54 52 41 43 45 28 28 22 4f 50 45 4e 20  GERTRACE(("OPEN 
205a0 25 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41  %d %s\n", FILEHA
205b0 4e 44 4c 45 49 44 28 70 50 61 67 65 72 2d 3e 66  NDLEID(pPager->f
205c0 64 29 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  d), pPager->zFil
205d0 65 6e 61 6d 65 29 29 3b 0a 20 20 49 4f 54 52 41  ename));.  IOTRA
205e0 43 45 28 28 22 4f 50 45 4e 20 25 70 20 25 73 5c  CE(("OPEN %p %s\
205f0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67  n", pPager, pPag
20600 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 29 0a  er->zFilename)).
20610 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  .  pPager->useJo
20620 75 72 6e 61 6c 20 3d 20 28 75 38 29 75 73 65 4a  urnal = (u8)useJ
20630 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72  ournal;.  pPager
20640 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28  ->noReadlock = (
20650 6e 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65  noReadlock && re
20660 61 64 4f 6e 6c 79 29 20 3f 31 3a 30 3b 0a 20 20  adOnly) ?1:0;.  
20670 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
20680 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
20690 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
206a0 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
206b0 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
206c0 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
206d0 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 28 75 38  bSizeValid = (u8
206e0 29 6d 65 6d 44 62 3b 0a 20 20 2f 2a 20 70 50 61  )memDb;.  /* pPa
206f0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
20700 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
20710 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
20720 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
20730 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
20740 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f    pPager->mxPgno
20750 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41   = SQLITE_MAX_PA
20760 47 45 5f 43 4f 55 4e 54 3b 0a 20 20 2f 2a 20 70  GE_COUNT;.  /* p
20770 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
20780 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 20 2a 2f 0a  AGER_UNLOCK; */.
20790 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
207a0 2d 3e 73 74 61 74 65 20 3d 3d 20 28 74 65 6d 70  ->state == (temp
207b0 46 69 6c 65 20 3f 20 50 41 47 45 52 5f 45 58 43  File ? PAGER_EXC
207c0 4c 55 53 49 56 45 20 3a 20 50 41 47 45 52 5f 55  LUSIVE : PAGER_U
207d0 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20 2f 2a 20 70  NLOCK) );.  /* p
207e0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d  Pager->errMask =
207f0 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
20800 3e 74 65 6d 70 46 69 6c 65 20 3d 20 28 75 38 29  >tempFile = (u8)
20810 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
20820 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
20830 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
20840 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
20850 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
20860 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
20870 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
20880 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
20890 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
208a0 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
208b0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
208c0 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69 6c 65  e = (u8)tempFile
208d0 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 63 68 61  ; .  pPager->cha
208e0 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 70  ngeCountDone = p
208f0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
20900 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
20910 20 3d 20 28 75 38 29 6d 65 6d 44 62 3b 0a 20 20   = (u8)memDb;.  
20920 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
20930 20 3d 20 28 75 38 29 72 65 61 64 4f 6e 6c 79 3b   = (u8)readOnly;
20940 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65  .  /* pPager->ne
20950 65 64 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20  edSync = 0; */. 
20960 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
20970 3d 20 28 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  = (pPager->tempF
20980 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
20990 61 6c 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67  al) ?1:0;.  pPag
209a0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 70  er->fullSync = p
209b0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 30  Pager->noSync ?0
209c0 3a 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :1;.  pPager->sy
209d0 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
209e0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
209f0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
20a00 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
20a10 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
20a20 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
20a30 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
20a40 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
20a50 2d 3e 6e 45 78 74 72 61 20 3d 20 28 75 31 36 29  ->nExtra = (u16)
20a60 6e 45 78 74 72 61 3b 0a 20 20 70 50 61 67 65 72  nExtra;.  pPager
20a70 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
20a80 69 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  it = SQLITE_DEFA
20a90 55 4c 54 5f 4a 4f 55 52 4e 41 4c 5f 53 49 5a 45  ULT_JOURNAL_SIZE
20aa0 5f 4c 49 4d 49 54 3b 0a 20 20 61 73 73 65 72 74  _LIMIT;.  assert
20ab0 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
20ac0 3e 66 64 29 20 7c 7c 20 74 65 6d 70 46 69 6c 65  >fd) || tempFile
20ad0 20 29 3b 0a 20 20 73 65 74 53 65 63 74 6f 72 53   );.  setSectorS
20ae0 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ize(pPager);.  i
20af0 66 28 20 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20  f( memDb ){.    
20b00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
20b10 6f 64 65 20 3d 20 50 41 47 45 52 5f 4a 4f 55 52  ode = PAGER_JOUR
20b20 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 3b 0a  NALMODE_MEMORY;.
20b30 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
20b40 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
20b50 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
20b60 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 41  r->pBusyHandlerA
20b70 72 67 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  rg = 0; */.  /* 
20b80 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
20b90 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
20ba0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
20bb0 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
20bc0 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72   pPager;.  retur
20bd0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
20be0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
20bf0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
20c00 61 66 74 65 72 20 74 72 61 6e 73 69 74 69 6f 6e  after transition
20c10 69 6e 67 20 66 72 6f 6d 20 50 41 47 45 52 5f 55  ing from PAGER_U
20c20 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a 20 50 41 47 45  NLOCK to.** PAGE
20c30 52 5f 53 48 41 52 45 44 20 73 74 61 74 65 2e 20  R_SHARED state. 
20c40 49 74 20 74 65 73 74 73 20 69 66 20 74 68 65 72  It tests if ther
20c50 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
20c60 61 6c 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a  al present in.**
20c70 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   the file-system
20c80 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
20c90 61 67 65 72 2e 20 41 20 68 6f 74 20 6a 6f 75 72  ager. A hot jour
20ca0 6e 61 6c 20 69 73 20 6f 6e 65 20 74 68 61 74 20  nal is one that 
20cb0 0a 2a 2a 20 6e 65 65 64 73 20 74 6f 20 62 65 20  .** needs to be 
20cc0 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 41 63 63  played back. Acc
20cd0 6f 72 64 69 6e 67 20 74 6f 20 74 68 69 73 20 66  ording to this f
20ce0 75 6e 63 74 69 6f 6e 2c 20 61 20 68 6f 74 2d 6a  unction, a hot-j
20cf0 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 65  ournal.** file e
20d00 78 69 73 74 73 20 69 66 20 74 68 65 20 66 6f 6c  xists if the fol
20d10 6c 6f 77 69 6e 67 20 63 72 69 74 65 72 69 61 20  lowing criteria 
20d20 61 72 65 20 6d 65 74 3a 0a 2a 2a 0a 2a 2a 20 20  are met:.**.**  
20d30 20 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66   * The journal f
20d40 69 6c 65 20 65 78 69 73 74 73 20 69 6e 20 74 68  ile exists in th
20d50 65 20 66 69 6c 65 20 73 79 73 74 65 6d 2c 20 61  e file system, a
20d60 6e 64 0a 2a 2a 20 20 20 2a 20 4e 6f 20 70 72 6f  nd.**   * No pro
20d70 63 65 73 73 20 68 6f 6c 64 73 20 61 20 52 45 53  cess holds a RES
20d80 45 52 56 45 44 20 6f 72 20 67 72 65 61 74 65 72  ERVED or greater
20d90 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
20da0 61 62 61 73 65 20 66 69 6c 65 2c 20 61 6e 64 0a  abase file, and.
20db0 2a 2a 20 20 20 2a 20 54 68 65 20 64 61 74 61 62  **   * The datab
20dc0 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66 20  ase file itself 
20dd0 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  is greater than 
20de0 30 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  0 bytes in size,
20df0 20 61 6e 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20   and.**   * The 
20e00 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 74 68  first byte of th
20e10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
20e20 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74  xists and is not
20e30 20 30 78 30 30 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   0x00..**.** If 
20e40 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65  the current size
20e50 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
20e60 20 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61   file is 0 but a
20e70 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
20e80 20 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73   exists, that is
20e90 20 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64   probably an old
20ea0 20 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76   journal left ov
20eb0 65 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a  er from a prior.
20ec0 2a 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68  ** database with
20ed0 20 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20   the same name. 
20ee0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
20ef0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
20f00 0a 2a 2a 20 6a 75 73 74 20 64 65 6c 65 74 65 64  .** just deleted
20f10 20 75 73 69 6e 67 20 4f 73 44 65 6c 65 74 65 2c   using OsDelete,
20f20 20 2a 70 45 78 69 73 74 73 20 69 73 20 73 65 74   *pExists is set
20f30 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
20f40 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
20f50 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
20f60 6f 75 74 69 6e 65 20 64 6f 65 73 20 6e 6f 74 20  outine does not 
20f70 63 68 65 63 6b 20 69 66 20 74 68 65 72 65 20 69  check if there i
20f80 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  s a master journ
20f90 61 6c 20 66 69 6c 65 6e 61 6d 65 0a 2a 2a 20 61  al filename.** a
20fa0 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
20fb0 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
20fc0 69 73 2c 20 61 6e 64 20 74 68 61 74 20 6d 61 73  is, and that mas
20fd0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
20fe0 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  .** does not exi
20ff0 73 74 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75  st, then the jou
21000 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74  rnal file is not
21010 20 72 65 61 6c 6c 79 20 68 6f 74 2e 20 49 6e 20   really hot. In 
21020 74 68 69 73 0a 2a 2a 20 63 61 73 65 20 74 68 69  this.** case thi
21030 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72  s routine will r
21040 65 74 75 72 6e 20 61 20 66 61 6c 73 65 2d 70 6f  eturn a false-po
21050 73 69 74 69 76 65 2e 20 54 68 65 20 70 61 67 65  sitive. The page
21060 72 5f 70 6c 61 79 62 61 63 6b 28 29 0a 2a 2a 20  r_playback().** 
21070 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73  routine will dis
21080 63 6f 76 65 72 20 74 68 61 74 20 74 68 65 20 6a  cover that the j
21090 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
210a0 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61 6e  ot really hot an
210b0 64 20 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 72  d .** will not r
210c0 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 0a 2a 2a  oll it back. .**
210d0 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f 75  .** If a hot-jou
210e0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f 75  rnal file is fou
210f0 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70 45  nd to exist, *pE
21100 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f 20  xists is set to 
21110 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  1 and .** SQLITE
21120 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49 66  _OK returned. If
21130 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20   no hot-journal 
21140 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74 2c  file is present,
21150 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a 20   *pExists is.** 
21160 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51 4c  set to 0 and SQL
21170 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e  ITE_OK returned.
21180 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
21190 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72 79  occurs while try
211a0 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72 6d  ing.** to determ
211b0 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20 6e  ine whether or n
211c0 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ot a hot-journal
211d0 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74 68   file exists, th
211e0 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  e IO error.** co
211f0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
21200 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
21210 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64 65  *pExists is unde
21220 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  fined..*/.static
21230 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e   int hasHotJourn
21240 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
21250 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29 7b  , int *pExists){
21260 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
21270 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
21280 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e  ager->pVfs;.  in
21290 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
212a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
212b0 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
212c0 69 6e 74 20 65 78 69 73 74 73 3b 20 20 20 20 20  int exists;     
212d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
212e0 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72 6e   True if a journ
212f0 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73 65  al file is prese
21300 6e 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  nt */..  assert(
21310 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
21320 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21330 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  useJournal );.  
21340 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
21350 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20  Pager->fd) );.  
21360 61 73 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28  assert( !isOpen(
21370 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
21380 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
21390 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
213a0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
213b0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
213c0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
213d0 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
213e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
213f0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
21400 0a 20 20 20 20 69 6e 74 20 6c 6f 63 6b 65 64 3b  .    int locked;
21410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21420 20 2f 2a 20 54 72 75 65 20 69 66 20 73 6f 6d 65   /* True if some
21430 20 70 72 6f 63 65 73 73 20 68 6f 6c 64 73 20 61   process holds a
21440 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 2a   RESERVED lock *
21450 2f 0a 0a 20 20 20 20 2f 2a 20 52 61 63 65 20 63  /..    /* Race c
21460 6f 6e 64 69 74 69 6f 6e 20 68 65 72 65 3a 20 20  ondition here:  
21470 41 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  Another process 
21480 6d 69 67 68 74 20 68 61 76 65 20 62 65 65 6e 20  might have been 
21490 68 6f 6c 64 69 6e 67 20 74 68 65 0a 20 20 20 20  holding the.    
214a0 2a 2a 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ** the RESERVED 
214b0 6c 6f 63 6b 20 61 6e 64 20 68 61 76 65 20 61 20  lock and have a 
214c0 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 20 61 74 20  journal open at 
214d0 74 68 65 20 73 71 6c 69 74 65 33 4f 73 41 63 63  the sqlite3OsAcc
214e0 65 73 73 28 29 20 0a 20 20 20 20 2a 2a 20 63 61  ess() .    ** ca
214f0 6c 6c 20 61 62 6f 76 65 2c 20 62 75 74 20 74 68  ll above, but th
21500 65 6e 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  en delete the jo
21510 75 72 6e 61 6c 20 61 6e 64 20 64 72 6f 70 20 74  urnal and drop t
21520 68 65 20 6c 6f 63 6b 20 62 65 66 6f 72 65 0a 20  he lock before. 
21530 20 20 20 2a 2a 20 77 65 20 67 65 74 20 74 6f 20     ** we get to 
21540 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 71  the following sq
21550 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
21560 72 76 65 64 4c 6f 63 6b 28 29 20 63 61 6c 6c 2e  rvedLock() call.
21570 20 20 49 66 20 74 68 61 74 0a 20 20 20 20 2a 2a    If that.    **
21580 20 69 73 20 74 68 65 20 63 61 73 65 2c 20 74 68   is the case, th
21590 69 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74  is routine might
215a0 20 74 68 69 6e 6b 20 74 68 65 72 65 20 69 73 20   think there is 
215b0 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 77 68  a hot journal wh
215c0 65 6e 0a 20 20 20 20 2a 2a 20 69 6e 20 66 61 63  en.    ** in fac
215d0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 6e 65 2e  t there is none.
215e0 20 20 54 68 69 73 20 72 65 73 75 6c 74 73 20 69    This results i
215f0 6e 20 61 20 66 61 6c 73 65 2d 70 6f 73 69 74 69  n a false-positi
21600 76 65 20 77 68 69 63 68 20 77 69 6c 6c 0a 20 20  ve which will.  
21610 20 20 2a 2a 20 62 65 20 64 65 61 6c 74 20 77 69    ** be dealt wi
21620 74 68 20 62 79 20 74 68 65 20 70 6c 61 79 62 61  th by the playba
21630 63 6b 20 72 6f 75 74 69 6e 65 2e 20 20 54 69 63  ck routine.  Tic
21640 6b 65 74 20 23 33 38 38 33 2e 0a 20 20 20 20 2a  ket #3883..    *
21650 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
21660 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
21670 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
21680 2c 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  , &locked);.    
21690 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
216a0 4b 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a  K && !locked ){.
216b0 20 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b        int nPage;
216c0 0a 0a 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b  ..      /* Check
216d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
216e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
216f0 49 66 20 69 74 20 63 6f 6e 73 69 73 74 73 20 6f  If it consists o
21700 66 20 30 20 70 61 67 65 73 2c 0a 20 20 20 20 20  f 0 pages,.     
21710 20 2a 2a 20 74 68 65 6e 20 64 65 6c 65 74 65 20   ** then delete 
21720 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21730 2e 20 53 65 65 20 74 68 65 20 68 65 61 64 65 72  . See the header
21740 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65 20 66   comment above f
21750 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  or .      ** the
21760 20 72 65 61 73 6f 6e 69 6e 67 20 68 65 72 65 2e   reasoning here.
21770 20 20 44 65 6c 65 74 65 20 74 68 65 20 6f 62 73    Delete the obs
21780 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
21790 6c 65 20 75 6e 64 65 72 0a 20 20 20 20 20 20 2a  le under.      *
217a0 2a 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  * a RESERVED loc
217b0 6b 20 74 6f 20 61 76 6f 69 64 20 72 61 63 65 20  k to avoid race 
217c0 63 6f 6e 64 69 74 69 6f 6e 73 20 61 6e 64 20 74  conditions and t
217d0 6f 20 61 76 6f 69 64 20 76 69 6f 6c 61 74 69 6e  o avoid violatin
217e0 67 0a 20 20 20 20 20 20 2a 2a 20 5b 48 33 33 30  g.      ** [H330
217f0 32 30 5d 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  20]..      */.  
21800 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21810 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
21820 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29 3b 0a  Pager, &nPage);.
21830 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
21840 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21850 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30 20     if( nPage==0 
21860 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
21870 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e 4d  ite3BeginBenignM
21880 61 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 20  alloc();.       
21890 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
218a0 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
218b0 52 56 45 44 0a 20 20 20 20 20 20 20 20 20 20 20  RVED.           
218c0 20 20 20 20 20 20 7c 7c 20 20 73 71 6c 69 74 65        ||  sqlite
218d0 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
218e0 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  fd, RESERVED_LOC
218f0 4b 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  K)==SQLITE_OK ){
21900 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
21910 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66  ite3OsDelete(pVf
21920 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
21930 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  nal, 0);.       
21940 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
21950 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
21960 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
21970 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
21980 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
21990 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 20  _SHARED ){.     
219a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
219b0 4f 73 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d  OsUnlock(pPager-
219c0 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  >fd, SHARED_LOCK
219d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
219e0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
219f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 6e         sqlite3En
21a00 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  dBenignMalloc();
21a10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
21a20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
21a30 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
21a40 69 73 74 73 20 61 6e 64 20 6e 6f 20 6f 74 68 65  ists and no othe
21a50 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 68 61 73  r connection has
21a60 20 61 20 72 65 73 65 72 76 65 64 0a 20 20 20 20   a reserved.    
21a70 20 20 20 20 20 20 2a 2a 20 6f 72 20 67 72 65 61        ** or grea
21a80 74 65 72 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ter lock on the 
21a90 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 4e  database file. N
21aa0 6f 77 20 63 68 65 63 6b 20 74 68 61 74 20 74 68  ow check that th
21ab0 65 72 65 20 69 73 0a 20 20 20 20 20 20 20 20 20  ere is.         
21ac0 20 2a 2a 20 61 74 20 6c 65 61 73 74 20 6f 6e 65   ** at least one
21ad0 20 6e 6f 6e 2d 7a 65 72 6f 20 62 79 74 65 73 20   non-zero bytes 
21ae0 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
21af0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21b00 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 49  ..          ** I
21b10 66 20 74 68 65 72 65 20 69 73 2c 20 74 68 65 6e  f there is, then
21b20 20 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 69   we consider thi
21b30 73 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 62 65 20  s journal to be 
21b40 68 6f 74 2e 20 49 66 20 6e 6f 74 2c 20 0a 20 20  hot. If not, .  
21b50 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61          ** it ca
21b60 6e 20 62 65 20 69 67 6e 6f 72 65 64 2e 0a 20 20  n be ignored..  
21b70 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
21b80 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
21b90 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
21ba0 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  Y|SQLITE_OPEN_MA
21bb0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
21bc0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
21bd0 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70  e3OsOpen(pVfs, p
21be0 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
21bf0 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 2c   pPager->jfd, f,
21c00 20 26 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20   &f);.          
21c10 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21c20 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
21c30 20 75 38 20 66 69 72 73 74 20 3d 20 30 3b 0a 20   u8 first = 0;. 
21c40 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
21c50 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
21c60 61 67 65 72 2d 3e 6a 66 64 2c 20 28 76 6f 69 64  ager->jfd, (void
21c70 20 2a 29 26 66 69 72 73 74 2c 20 31 2c 20 30 29   *)&first, 1, 0)
21c80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
21c90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
21ca0 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
21cb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
21cc0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
21cd0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
21ce0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
21cf0 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
21d00 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  jfd);.          
21d10 20 20 2a 70 45 78 69 73 74 73 20 3d 20 28 66 69    *pExists = (fi
21d20 72 73 74 21 3d 30 29 3b 0a 20 20 20 20 20 20 20  rst!=0);.       
21d30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
21d40 3d 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e  =SQLITE_CANTOPEN
21d50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
21d60 2f 2a 20 49 66 20 77 65 20 63 61 6e 6e 6f 74 20  /* If we cannot 
21d70 6f 70 65 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  open the rollbac
21d80 6b 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  k journal file i
21d90 6e 20 6f 72 64 65 72 20 74 6f 20 73 65 65 20 69  n order to see i
21da0 66 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  f.            **
21db0 20 69 74 73 20 68 61 73 20 61 20 7a 65 72 6f 20   its has a zero 
21dc0 68 65 61 64 65 72 2c 20 74 68 61 74 20 6d 69 67  header, that mig
21dd0 68 74 20 62 65 20 64 75 65 20 74 6f 20 61 6e 20  ht be due to an 
21de0 49 2f 4f 20 65 72 72 6f 72 2c 20 6f 72 0a 20 20  I/O error, or.  
21df0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
21e00 6d 69 67 68 74 20 62 65 20 64 75 65 20 74 6f 20  might be due to 
21e10 74 68 65 20 72 61 63 65 20 63 6f 6e 64 69 74 69  the race conditi
21e20 6f 6e 20 64 65 73 63 72 69 62 65 64 20 61 62 6f  on described abo
21e30 76 65 20 61 6e 64 20 69 6e 0a 20 20 20 20 20 20  ve and in.      
21e40 20 20 20 20 20 20 2a 2a 20 74 69 63 6b 65 74 20        ** ticket 
21e50 23 33 38 38 33 2e 20 20 45 69 74 68 65 72 20 77  #3883.  Either w
21e60 61 79 2c 20 61 73 73 75 6d 65 20 74 68 61 74 20  ay, assume that 
21e70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68  the journal is h
21e80 6f 74 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ot..            
21e90 2a 2a 20 54 68 69 73 20 6d 69 67 68 74 20 62 65  ** This might be
21ea0 20 61 20 66 61 6c 73 65 20 70 6f 73 69 74 69 76   a false positiv
21eb0 65 2e 20 20 42 75 74 20 69 66 20 69 74 20 69 73  e.  But if it is
21ec0 2c 20 74 68 65 6e 20 74 68 65 0a 20 20 20 20 20  , then the.     
21ed0 20 20 20 20 20 20 20 2a 2a 20 61 75 74 6f 6d 61         ** automa
21ee0 74 69 63 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  tic journal play
21ef0 62 61 63 6b 20 61 6e 64 20 72 65 63 6f 76 65 72  back and recover
21f00 79 20 6d 65 63 68 61 6e 69 73 6d 20 77 69 6c 6c  y mechanism will
21f10 20 64 65 61 6c 0a 20 20 20 20 20 20 20 20 20 20   deal.          
21f20 20 20 2a 2a 20 77 69 74 68 20 69 74 20 75 6e 64    ** with it und
21f30 65 72 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  er an EXCLUSIVE 
21f40 6c 6f 63 6b 20 77 68 65 72 65 20 77 65 20 64 6f  lock where we do
21f50 20 6e 6f 74 20 6e 65 65 64 20 74 6f 0a 20 20 20   not need to.   
21f60 20 20 20 20 20 20 20 20 20 2a 2a 20 77 6f 72 72           ** worr
21f70 79 20 73 6f 20 6d 75 63 68 20 77 69 74 68 20 72  y so much with r
21f80 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 73 2e 0a  ace conditions..
21f90 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20              */. 
21fa0 20 20 20 20 20 20 20 20 20 20 20 2a 70 45 78 69             *pExi
21fb0 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  sts = 1;.       
21fc0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
21fd0 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  _OK;.          }
21fe0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21ff0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
22000 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22010 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e  .** Read the con
22020 74 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50  tent for page pP
22030 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
22040 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69  abase file and i
22050 6e 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61  nto .** pPg->pDa
22060 74 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63  ta. A shared loc
22070 6b 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73  k or greater mus
22080 74 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65  t be held on the
22090 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
220a0 65 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75  e before this fu
220b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
220c0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20  ..**.** If page 
220d0 31 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20  1 is read, then 
220e0 74 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67  the value of Pag
220f0 65 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20  er.dbFileVers[] 
22100 69 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65  is set to.** the
22110 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d   value read from
22120 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
22130 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  le..**.** If an 
22140 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  IO error occurs,
22150 20 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72   then the IO err
22160 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  or is returned t
22170 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  o the caller..**
22180 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49   Otherwise, SQLI
22190 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
221a0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
221b0 20 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64   readDbPage(PgHd
221c0 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
221d0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
221e0 70 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72  pPager; /* Pager
221f0 20 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74   object associat
22200 65 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67  ed with page pPg
22210 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20   */.  Pgno pgno 
22220 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20  = pPg->pgno;    
22230 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65     /* Page numbe
22240 72 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69  r to read */.  i
22250 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
22260 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
22270 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
22280 69 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20  i64 iOffset;    
22290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
222a0 42 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66  Byte offset of f
222b0 69 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  ile to read from
222c0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
222d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
222e0 47 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d  GER_SHARED && !M
222f0 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 21  EMDB );..  if( !
22300 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66  isOpen(pPager->f
22310 64 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  d) ){.    assert
22320 28 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  ( pPager->tempFi
22330 6c 65 20 29 3b 0a 20 20 20 20 6d 65 6d 73 65 74  le );.    memset
22340 28 70 50 67 2d 3e 70 44 61 74 61 2c 20 30 2c 20  (pPg->pData, 0, 
22350 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
22360 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
22370 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
22380 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
22390 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
223a0 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  ageSize;.  rc = 
223b0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
223c0 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
223d0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
223e0 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29  geSize, iOffset)
223f0 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
22400 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
22410 45 41 44 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  EAD ){.    rc = 
22420 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
22430 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a   if( pgno==1 ){.
22440 20 20 20 20 75 38 20 2a 64 62 46 69 6c 65 56 65      u8 *dbFileVe
22450 72 73 20 3d 20 26 28 28 75 38 2a 29 70 50 67 2d  rs = &((u8*)pPg-
22460 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a 20 20 20  >pData)[24];.   
22470 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
22480 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46  >dbFileVers, dbF
22490 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
224a0 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
224b0 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45  rs));.  }.  CODE
224c0 43 31 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  C1(pPager, pPg->
224d0 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20 33 2c 20  pData, pgno, 3, 
224e0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
224f0 4d 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  M);..  PAGER_INC
22500 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
22510 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
22520 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
22530 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
22540 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
22550 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
22560 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
22570 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
22580 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
22590 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
225a0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
225b0 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
225c0 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
225d0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
225e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
225f0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
22600 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 75  d whenever the u
22610 70 70 65 72 20 6c 61 79 65 72 20 72 65 71 75 65  pper layer reque
22620 73 74 73 20 61 20 64 61 74 61 62 61 73 65 0a 2a  sts a database.*
22630 2a 20 70 61 67 65 20 69 73 20 72 65 71 75 65 73  * page is reques
22640 74 65 64 2c 20 62 65 66 6f 72 65 20 74 68 65 20  ted, before the 
22650 63 61 63 68 65 20 69 73 20 63 68 65 63 6b 65 64  cache is checked
22660 20 66 6f 72 20 61 20 73 75 69 74 61 62 6c 65 20   for a suitable 
22670 70 61 67 65 0a 2a 2a 20 6f 72 20 61 6e 79 20 64  page.** or any d
22680 61 74 61 20 69 73 20 72 65 61 64 20 66 72 6f 6d  ata is read from
22690 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
226a0 74 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 66  t performs the f
226b0 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 77 6f 20  ollowing.** two 
226c0 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
226d0 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67     1) If the pag
226e0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
226f0 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  in PAGER_UNLOCK 
22700 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68  state (no lock h
22710 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  eld.**      on t
22720 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
22730 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  ), then an attem
22740 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62  pt is made to ob
22750 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53  tain a.**      S
22760 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
22770 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
22780 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
22790 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20  er obtaining.** 
227a0 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20       the SHARED 
227b0 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73  lock, the file-s
227c0 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64  ystem is checked
227d0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
227e0 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63  al,.**      whic
227f0 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  h is played back
22800 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c   if present. Fol
22810 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a  lowing any hot-j
22820 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20  ournal .**      
22830 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f  rollback, the co
22840 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61  ntents of the ca
22850 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65  che are validate
22860 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  d by checking.**
22870 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67        the 'chang
22880 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64  e-counter' field
22890 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
228a0 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64   file header and
228b0 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64  .**      discard
228c0 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66  ed if they are f
228d0 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  ound to be inval
228e0 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49  id..**.**   2) I
228f0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
22900 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
22910 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68  ive-mode, and th
22920 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
22930 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74  y.**      no out
22940 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
22950 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ces to any pages
22960 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20  , and is in the 
22970 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20  error state,.** 
22980 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74       then an att
22990 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
229a0 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
229b0 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64  state by discard
229c0 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
229d0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
229e0 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72  page cache and r
229f0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20  olling back any 
22a00 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  open journal.** 
22a10 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a       file..**.**
22a20 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
22a30 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 28  n described by (
22a40 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  2) above is not 
22a50 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69  attempted, and i
22a60 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69  f the.** pager i
22a70 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  s in an error st
22a80 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ate other than S
22a90 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20  QLITE_FULL when 
22aa0 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a  this is called,.
22ab0 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ** the error sta
22ac0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
22ad0 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73   returned. It is
22ae0 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65   permitted to re
22af0 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ad the.** databa
22b00 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54  se when in SQLIT
22b10 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61  E_FULL error sta
22b20 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  te..**.** Otherw
22b30 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69  ise, if everythi
22b40 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
22b50 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
22b60 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a  eturned. If an.*
22b70 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  * IO error occur
22b80 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  s while locking 
22b90 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68  the database, ch
22ba0 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74  ecking for a hot
22bb0 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
22bc0 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
22bd0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c   a journal file,
22be0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
22bf0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
22c00 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
22c10 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
22c20 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
22c30 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22c40 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
22c50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22c60 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72  e */.  int isErr
22c70 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20  orReset = 0;    
22c80 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
22c90 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20  e if recovering 
22ca0 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65  from error state
22cb0 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
22cc0 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  s database is op
22cd0 65 6e 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69  ened for exclusi
22ce0 76 65 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e  ve access, has n
22cf0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20  o outstanding . 
22d00 20 2a 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e   ** page referen
22d10 63 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e  ces and is in an
22d20 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68   error-state, th
22d30 69 73 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  is is a chance t
22d40 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65  o clear.  ** the
22d50 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20   error. Discard 
22d60 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
22d70 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
22d80 61 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20  and treat any.  
22d90 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  ** open journal 
22da0 66 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f  file as a hot-jo
22db0 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  urnal..  */.  if
22dc0 28 20 21 4d 45 4d 44 42 20 0a 20 20 20 26 26 20  ( !MEMDB .   && 
22dd0 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
22de0 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
22df0 43 61 63 68 65 29 3d 3d 30 20 26 26 20 70 50 61  Cache)==0 && pPa
22e00 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 0a 20 20  ger->errCode .  
22e10 29 7b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65  ){.    if( isOpe
22e20 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
22e30 7b 0a 20 20 20 20 20 20 69 73 45 72 72 6f 72 52  {.      isErrorR
22e40 65 73 65 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eset = 1;.    }.
22e50 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
22e60 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  ode = SQLITE_OK;
22e70 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
22e80 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
22e90 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
22ea0 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20   is still in an 
22eb0 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20  error state, do 
22ec0 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65  not proceed. The
22ed0 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61   error .  ** sta
22ee0 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  te will be clear
22ef0 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74  ed at some point
22f00 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77   in the future w
22f10 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20  hen all page .  
22f20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72  ** references ar
22f30 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68  e dropped and th
22f40 65 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  e cache can be d
22f50 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20  iscarded..  */. 
22f60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
22f70 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e  Code && pPager->
22f80 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f  errCode!=SQLITE_
22f90 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75  FULL ){.    retu
22fa0 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  rn pPager->errCo
22fb0 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  de;.  }..  if( p
22fc0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
22fd0 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73  GER_UNLOCK || is
22fe0 45 72 72 6f 72 52 65 73 65 74 20 29 7b 0a 20 20  ErrorReset ){.  
22ff0 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 20    sqlite3_vfs * 
23000 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50 61  const pVfs = pPa
23010 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69  ger->pVfs;.    i
23020 6e 74 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20  nt isHotJournal 
23030 3d 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28  = 0;.    assert(
23040 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 61   !MEMDB );.    a
23050 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 50 63  ssert( sqlite3Pc
23060 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61  acheRefCount(pPa
23070 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30  ger->pPCache)==0
23080 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70 50 61   );.    if( !pPa
23090 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20  ger->noReadlock 
230a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
230b0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
230c0 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f  (pPager, SHARED_
230d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28  LOCK);.      if(
230e0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
230f0 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
23100 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
23110 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
23120 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
23130 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
23140 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 7d  er, rc);.      }
23150 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70  .    }else if( p
23160 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
23170 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
23180 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
23190 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
231a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
231b0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
231c0 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  e>=SHARED_LOCK )
231d0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  ;..    /* If a j
231e0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
231f0 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
23200 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
23210 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20  k on the.    ** 
23220 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74  database file, t
23230 68 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65  hen it either ne
23240 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64  eds to be played
23250 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64   back or deleted
23260 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
23270 20 21 69 73 45 72 72 6f 72 52 65 73 65 74 20 29   !isErrorReset )
23280 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 68 61 73  {.      rc = has
23290 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  HotJournal(pPage
232a0 72 2c 20 26 69 73 48 6f 74 4a 6f 75 72 6e 61 6c  r, &isHotJournal
232b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
232c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
232d0 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
232e0 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  d;.      }.    }
232f0 0a 20 20 20 20 69 66 28 20 69 73 45 72 72 6f 72  .    if( isError
23300 52 65 73 65 74 20 7c 7c 20 69 73 48 6f 74 4a 6f  Reset || isHotJo
23310 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 2f  urnal ){.      /
23320 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53 49  * Get an EXCLUSI
23330 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
23340 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41 74  atabase file. At
23350 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20 69   this point it i
23360 73 0a 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72  s.      ** impor
23370 74 61 6e 74 20 74 68 61 74 20 61 20 52 45 53 45  tant that a RESE
23380 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
23390 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65   obtained on the
233a0 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20   way to the.    
233b0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
233c0 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
233d0 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
233e0 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
233f0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
23400 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
23410 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
23420 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
23430 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  hat the.      **
23440 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
23450 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
23460 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
23470 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 74 68  still rolling th
23480 65 20 0a 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d  e .      ** hot-
23490 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2e 0a 20 20  journal back..  
234a0 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 2a 2a      ** .      **
234b0 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
234c0 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
234d0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
234e0 65 71 75 65 73 74 65 64 2c 20 61 6e 79 0a 20 20  equested, any.  
234f0 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 70 72 6f      ** other pro
23500 63 65 73 73 20 61 74 74 65 6d 70 74 69 6e 67 20  cess attempting 
23510 74 6f 20 61 63 63 65 73 73 20 74 68 65 20 64 61  to access the da
23520 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 6c 6c  tabase file will
23530 20 67 65 74 20 74 6f 20 0a 20 20 20 20 20 20 2a   get to .      *
23540 2a 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20  * this point in 
23550 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69  the code and fai
23560 6c 20 74 6f 20 6f 62 74 61 69 6e 20 69 74 73 20  l to obtain its 
23570 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
23580 63 6b 20 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ck .      ** on 
23590 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
235a0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
235b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
235c0 61 74 65 3c 45 58 43 4c 55 53 49 56 45 5f 4c 4f  ate<EXCLUSIVE_LO
235d0 43 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  CK ){.        rc
235e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
235f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  (pPager->fd, EXC
23600 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
23610 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23620 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23630 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
23640 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
23650 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
23660 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
23670 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67    }.        pPag
23680 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
23690 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20  R_EXCLUSIVE;.   
236a0 20 20 20 7d 0a 20 0a 20 20 20 20 20 20 2f 2a 20     }. .      /* 
236b0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
236c0 20 66 6f 72 20 72 65 61 64 2f 77 72 69 74 65 20   for read/write 
236d0 61 63 63 65 73 73 2e 20 54 68 69 73 20 69 73 20  access. This is 
236e0 62 65 63 61 75 73 65 20 69 6e 20 0a 20 20 20 20  because in .    
236f0 20 20 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61    ** exclusive-a
23700 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66  ccess mode the f
23710 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 77  ile descriptor w
23720 69 6c 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e  ill be kept open
23730 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 70 6f   and.      ** po
23740 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
23750 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
23760 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
23770 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
23780 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65     ** OsTruncate
23790 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20  () call used in 
237a0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
237b0 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69   mode also requi
237c0 72 65 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 72  res.      ** a r
237d0 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20 68  ead/write file h
237e0 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 2a 2f 0a  andle..      */.
237f0 20 20 20 20 20 20 69 66 28 20 21 69 73 4f 70 65        if( !isOpe
23800 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
23810 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 65  {.        int re
23820 73 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  s;.        rc = 
23830 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28  sqlite3OsAccess(
23840 70 56 66 73 2c 70 50 61 67 65 72 2d 3e 7a 4a 6f  pVfs,pPager->zJo
23850 75 72 6e 61 6c 2c 53 51 4c 49 54 45 5f 41 43 43  urnal,SQLITE_ACC
23860 45 53 53 5f 45 58 49 53 54 53 2c 26 72 65 73 29  ESS_EXISTS,&res)
23870 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
23880 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23890 20 20 20 20 20 20 20 20 20 69 66 28 20 72 65 73           if( res
238a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
238b0 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
238c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 20            int f 
238d0 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
238e0 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
238f0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
23900 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
23910 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 74  sert( !pPager->t
23920 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20 20 20 20  empFile );.     
23930 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
23940 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
23950 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
23960 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66  , pPager->jfd, f
23970 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
23980 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63        assert( rc
23990 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69  !=SQLITE_OK || i
239a0 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  sOpen(pPager->jf
239b0 64 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  d) );.          
239c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
239d0 5f 4f 4b 20 26 26 20 66 6f 75 74 26 53 51 4c 49  _OK && fout&SQLI
239e0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
239f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23a00 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 41    rc = SQLITE_CA
23a10 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 20 20 20 20  NTOPEN;.        
23a20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
23a30 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
23a40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
23a50 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
23a60 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
23a70 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
23a80 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2c 20  does not exist, 
23a90 74 68 61 74 20 6d 65 61 6e 73 20 73 6f 6d 65 20  that means some 
23aa0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20  other process.  
23ab0 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68 61 73            ** has
23ac0 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c 65 64 20   already rolled 
23ad0 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20 20 20 20  it back */.     
23ae0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
23af0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
23b00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
23b10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23b20 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23b30 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  {.        goto f
23b40 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a  ailed;.      }..
23b50 20 20 20 20 20 20 2f 2a 20 54 4f 44 4f 3a 20 57        /* TODO: W
23b60 68 79 20 61 72 65 20 74 68 65 73 65 20 63 6c 65  hy are these cle
23b70 61 72 65 64 20 68 65 72 65 3f 20 49 73 20 69 74  ared here? Is it
23b80 20 6e 65 63 65 73 73 61 72 79 3f 20 2a 2f 0a 20   necessary? */. 
23b90 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
23ba0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
23bb0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
23bc0 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20  ournalOff = 0;. 
23bd0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
23be0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
23bf0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
23c00 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
23c10 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e    /* Playback an
23c20 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  d delete the jou
23c30 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20  rnal.  Drop the 
23c40 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20  database write. 
23c50 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64       ** lock and
23c60 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20 72   reacquire the r
23c70 65 61 64 20 6c 6f 63 6b 2e 20 50 75 72 67 65 20  ead lock. Purge 
23c80 74 68 65 20 63 61 63 68 65 20 62 65 66 6f 72 65  the cache before
23c90 0a 20 20 20 20 20 20 2a 2a 20 70 6c 61 79 69 6e  .      ** playin
23ca0 67 20 62 61 63 6b 20 74 68 65 20 68 6f 74 2d 6a  g back the hot-j
23cb0 6f 75 72 6e 61 6c 20 73 6f 20 74 68 61 74 20 77  ournal so that w
23cc0 65 20 64 6f 6e 27 74 20 65 6e 64 20 75 70 20 77  e don't end up w
23cd0 69 74 68 0a 20 20 20 20 20 20 2a 2a 20 61 6e 20  ith.      ** an 
23ce0 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 63 61 63  inconsistent cac
23cf0 68 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  he..      */.   
23d00 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
23d10 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31  ayback(pPager, 1
23d20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
23d30 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23d40 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
23d50 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
23d60 63 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  c);.        goto
23d70 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d   failed;.      }
23d80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28  .      assert( (
23d90 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
23da0 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20  AGER_SHARED).   
23db0 20 20 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67          || (pPag
23dc0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
23dd0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  e && pPager->sta
23de0 74 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29  te>PAGER_SHARED)
23df0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
23e00 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
23e10 3e 70 42 61 63 6b 75 70 20 7c 7c 20 73 71 6c 69  >pBackup || sqli
23e20 74 65 33 50 63 61 63 68 65 50 61 67 65 63 6f 75  te3PcachePagecou
23e30 6e 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  nt(pPager->pPCac
23e40 68 65 29 3e 30 20 29 7b 0a 20 20 20 20 20 20 2f  he)>0 ){.      /
23e50 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
23e60 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
23e70 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
23e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
23e90 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65      ** and there
23ea0 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67   are already pag
23eb0 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20  es in the cache 
23ec0 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73  (from a previous
23ed0 0a 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 6f  .      ** read o
23ee0 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63 74  r write transact
23ef0 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f 20  ion).  Check to 
23f00 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61 62  see if the datab
23f10 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 68 61 73  ase.      ** has
23f20 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20   been modified. 
23f30 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
23f40 20 68 61 73 20 63 68 61 6e 67 65 64 2c 20 66 6c   has changed, fl
23f50 75 73 68 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ush the.      **
23f60 20 63 61 63 68 65 2e 0a 20 20 20 20 20 20 2a 2a   cache..      **
23f70 0a 20 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61  .      ** Databa
23f80 73 65 20 63 68 61 6e 67 65 73 20 69 73 20 64 65  se changes is de
23f90 74 65 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e  tected by lookin
23fa0 67 20 61 74 20 31 35 20 62 79 74 65 73 20 62 65  g at 15 bytes be
23fb0 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20 20 2a 2a  ginning.      **
23fc0 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
23fd0 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
23fe0 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
23ff0 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
24000 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
24010 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
24020 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
24030 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
24040 20 54 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 74   The.      ** ot
24050 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65  her bytes change
24060 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65   randomly with e
24070 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20  ach file change 
24080 77 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 61 20  when.      ** a 
24090 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65 2e  codec is in use.
240a0 0a 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20  .      ** .     
240b0 20 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76   ** There is a v
240c0 61 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c  anishingly small
240d0 20 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63   chance that a c
240e0 68 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62  hange will not b
240f0 65 20 0a 20 20 20 20 20 20 2a 2a 20 64 65 74 65  e .      ** dete
24100 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e 63  cted.  The chanc
24110 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63 74  e of an undetect
24120 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f 20  ed change is so 
24130 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20 20  small that.     
24140 20 2a 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65   ** it can be ne
24150 67 6c 65 63 74 65 64 2e 0a 20 20 20 20 20 20 2a  glected..      *
24160 2f 0a 20 20 20 20 20 20 63 68 61 72 20 64 62 46  /.      char dbF
24170 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
24180 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
24190 73 29 5d 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  s)];.      sqlit
241a0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
241b0 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 0a 20 20  (pPager, 0);..  
241c0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
241d0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
241e0 20 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e     rc = pPager->
241f0 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 20  errCode;.       
24200 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
24210 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 61 73 73      }..      ass
24220 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ert( pPager->dbS
24230 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 20 20  izeValid );.    
24240 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
24250 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20  Size>0 ){.      
24260 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45    IOTRACE(("CKVE
24270 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RS %p %d\n", pPa
24280 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ger, sizeof(dbFi
24290 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20  leVers)));.     
242a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
242b0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
242c0 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
242d0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
242e0 29 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20  ), 24);.        
242f0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24300 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67  K ){.          g
24310 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
24320 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
24330 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
24340 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30 2c  t(dbFileVers, 0,
24350 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65   sizeof(dbFileVe
24360 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  rs));.      }.. 
24370 20 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28       if( memcmp(
24380 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
24390 72 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20  rs, dbFileVers, 
243a0 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72  sizeof(dbFileVer
243b0 73 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  s))!=0 ){.      
243c0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
243d0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
243e0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
243f0 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
24400 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65 72  veMode || pPager
24410 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
24420 48 41 52 45 44 20 29 3b 0a 20 20 7d 0a 0a 20 66  HARED );.  }.. f
24430 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72 63 21  ailed:.  if( rc!
24440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24450 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c 6f 63    /* pager_unloc
24460 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66  k() is a no-op f
24470 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  or exclusive mod
24480 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72 79 20  e and in-memory 
24490 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a 20 20  databases. */.  
244a0 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
244b0 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65  Pager);.  }.  re
244c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
244d0 2a 20 49 66 20 74 68 65 20 72 65 66 65 72 65 6e  * If the referen
244e0 63 65 20 63 6f 75 6e 74 20 68 61 73 20 72 65 61  ce count has rea
244f0 63 68 65 64 20 7a 65 72 6f 2c 20 72 6f 6c 6c 62  ched zero, rollb
24500 61 63 6b 20 61 6e 79 20 61 63 74 69 76 65 0a 2a  ack any active.*
24510 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  * transaction an
24520 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 70 61 67  d unlock the pag
24530 65 72 2e 0a 2a 2a 0a 2a 2a 20 45 78 63 65 70 74  er..**.** Except
24540 2c 20 69 6e 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64  , in locking_mod
24550 65 3d 45 58 43 4c 55 53 49 56 45 20 77 68 65 6e  e=EXCLUSIVE when
24560 20 74 68 65 72 65 20 69 73 20 6e 6f 74 68 69 6e   there is nothin
24570 67 20 74 6f 20 69 6e 0a 2a 2a 20 74 68 65 20 72  g to in.** the r
24580 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c  ollback journal,
24590 20 74 68 65 20 75 6e 6c 6f 63 6b 20 69 73 20 6e   the unlock is n
245a0 6f 74 20 70 65 72 66 6f 72 6d 65 64 20 61 6e 64  ot performed and
245b0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 74   there is.** not
245c0 68 69 6e 67 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  hing to rollback
245d0 2c 20 73 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  , so this routin
245e0 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f  e is a no-op..*/
245f0 20 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61   .static void pa
24600 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75 73 65  gerUnlockIfUnuse
24610 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  d(Pager *pPager)
24620 7b 0a 20 20 69 66 28 20 28 73 71 6c 69 74 65 33  {.  if( (sqlite3
24630 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
24640 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
24650 3d 30 29 0a 20 20 20 26 26 20 28 21 70 50 61 67  =0).   && (!pPag
24660 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
24670 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
24680 72 6e 61 6c 4f 66 66 3e 30 29 20 0a 20 20 29 7b  rnalOff>0) .  ){
24690 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
246a0 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
246b0 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
246c0 2a 20 44 72 6f 70 20 61 20 70 61 67 65 20 66 72  * Drop a page fr
246d0 6f 6d 20 74 68 65 20 63 61 63 68 65 20 75 73 69  om the cache usi
246e0 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
246f0 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Drop()..**.** If
24700 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 65 72   this means ther
24710 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67  e are now no pag
24720 65 73 20 77 69 74 68 20 72 65 66 65 72 65 6e 63  es with referenc
24730 65 73 20 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f  es to them, a ro
24740 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
24750 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
24760 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
24770 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61   removed..*/.sta
24780 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 44 72  tic void pagerDr
24790 6f 70 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  opPage(DbPage *p
247a0 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
247b0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
247c0 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  er;.  sqlite3Pca
247d0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
247e0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
247f0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  sed(pPager);.}..
24800 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
24810 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
24820 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
24830 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
24840 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
24850 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
24860 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
24870 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
24880 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
24890 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
248a0 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
248b0 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
248c0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
248d0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
248e0 6f 6e 20 63 61 6c 6c 73 20 70 61 67 65 72 53 68  on calls pagerSh
248f0 61 72 65 64 4c 6f 63 6b 28 29 20 74 6f 20 6f 62  aredLock() to ob
24900 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
24910 63 6b 20 6f 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ck on.** the dat
24920 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 73 75  abase file if su
24930 63 68 20 61 20 6c 6f 63 6b 20 6f 72 20 67 72 65  ch a lock or gre
24940 61 74 65 72 20 69 73 20 6e 6f 74 20 61 6c 72 65  ater is not alre
24950 61 64 79 20 68 65 6c 64 2e 0a 2a 2a 20 54 68 69  ady held..** Thi
24960 73 20 6d 61 79 20 63 61 75 73 65 20 68 6f 74 2d  s may cause hot-
24970 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
24980 20 6f 72 20 61 20 63 61 63 68 65 20 70 75 72 67   or a cache purg
24990 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 0a  e. See comments.
249a0 2a 2a 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ** above functio
249b0 6e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  n pagerSharedLoc
249c0 6b 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  k() for details.
249d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
249e0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
249f0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
24a00 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
24a10 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
24a20 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
24a30 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
24a40 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
24a50 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
24a60 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
24a70 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
24a80 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
24a90 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
24aa0 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
24ab0 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
24ac0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
24ad0 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
24ae0 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
24af0 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
24b00 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
24b10 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
24b20 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
24b30 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
24b40 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
24b50 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
24b60 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
24b70 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
24b80 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
24b90 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
24ba0 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
24bb0 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
24bc0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
24bd0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
24be0 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
24bf0 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
24c00 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
24c10 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
24c20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
24c30 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
24c40 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
24c50 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
24c60 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
24c70 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
24c80 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
24c90 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
24ca0 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
24cb0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
24cc0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
24cd0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
24ce0 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
24cf0 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
24d00 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
24d10 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
24d20 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
24d30 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
24d40 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
24d50 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
24d60 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
24d70 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
24d80 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
24d90 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
24da0 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
24db0 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
24dc0 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65  two seperate sce
24dd0 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
24de0 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
24df0 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
24e00 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
24e10 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
24e20 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
24e30 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
24e40 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
24e50 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
24e60 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
24e70 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
24e80 63 68 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  che to populate 
24e90 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
24ea0 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
24eb0 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
24ec0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
24ed0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
24ee0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
24ef0 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
24f00 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
24f10 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
24f20 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
24f30 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
24f40 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
24f50 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
24f60 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
24f70 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
24f80 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
24f90 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
24fa0 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
24fb0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
24fc0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
24fd0 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
24fe0 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
24ff0 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
25000 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
25010 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
25020 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
25030 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
25040 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
25050 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
25060 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
25070 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
25080 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
25090 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
250a0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
250b0 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
250c0 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
250d0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
250e0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
250f0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
25100 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
25110 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
25120 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
25130 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
25140 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
25150 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
25160 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
25170 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
25180 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
25190 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
251a0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
251b0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
251c0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
251d0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
251e0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
251f0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
25200 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
25210 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
25220 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
25230 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
25240 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
25250 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
25260 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
25270 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
25280 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
25290 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
252a0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
252b0 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
252c0 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
252d0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
252e0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
252f0 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
25300 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
25310 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
25320 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
25330 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
25340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
25350 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
25360 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
25370 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
25380 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
25390 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
253a0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
253b0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
253c0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
253d0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
253e0 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
253f0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
25400 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
25410 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
25420 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
25430 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
25440 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
25450 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
25460 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
25470 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20  ER_UNLOCK .     
25480 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63    || sqlite3Pcac
25490 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
254a0 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20  r->pPCache)>0 . 
254b0 20 20 20 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31        || pgno==1
254c0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  .  );..  /* The 
254d0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
254e0 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
254f0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
25500 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a  PT if a page.  *
25510 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
25520 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a   than this, or z
25530 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65  ero, is requeste
25540 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  d..  */.  if( pg
25550 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
25560 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20  O || pgno==0 || 
25570 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
25580 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
25590 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
255a0 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
255b0 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
255c0 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68  re we have not h
255d0 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20  it any critical 
255e0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20  errors..  */ .  
255f0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
25600 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  0 );.  *ppPage =
25610 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   0;..  /* If thi
25620 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
25630 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
25640 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
25650 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
25660 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
25670 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
25680 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  ) is a no-op if 
25690 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65  .  ** a database
256a0 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
256b0 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63   held..  */.  rc
256c0 20 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f   = pagerSharedLo
256d0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
256e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
256f0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
25700 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
25710 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
25720 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a  AGER_UNLOCK );..
25730 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
25740 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
25750 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
25760 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28   1, &pPg);.  if(
25770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25780 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
25790 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
257a0 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  Pg->pgno==pgno )
257b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
257c0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
257d0 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  || pPg->pPager==
257e0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  0 );.  if( pPg->
257f0 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pPager==0 ){.   
25800 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
25810 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
25820 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
25830 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
25840 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
25850 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a  ialized..    */.
25860 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20      int nMax;.  
25870 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
25880 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
25890 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
258a0 50 61 67 65 72 3b 0a 0a 20 20 20 20 72 63 20 3d  Pager;..    rc =
258b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
258c0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
258d0 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72  nMax);.    if( r
258e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
258f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
25900 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
25910 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
25920 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d     }..    if( nM
25930 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
25940 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65  MEMDB || noConte
25950 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
25960 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
25970 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gno ){.        s
25980 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
25990 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
259a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
259b0 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
259c0 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
259d0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
259e0 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
259f0 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
25a00 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
25a10 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
25a20 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
25a30 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
25a40 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
25a50 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
25a60 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
25a70 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
25a80 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
25a90 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
25aa0 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
25ab0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
25ac0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
25ad0 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
25ae0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
25af0 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
25b00 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
25b10 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
25b20 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
25b30 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
25b40 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
25b50 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
25b60 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
25b70 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
25b80 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
25b90 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
25ba0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
25bb0 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
25bc0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
25bd0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
25be0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
25bf0 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
25c00 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
25c10 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
25c20 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
25c30 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
25c40 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
25c50 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
25c60 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
25c70 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 65  lloc();.      }e
25c80 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
25c90 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
25ca0 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
25cb0 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
25cc0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
25cd0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
25ce0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
25cf0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
25d00 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
25d10 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
25d20 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
25d30 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
25d40 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
25d50 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
25d60 72 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a  rDropPage(pPg);.
25d70 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
25d80 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
25d90 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
25da0 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
25db0 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
25dc0 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
25dd0 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c  g);.#endif.  }el
25de0 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72  se{.    /* The r
25df0 65 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73  equested page is
25e00 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
25e10 68 65 2e 20 2a 2f 0a 20 20 20 20 50 41 47 45 52  he. */.    PAGER
25e20 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48  _INCR(pPager->nH
25e30 69 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 50  it);.  }..  *ppP
25e40 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74  age = pPg;.  ret
25e50 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
25e60 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
25e70 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20  a page if it is 
25e80 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69  already in the i
25e90 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20  n-memory cache. 
25ea0 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20   Do.** not read 
25eb0 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69  the page from di
25ec0 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f  sk.  Return a po
25ed0 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
25ee0 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68  e,.** or 0 if th
25ef0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
25f00 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65   cache. Also, re
25f10 74 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a  turn 0 if the .*
25f20 2a 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41  * pager is in PA
25f30 47 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65  GER_UNLOCK state
25f40 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
25f50 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ion is called,.*
25f60 2a 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65  * or if the page
25f70 72 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  r is in an error
25f80 20 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61   state other tha
25f90 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a  n SQLITE_FULL..*
25fa0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
25fb0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
25fc0 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
25fd0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
25fe0 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
25ff0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
26000 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
26010 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
26020 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
26030 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
26040 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
26050 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
26060 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
26070 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
26080 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
26090 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
260a0 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
260b0 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
260c0 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
260d0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
260e0 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
260f0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
26100 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
26110 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
26120 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  er!=0 );.  asser
26130 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20  t( pgno!=0 );.. 
26140 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74   if( (pPager->st
26150 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
26160 4b 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72  K).   && (pPager
26170 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54  ->errCode==SQLIT
26180 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e  E_OK || pPager->
26190 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f  errCode==SQLITE_
261a0 46 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73  FULL).  ){.    s
261b0 71 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63  qlite3PcacheFetc
261c0 68 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  h(pPager->pPCach
261d0 65 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67  e, pgno, 0, &pPg
261e0 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
261f0 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   pPg;.}../*.** R
26200 65 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65  elease a page re
26210 66 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49  ference..**.** I
26220 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
26230 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
26240 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
26250 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
26260 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
26270 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
26280 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
26290 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
262a0 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
262b0 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
262c0 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
262d0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
262e0 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
262f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
26300 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
26310 65 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70  e *pPg){.  if( p
26320 50 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20  Pg ){.    Pager 
26330 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
26340 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
26350 65 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28  e3PcacheRelease(
26360 70 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55  pPg);.    pagerU
26370 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50  nlockIfUnused(pP
26380 61 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ager);.  }.}../*
26390 0a 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20  .** If the main 
263a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73  journal file has
263b0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70   already been op
263c0 65 6e 65 64 2c 20 65 6e 73 75 72 65 20 74 68 61  ened, ensure tha
263d0 74 20 74 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75  t the.** sub-jou
263e0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65  rnal file is ope
263f0 6e 20 74 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61  n too. If the ma
26400 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  in journal is no
26410 74 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20  t open,.** this 
26420 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f  function is a no
26430 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54  -op..**.** SQLIT
26440 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
26450 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67   if everything g
26460 6f 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  oes according to
26470 20 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51   plan. .** An SQ
26480 4c 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65  LITE_IOERR_XXX e
26490 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
264a0 75 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20  urned if a call 
264b0 74 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73  to .** sqlite3Os
264c0 4f 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f  Open() fails..*/
264d0 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e  .static int open
264e0 53 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  SubJournal(Pager
264f0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26500 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26510 0a 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50  .  if( isOpen(pP
26520 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69  ager->jfd) && !i
26530 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a  sOpen(pPager->sj
26540 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70  fd) ){.    if( p
26550 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
26560 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
26570 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 7c 7c 20  LMODE_MEMORY || 
26580 70 50 61 67 65 72 2d 3e 73 75 62 6a 49 6e 4d 65  pPager->subjInMe
26590 6d 6f 72 79 20 29 7b 0a 20 20 20 20 20 20 73 71  mory ){.      sq
265a0 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61 6c 4f  lite3MemJournalO
265b0 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
265c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
265d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 4f 70      rc = pagerOp
265e0 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2c 20 70  entemp(pPager, p
265f0 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 53 51 4c  Pager->sjfd, SQL
26600 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
26610 4e 41 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  NAL);.    }.  }.
26620 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26630 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
26640 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 61 74  ion is called at
26650 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 76   the start of ev
26660 65 72 79 20 77 72 69 74 65 20 74 72 61 6e 73 61  ery write transa
26670 63 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 72 65 20  ction..** There 
26680 6d 75 73 74 20 61 6c 72 65 61 64 79 20 62 65 20  must already be 
26690 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
266a0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
266b0 74 68 65 20 64 61 74 61 62 61 73 65 20 0a 2a 2a  the database .**
266c0 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
266d0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
266e0 64 2e 0a 2a 2a 0a 2a 2a 20 4f 70 65 6e 20 74 68  d..**.** Open th
266f0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
26700 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
26710 61 6e 64 20 77 72 69 74 65 20 61 20 6a 6f 75 72  and write a jour
26720 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a 20 74 6f  nal header.** to
26730 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
26740 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 61  . If there are a
26750 63 74 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73  ctive savepoints
26760 2c 20 6f 70 65 6e 20 74 68 65 20 73 75 62 2d 6a  , open the sub-j
26770 6f 75 72 6e 61 6c 0a 2a 2a 20 61 73 20 77 65 6c  ournal.** as wel
26780 6c 2e 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  l. This function
26790 20 69 73 20 6f 6e 6c 79 20 75 73 65 64 20 77 68   is only used wh
267a0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
267b0 69 6c 65 20 69 73 20 62 65 69 6e 67 20 0a 2a 2a  ile is being .**
267c0 20 6f 70 65 6e 65 64 20 74 6f 20 77 72 69 74 65   opened to write
267d0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6c 6f 67 20   a rollback log 
267e0 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74 69 6f  for a transactio
267f0 6e 2e 20 49 74 20 69 73 20 6e 6f 74 20 75 73 65  n. It is not use
26800 64 20 0a 2a 2a 20 77 68 65 6e 20 6f 70 65 6e 69  d .** when openi
26810 6e 67 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ng a hot journal
26820 20 66 69 6c 65 20 74 6f 20 72 6f 6c 6c 20 69 74   file to roll it
26830 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   back..**.** If 
26840 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26850 20 69 73 20 61 6c 72 65 61 64 79 20 6f 70 65 6e   is already open
26860 20 28 61 73 20 69 74 20 6d 61 79 20 62 65 20 69   (as it may be i
26870 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65  n exclusive mode
26880 29 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20  ),.** then this 
26890 66 75 6e 63 74 69 6f 6e 20 6a 75 73 74 20 77 72  function just wr
268a0 69 74 65 73 20 61 20 6a 6f 75 72 6e 61 6c 20 68  ites a journal h
268b0 65 61 64 65 72 20 74 6f 20 74 68 65 20 73 74 61  eader to the sta
268c0 72 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 6c 72  rt of the.** alr
268d0 65 61 64 79 20 6f 70 65 6e 20 66 69 6c 65 2e 20  eady open file. 
268e0 0a 2a 2a 0a 2a 2a 20 57 68 65 74 68 65 72 20 6f  .**.** Whether o
268f0 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61  r not the journa
26900 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
26910 20 62 79 20 74 68 69 73 20 66 75 6e 63 74 69 6f   by this functio
26920 6e 2c 20 74 68 65 0a 2a 2a 20 50 61 67 65 72 2e  n, the.** Pager.
26930 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 76 65  pInJournal bitve
26940 63 20 73 74 72 75 63 74 75 72 65 20 69 73 20 61  c structure is a
26950 6c 6c 6f 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20  llocated..**.** 
26960 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
26970 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69   if everything i
26980 73 20 73 75 63 63 65 73 73 66 75 6c 2e 20 4f 74  s successful. Ot
26990 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e 20  herwise, return 
269a0 0a 2a 2a 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  .** SQLITE_NOMEM
269b0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
269c0 74 6f 20 61 6c 6c 6f 63 61 74 65 20 50 61 67 65  to allocate Page
269d0 72 2e 70 49 6e 4a 6f 75 72 6e 61 6c 20 66 61 69  r.pInJournal fai
269e0 6c 73 2c 20 6f 72 20 0a 2a 2a 20 61 6e 20 49 4f  ls, or .** an IO
269f0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 6f   error code if o
26a00 70 65 6e 69 6e 67 20 6f 72 20 77 72 69 74 69 6e  pening or writin
26a10 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
26a20 6c 65 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61  le fails..*/.sta
26a30 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
26a40 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
26a50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
26a60 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
26a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a80 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
26a90 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
26aa0 74 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20  te3_vfs * const 
26ab0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
26ac0 56 66 73 3b 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  Vfs;   /* Local 
26ad0 63 61 63 68 65 20 6f 66 20 76 66 73 20 70 6f 69  cache of vfs poi
26ae0 6e 74 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72  nter */..  asser
26af0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
26b00 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
26b10 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26b20 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
26b30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
26b40 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
26b50 3d 3d 30 20 29 3b 0a 20 20 0a 20 20 2f 2a 20 49  ==0 );.  .  /* I
26b60 66 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  f already in the
26b70 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 74 68   error state, th
26b80 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61  is function is a
26b90 20 6e 6f 2d 6f 70 2e 20 2a 2f 0a 20 20 69 66 28   no-op. */.  if(
26ba0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
26bb0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
26bc0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
26bd0 20 20 7d 0a 0a 20 20 2f 2a 20 54 4f 44 4f 3a 20    }..  /* TODO: 
26be0 49 73 20 69 74 20 72 65 61 6c 6c 79 20 70 6f 73  Is it really pos
26bf0 73 69 62 6c 65 20 74 6f 20 67 65 74 20 68 65 72  sible to get her
26c00 65 20 77 69 74 68 20 64 62 53 69 7a 65 56 61 6c  e with dbSizeVal
26c10 69 64 3d 3d 30 3f 20 49 66 20 6e 6f 74 2c 0a 20  id==0? If not,. 
26c20 20 2a 2a 20 74 68 65 20 63 61 6c 6c 20 74 6f 20   ** the call to 
26c30 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 29  PagerPagecount()
26c40 20 63 61 6e 20 62 65 20 72 65 6d 6f 76 65 64 2e   can be removed.
26c50 0a 20 20 2a 2f 0a 20 20 74 65 73 74 63 61 73 65  .  */.  testcase
26c60 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
26c70 56 61 6c 69 64 3d 3d 30 20 29 3b 0a 20 20 73 71  Valid==0 );.  sq
26c80 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
26c90 75 6e 74 28 70 50 61 67 65 72 2c 20 30 29 3b 0a  unt(pPager, 0);.
26ca0 0a 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  .  pPager->pInJo
26cb0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
26cc0 69 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67  itvecCreate(pPag
26cd0 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 69  er->dbSize);.  i
26ce0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  f( pPager->pInJo
26cf0 75 72 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20  urnal==0 ){.    
26d00 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
26d10 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4f  MEM;.  }..  /* O
26d20 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
26d30 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 6e 6f  file if it is no
26d40 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 2e 20  t already open. 
26d50 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f 70 65 6e  */.  if( !isOpen
26d60 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
26d70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
26d80 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41  >journalMode==PA
26d90 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
26da0 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20 20 20  MEMORY ){.      
26db0 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
26dc0 6c 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66  lOpen(pPager->jf
26dd0 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  d);.    }else{. 
26de0 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20 66       const int f
26df0 6c 61 67 73 20 3d 20 20 20 20 20 20 20 20 20 20  lags =          
26e00 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46 53 20           /* VFS 
26e10 66 6c 61 67 73 20 74 6f 20 6f 70 65 6e 20 6a 6f  flags to open jo
26e20 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
26e30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45        SQLITE_OPE
26e40 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
26e50 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a  TE_OPEN_CREATE|.
26e60 20 20 20 20 20 20 20 20 28 70 50 61 67 65 72 2d          (pPager-
26e70 3e 74 65 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20  >tempFile ? .   
26e80 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
26e90 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53  PEN_DELETEONCLOS
26ea0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45  E|SQLITE_OPEN_TE
26eb0 4d 50 5f 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20  MP_JOURNAL):.   
26ec0 20 20 20 20 20 20 20 28 53 51 4c 49 54 45 5f 4f         (SQLITE_O
26ed0 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c  PEN_MAIN_JOURNAL
26ee0 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 23 69 66  ).        );.#if
26ef0 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
26f00 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20  E_ATOMIC_WRITE. 
26f10 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26f20 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20  3JournalOpen(.  
26f30 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
26f40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
26f50 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
26f60 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
26f70 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 20  ze(pPager).     
26f80 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   );.#else.      
26f90 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
26fa0 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
26fb0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
26fc0 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30  r->jfd, flags, 0
26fd0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
26fe0 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
26ff0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f  SQLITE_OK || isO
27000 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
27010 20 29 3b 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57   );.  }...  /* W
27020 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
27030 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f  ournal header to
27040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27050 65 20 61 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a  e and open .  **
27060 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c   the sub-journal
27070 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 20   if necessary.. 
27080 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   */.  if( rc==SQ
27090 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
270a0 2a 20 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66  * TODO: Check if
270b0 20 61 6c 6c 20 6f 66 20 74 68 65 73 65 20 61 72   all of these ar
270c0 65 20 72 65 61 6c 6c 79 20 72 65 71 75 69 72 65  e really require
270d0 64 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  d. */.    pPager
270e0 2d 3e 64 62 4f 72 69 67 53 69 7a 65 20 3d 20 70  ->dbOrigSize = p
270f0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
27100 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
27110 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
27120 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
27130 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  ync = 0;.    pPa
27140 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
27150 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
27160 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70  alOff = 0;.    p
27170 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
27180 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
27190 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
271a0 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  ;.    rc = write
271b0 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
271c0 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  r);.  }.  if( rc
271d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
271e0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
271f0 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70  t ){.    rc = op
27200 65 6e 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61  enSubJournal(pPa
27210 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ger);.  }..  if(
27220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
27230 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74  {.    sqlite3Bit
27240 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
27250 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a  r->pInJournal);.
27260 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a      pPager->pInJ
27270 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a  ournal = 0;.  }.
27280 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27290 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 61 20 77 72  /*.** Begin a wr
272a0 69 74 65 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20  ite-transaction 
272b0 6f 6e 20 74 68 65 20 73 70 65 63 69 66 69 65 64  on the specified
272c0 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e 20 49   pager object. I
272d0 66 20 61 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72  f a .** write-tr
272e0 61 6e 73 61 63 74 69 6f 6e 20 68 61 73 20 61 6c  ansaction has al
272f0 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65 6e 65  ready been opene
27300 64 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  d, this function
27310 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
27320 2a 2a 20 49 66 20 74 68 65 20 65 78 46 6c 61 67  ** If the exFlag
27330 20 61 72 67 75 6d 65 6e 74 20 69 73 20 66 61 6c   argument is fal
27340 73 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65  se, then acquire
27350 20 61 74 20 6c 65 61 73 74 20 61 20 52 45 53 45   at least a RESE
27360 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20  RVED.** lock on 
27370 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27380 65 2e 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  e. If exFlag is 
27390 74 72 75 65 2c 20 74 68 65 6e 20 61 63 71 75 69  true, then acqui
273a0 72 65 20 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61  re at least.** a
273b0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
273c0 2e 20 49 66 20 73 75 63 68 20 61 20 6c 6f 63 6b  . If such a lock
273d0 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
273e0 2c 20 6e 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a  , no locking .**
273f0 20 66 75 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20   functions need 
27400 62 65 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  be called..**.**
27410 20 49 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20   If this is not 
27420 61 20 74 65 6d 70 6f 72 61 72 79 20 6f 72 20 69  a temporary or i
27430 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e  n-memory file an
27440 64 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  d, the journal f
27450 69 6c 65 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65  ile is .** opene
27460 64 20 69 66 20 69 74 20 68 61 73 20 6e 6f 74 20  d if it has not 
27470 62 65 65 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f  been already. Fo
27480 72 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  r a temporary fi
27490 6c 65 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  le, the opening 
274a0 0a 2a 2a 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  .** of the journ
274b0 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72  al file is defer
274c0 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20  red until there 
274d0 69 73 20 61 6e 20 61 63 74 75 61 6c 20 6e 65 65  is an actual nee
274e0 64 20 74 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74  d to .** write t
274f0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54  o the journal. T
27500 4f 44 4f 3a 20 57 68 79 20 68 61 6e 64 6c 65 20  ODO: Why handle 
27510 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
27520 64 69 66 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a  differently?.**.
27530 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
27540 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64  l file is opened
27550 20 28 6f 72 20 69 66 20 69 74 20 69 73 20 61 6c   (or if it is al
27560 72 65 61 64 79 20 6f 70 65 6e 29 2c 20 74 68 65  ready open), the
27570 6e 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68  n a.** journal-h
27580 65 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e  eader is written
27590 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
275a0 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68   it..**.** If th
275b0 65 20 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20 61  e subjInMemory a
275c0 72 67 75 6d 65 6e 74 20 69 73 20 6e 6f 6e 2d 7a  rgument is non-z
275d0 65 72 6f 2c 20 74 68 65 6e 20 61 6e 79 20 73 75  ero, then any su
275e0 62 2d 6a 6f 75 72 6e 61 6c 20 6f 70 65 6e 65 64  b-journal opened
275f0 0a 2a 2a 20 77 69 74 68 69 6e 20 74 68 69 73 20  .** within this 
27600 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c 6c  transaction will
27610 20 62 65 20 6f 70 65 6e 65 64 20 61 73 20 61 6e   be opened as an
27620 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 2e   in-memory file.
27630 20 54 68 69 73 0a 2a 2a 20 68 61 73 20 6e 6f 20   This.** has no 
27640 65 66 66 65 63 74 20 69 66 20 74 68 65 20 73 75  effect if the su
27650 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 72  b-journal is alr
27660 65 61 64 79 20 6f 70 65 6e 65 64 20 28 61 73 20  eady opened (as 
27670 69 74 20 6d 61 79 20 62 65 20 77 68 65 6e 0a 2a  it may be when.*
27680 2a 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  * running in exc
27690 6c 75 73 69 76 65 20 6d 6f 64 65 29 20 6f 72 20  lusive mode) or 
276a0 69 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  if the transacti
276b0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  on does not requ
276c0 69 72 65 20 61 0a 2a 2a 20 73 75 62 2d 6a 6f 75  ire a.** sub-jou
276d0 72 6e 61 6c 2e 20 49 66 20 74 68 65 20 73 75 62  rnal. If the sub
276e0 6a 49 6e 4d 65 6d 6f 72 79 20 61 72 67 75 6d 65  jInMemory argume
276f0 6e 74 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e  nt is zero, then
27700 20 61 6e 79 20 72 65 71 75 69 72 65 64 0a 2a 2a   any required.**
27710 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20   sub-journal is 
27720 69 6d 70 6c 65 6d 65 6e 74 65 64 20 69 6e 2d 6d  implemented in-m
27730 65 6d 6f 72 79 20 69 66 20 70 50 61 67 65 72 20  emory if pPager 
27740 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  is an in-memory 
27750 64 61 74 61 62 61 73 65 2c 20 0a 2a 2a 20 6f 72  database, .** or
27760 20 75 73 69 6e 67 20 61 20 74 65 6d 70 6f 72 61   using a tempora
27770 72 79 20 66 69 6c 65 20 6f 74 68 65 72 77 69 73  ry file otherwis
27780 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
27790 33 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65  3PagerBegin(Page
277a0 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
277b0 78 46 6c 61 67 2c 20 69 6e 74 20 73 75 62 6a 49  xFlag, int subjI
277c0 6e 4d 65 6d 6f 72 79 29 7b 0a 20 20 69 6e 74 20  nMemory){.  int 
277d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
277e0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
277f0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
27800 4e 4c 4f 43 4b 20 29 3b 0a 20 20 70 50 61 67 65  NLOCK );.  pPage
27810 72 2d 3e 73 75 62 6a 49 6e 4d 65 6d 6f 72 79 20  r->subjInMemory 
27820 3d 20 28 75 38 29 73 75 62 6a 49 6e 4d 65 6d 6f  = (u8)subjInMemo
27830 72 79 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  ry;.  if( pPager
27840 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
27850 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
27860 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
27870 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
27880 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
27890 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
278a0 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20 2f 2a  pFile );..    /*
278b0 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45 52 56   Obtain a RESERV
278c0 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
278d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
278e0 20 74 68 65 20 65 78 46 6c 61 67 20 70 61 72 61   the exFlag para
278f0 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69 73 20  meter.    ** is 
27900 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d 65 64  true, then immed
27910 69 61 74 65 6c 79 20 75 70 67 72 61 64 65 20 74  iately upgrade t
27920 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  his to an EXCLUS
27930 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a 20 20  IVE lock. The.  
27940 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64 6c 65    ** busy-handle
27950 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e 20 62  r callback can b
27960 65 20 75 73 65 64 20 77 68 65 6e 20 75 70 67 72  e used when upgr
27970 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45 58 43  ading to the EXC
27980 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20 6c 6f  LUSIVE.    ** lo
27990 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68 65 6e  ck, but not when
279a0 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 52   obtaining the R
279b0 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a 20 20  ESERVED lock..  
279c0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71    */.    rc = sq
279d0 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
279e0 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44  er->fd, RESERVED
279f0 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28 20  _LOCK);.    if( 
27a00 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27a10 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
27a20 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53  tate = PAGER_RES
27a30 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69 66 28  ERVED;.      if(
27a40 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
27a50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
27a60 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
27a70 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
27a80 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
27a90 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
27aa0 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b 73 20   required locks 
27ab0 77 65 72 65 20 73 75 63 63 65 73 73 66 75 6c 6c  were successfull
27ac0 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70 65 6e  y obtained, open
27ad0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
27ae0 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77 72 69   ** file and wri
27af0 74 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  te the first jou
27b00 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f 20 69  rnal-header to i
27b10 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  t..    */.    if
27b20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27b30 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  && pPager->useJo
27b40 75 72 6e 61 6c 0a 20 20 20 20 20 26 26 20 70 50  urnal.     && pP
27b50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
27b60 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
27b70 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 29 7b  MODE_OFF .    ){
27b80 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
27b90 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
27ba0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
27bb0 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70 65 6e  }else if( isOpen
27bc0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26  (pPager->jfd) &&
27bd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27be0 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Off==0 ){.    /*
27bf0 20 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68   This happens wh
27c00 65 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73  en the pager was
27c10 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63   in exclusive-ac
27c20 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20 6c 61  cess mode the la
27c30 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65 20 61  st.    ** time a
27c40 20 28 72 65 61 64 20 6f 72 20 77 72 69 74 65 29   (read or write)
27c50 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
27c60 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 63 6f   successfully co
27c70 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a 20 62  ncluded.    ** b
27c80 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74 69 6f  y this connectio
27c90 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20 64 65  n. Instead of de
27ca0 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  leting the journ
27cb0 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73 20 0a  al file it was .
27cc0 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70 65 6e      ** kept open
27cd0 20 61 6e 64 20 65 69 74 68 65 72 20 77 61 73 20   and either was 
27ce0 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62  truncated to 0 b
27cf0 79 74 65 73 20 6f 72 20 69 74 73 20 68 65 61 64  ytes or its head
27d00 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20 6f 76  er was.    ** ov
27d10 65 72 77 72 69 74 74 65 6e 20 77 69 74 68 20 7a  erwritten with z
27d20 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eros..    */.   
27d30 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
27d40 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
27d50 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27d60 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20 29 3b  dbOrigSize==0 );
27d70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
27d80 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->pInJournal=
27d90 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
27da0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
27db0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  l(pPager);.  }..
27dc0 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 54    PAGERTRACE(("T
27dd0 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
27de0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
27df0 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  )));.  assert( !
27e00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
27e10 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  fd) || pPager->j
27e20 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72  ournalOff>0 || r
27e30 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a  c!=SQLITE_OK );.
27e40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
27e50 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73 69 6e  /*.** Mark a sin
27e60 67 6c 65 20 64 61 74 61 20 70 61 67 65 20 61 73  gle data page as
27e70 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 65 20   writeable. The 
27e80 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20  page is written 
27e90 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d 61 69  into the .** mai
27ea0 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73 75 62  n journal or sub
27eb0 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65 71 75  -journal as requ
27ec0 69 72 65 64 2e 20 49 66 20 74 68 65 20 70 61 67  ired. If the pag
27ed0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
27ee0 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  o.** one of the 
27ef0 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20 63 6f  journals, the co
27f00 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69 74 20  rresponding bit 
27f10 69 73 20 73 65 74 20 69 6e 20 74 68 65 20 0a 2a  is set in the .*
27f20 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e  * Pager.pInJourn
27f30 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20 74 68  al bitvec and th
27f40 65 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74  e PagerSavepoint
27f50 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 62 69  .pInSavepoint bi
27f60 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e 79 20  tvecs.** of any 
27f70 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74 73 20  open savepoints 
27f80 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  as appropriate..
27f90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
27fa0 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72 20  ger_write(PgHdr 
27fb0 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70  *pPg){.  void *p
27fc0 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
27fd0 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  a;.  Pager *pPag
27fe0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
27ff0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
28000 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68  ITE_OK;..  /* Ch
28010 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20  eck for errors. 
28020 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
28030 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20  ->errCode ){ .  
28040 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
28050 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
28060 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64  if( pPager->read
28070 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75  Only ){.    retu
28080 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a  rn SQLITE_PERM;.
28090 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21    }..  assert( !
280a0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
280b0 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  r );..  CHECK_PA
280c0 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d  GE(pPg);..  /* M
280d0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
280e0 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20 70  dirty.  If the p
280f0 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79 20  age has already 
28100 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a  been written.  *
28110 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * to the journal
28120 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74   then we can ret
28130 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a  urn right away..
28140 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 50 63    */.  sqlite3Pc
28150 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50  acheMakeDirty(pP
28160 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65 49 6e  g);.  if( pageIn
28170 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26 26 20  Journal(pPg) && 
28180 21 73 75 62 6a 52 65 71 75 69 72 65 73 50 61 67  !subjRequiresPag
28190 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20 70 50  e(pPg) ){.    pP
281a0 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64  ager->dbModified
281b0 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a   = 1;.  }else{..
281c0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74      /* If we get
281d0 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65   this far, it me
281e0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
281f0 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20  e needs to be.  
28200 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20    ** written to 
28210 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
28220 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63  journal or the c
28230 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61  keckpoint journa
28240 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68  l.    ** or both
28250 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
28260 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
28270 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  ee that the tran
28280 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
28290 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a  exists and.    *
282a0 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69  * create it if i
282b0 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20  t does not..    
282c0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
282d0 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
282e0 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20  GER_UNLOCK );.  
282f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
28300 67 65 72 42 65 67 69 6e 28 70 50 61 67 65 72 2c  gerBegin(pPager,
28310 20 30 2c 20 70 50 61 67 65 72 2d 3e 73 75 62 6a   0, pPager->subj
28320 49 6e 4d 65 6d 6f 72 79 29 3b 0a 20 20 20 20 69  InMemory);.    i
28330 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
28340 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
28350 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
28360 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
28370 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
28380 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
28390 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
283a0 6a 66 64 29 20 26 26 20 70 50 61 67 65 72 2d 3e  jfd) && pPager->
283b0 75 73 65 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  useJournal.     
283c0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
283d0 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50 41 47  journalMode!=PAG
283e0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f  ER_JOURNALMODE_O
283f0 46 46 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  FF ){.      rc =
28400 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
28410 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
28420 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28430 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
28440 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
28450 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
28460 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54 68   1;.  .    /* Th
28470 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
28480 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74 73  urnal now exists
28490 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20 52   and we have a R
284a0 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20 20  ESERVED or an.  
284b0 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
284c0 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20  ock on the main 
284d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
284e0 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e  Write the curren
284f0 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  t page to.    **
28500 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
28510 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20 69   journal if it i
28520 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65  s not there alre
28530 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ady..    */.    
28540 69 66 28 20 21 70 61 67 65 49 6e 4a 6f 75 72 6e  if( !pageInJourn
28550 61 6c 28 70 50 67 29 20 26 26 20 69 73 4f 70 65  al(pPg) && isOpe
28560 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29  n(pPager->jfd) )
28570 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d  {.      if( pPg-
28580 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
28590 62 4f 72 69 67 53 69 7a 65 20 29 7b 0a 20 20 20  bOrigSize ){.   
285a0 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
285b0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44          char *pD
285c0 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ata2;..        /
285d0 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76 65  * We should neve
285e0 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  r write to the j
285f0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 20  ournal file the 
28600 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20 20  page that.      
28610 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20 74 68    ** contains th
28620 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 73  e database locks
28630 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
28640 20 61 73 73 65 72 74 20 76 65 72 69 66 69 65 73   assert verifies
28650 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74  .        ** that
28660 20 77 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20   we do not. */. 
28670 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
28680 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
28690 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
286a0 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43  );.        CODEC
286b0 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  2(pPager, pData,
286c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 2c 20 72   pPg->pgno, 7, r
286d0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
286e0 45 4d 2c 20 70 44 61 74 61 32 29 3b 0a 20 20 20  EM, pData2);.   
286f0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
28700 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
28710 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
28720 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
28730 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
28740 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
28750 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e 70 67  rnalOff, pPg->pg
28760 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
28770 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
28780 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
28790 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
287a0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
287b0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
287c0 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
287d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
287e0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
287f0 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20  rnalOff + 4);.  
28800 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28810 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50  journalOff += pP
28820 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 34  ager->pageSize+4
28830 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28840 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
28850 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28860 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
28870 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
28880 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
28890 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  Off, cksum);.   
288a0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
288b0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
288c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
288d0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
288e0 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
288f0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
28900 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
28910 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28920 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 61 67  journalOff, pPag
28930 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a  er->pageSize));.
28940 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e          PAGER_IN
28950 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72  CR(sqlite3_pager
28960 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b 0a  _writej_count);.
28970 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
28980 43 45 28 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE(("JOURNAL %d 
28990 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
289a0 3d 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e  =%d hash(%08x)\n
289b0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
289c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
289d0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
289e0 20 20 20 20 20 20 20 20 20 20 28 28 70 50 67 2d            ((pPg-
289f0 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45  >flags&PGHDR_NEE
28a00 44 5f 53 59 4e 43 29 3f 31 3a 30 29 2c 20 70 61  D_SYNC)?1:0), pa
28a10 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
28a20 29 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  )));..        /*
28a30 20 45 76 65 6e 20 69 66 20 61 6e 20 49 4f 20 6f   Even if an IO o
28a40 72 20 64 69 73 6b 66 75 6c 6c 20 65 72 72 6f 72  r diskfull error
28a50 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c 65 20   occurred while 
28a60 6a 6f 75 72 6e 61 6c 6c 69 6e 67 20 74 68 65 0a  journalling the.
28a70 20 20 20 20 20 20 20 20 2a 2a 20 70 61 67 65 20          ** page 
28a80 69 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f  in the block abo
28a90 76 65 2c 20 73 65 74 20 74 68 65 20 6e 65 65 64  ve, set the need
28aa0 2d 73 79 6e 63 20 66 6c 61 67 20 66 6f 72 20 74  -sync flag for t
28ab0 68 65 20 70 61 67 65 2e 0a 20 20 20 20 20 20 20  he page..       
28ac0 20 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 77   ** Otherwise, w
28ad0 68 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74  hen the transact
28ae0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
28af0 63 6b 2c 20 74 68 65 20 6c 6f 67 69 63 20 69 6e  ck, the logic in
28b00 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6c 61 79  .        ** play
28b10 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 29 20  back_one_page() 
28b20 77 69 6c 6c 20 74 68 69 6e 6b 20 74 68 61 74 20  will think that 
28b30 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74  the page needs t
28b40 6f 20 62 65 20 72 65 73 74 6f 72 65 64 0a 20 20  o be restored.  
28b50 20 20 20 20 20 20 2a 2a 20 69 6e 20 74 68 65 20        ** in the 
28b60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
28b70 6e 64 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f  nd if an IO erro
28b80 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 64  r occurs while d
28b90 6f 69 6e 67 20 73 6f 2c 0a 20 20 20 20 20 20 20  oing so,.       
28ba0 20 2a 2a 20 74 68 65 6e 20 63 6f 72 72 75 70 74   ** then corrupt
28bb0 69 6f 6e 20 6d 61 79 20 66 6f 6c 6c 6f 77 2e 0a  ion may follow..
28bc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28bd0 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e     if( !pPager->
28be0 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
28bf0 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
28c00 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
28c10 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
28c20 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
28c30 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  1;.        }..  
28c40 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f        /* An erro
28c50 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 20 77  r has occurred w
28c60 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f  riting to the jo
28c70 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 65 20  urnal file. The 
28c80 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e  .        ** tran
28c90 73 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20  saction will be 
28ca0 72 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74  rolled back by t
28cb0 68 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a  he layer above..
28cc0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
28cd0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
28ce0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
28cf0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
28d00 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
28d10 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
28d20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
28d30 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
28d40 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  al!=0 );.       
28d50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 42 69 74   rc = sqlite3Bit
28d60 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
28d70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e  InJournal, pPg->
28d80 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 74  pgno);.        t
28d90 65 73 74 63 61 73 65 28 20 72 63 3d 3d 53 51 4c  estcase( rc==SQL
28da0 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
28db0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 3d       assert( rc=
28dc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 72 63  =SQLITE_OK || rc
28dd0 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  ==SQLITE_NOMEM )
28de0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 7c 3d 20  ;.        rc |= 
28df0 61 64 64 54 6f 53 61 76 65 70 6f 69 6e 74 42 69  addToSavepointBi
28e00 74 76 65 63 73 28 70 50 61 67 65 72 2c 20 70 50  tvecs(pPager, pP
28e10 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
28e20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
28e30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
28e40 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c   assert( rc==SQL
28e50 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20  ITE_NOMEM );.   
28e60 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
28e70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28e80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28e90 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
28ea0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20  urnalStarted && 
28eb0 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20  !pPager->noSync 
28ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  ){.          pPg
28ed0 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52  ->flags |= PGHDR
28ee0 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20  _NEED_SYNC;.    
28ef0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65        pPager->ne
28f00 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
28f10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
28f20 47 45 52 54 52 41 43 45 28 28 22 41 50 50 45 4e  GERTRACE(("APPEN
28f30 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
28f40 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
28f50 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
28f60 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
28f70 67 2d 3e 70 67 6e 6f 2c 0a 20 20 20 20 20 20 20  g->pgno,.       
28f80 20 20 20 20 20 20 20 20 28 28 70 50 67 2d 3e 66          ((pPg->f
28f90 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
28fa0 53 59 4e 43 29 3f 31 3a 30 29 29 29 3b 0a 20 20  SYNC)?1:0)));.  
28fb0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 0a 20      }.    }.  . 
28fc0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
28fd0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
28fe0 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
28ff0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
29000 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
29010 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
29020 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
29030 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
29040 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
29050 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
29060 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
29070 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
29080 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
29090 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
290a0 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
290b0 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
290c0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
290d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 75 62 6a   */.    if( subj
290e0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
290f0 29 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  ) ){.      rc = 
29100 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67 65 28 70  subjournalPage(p
29110 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
29120 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
29130 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
29140 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
29150 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
29160 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
29170 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20 70 50  ARED );.  if( pP
29180 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70 50 67  ager->dbSize<pPg
29190 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
291a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
291b0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 7d 0a 20 20  Pg->pgno;.  }.  
291c0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
291d0 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
291e0 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
291f0 65 2e 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  e. This routine 
29200 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62  must be called b
29210 65 66 6f 72 65 20 0a 2a 2a 20 6d 61 6b 69 6e 67  efore .** making
29220 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
29230 67 65 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ge. The caller m
29240 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72 65  ust check the re
29250 74 75 72 6e 20 76 61 6c 75 65 20 0a 2a 2a 20 6f  turn value .** o
29260 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  f this function 
29270 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
29280 6f 74 20 74 6f 20 63 68 61 6e 67 65 20 61 6e 79  ot to change any
29290 20 70 61 67 65 20 64 61 74 61 20 75 6e 6c 65 73   page data unles
292a0 73 20 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74 69  s .** this routi
292b0 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ne returns SQLIT
292c0 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  E_OK..**.** The 
292d0 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65  difference betwe
292e0 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
292f0 20 61 6e 64 20 70 61 67 65 72 5f 77 72 69 74 65   and pager_write
29300 28 29 20 69 73 20 74 68 61 74 20 74 68 69 73 0a  () is that this.
29310 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 61 6c 73 6f  ** function also
29320 20 64 65 61 6c 73 20 77 69 74 68 20 74 68 65 20   deals with the 
29330 73 70 65 63 69 61 6c 20 63 61 73 65 20 77 68 65  special case whe
29340 72 65 20 32 20 6f 72 20 6d 6f 72 65 20 70 61 67  re 2 or more pag
29350 65 73 0a 2a 2a 20 66 69 74 20 6f 6e 20 61 20 73  es.** fit on a s
29360 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f  ingle disk secto
29370 72 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  r. In this case 
29380 61 6c 6c 20 63 6f 2d 72 65 73 69 64 65 6e 74 20  all co-resident 
29390 70 61 67 65 73 0a 2a 2a 20 6d 75 73 74 20 68 61  pages.** must ha
293a0 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
293b0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
293c0 69 6c 65 20 62 65 66 6f 72 65 20 72 65 74 75 72  ile before retur
293d0 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  ning..**.** If a
293e0 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  n error occurs, 
293f0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20  SQLITE_NOMEM or 
29400 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65  an IO error code
29410 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
29420 61 73 20 61 70 70 72 6f 70 72 69 61 74 65 2e 20  as appropriate. 
29430 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
29440 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  E_OK..*/.int sql
29450 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 44  ite3PagerWrite(D
29460 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
29470 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
29480 54 45 5f 4f 4b 3b 0a 0a 20 20 50 67 48 64 72 20  TE_OK;..  PgHdr 
29490 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
294a0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
294b0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
294c0 20 50 67 6e 6f 20 6e 50 61 67 65 50 65 72 53 65   Pgno nPagePerSe
294d0 63 74 6f 72 20 3d 20 28 70 50 61 67 65 72 2d 3e  ctor = (pPager->
294e0 73 65 63 74 6f 72 53 69 7a 65 2f 70 50 61 67 65  sectorSize/pPage
294f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 0a 20  r->pageSize);.. 
29500 20 69 66 28 20 6e 50 61 67 65 50 65 72 53 65 63   if( nPagePerSec
29510 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67 6e  tor>1 ){.    Pgn
29520 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20 20  o nPageCount;   
29530 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
29540 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
29550 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  in database file
29560 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67 31   */.    Pgno pg1
29570 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
29580 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
29590 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
295a0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
295b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61 67   */.    int nPag
295c0 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
295d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
295e0 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61 74  ages starting at
295f0 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c 20   pg1 to journal 
29600 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 20 20  */.    int ii;  
29610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29620 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
29630 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 65 64   */.    int need
29640 53 79 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  Sync = 0;       
29650 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 79    /* True if any
29660 20 70 61 67 65 20 68 61 73 20 50 47 48 44 52 5f   page has PGHDR_
29670 4e 45 45 44 5f 53 59 4e 43 20 2a 2f 0a 0a 20 20  NEED_SYNC */..  
29680 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e    /* Set the doN
29690 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31  otSync flag to 1
296a0 2e 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73  . This is becaus
296b0 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f  e we cannot allo
296c0 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  w a journal.    
296d0 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20  ** header to be 
296e0 77 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20  written between 
296f0 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61  the pages journa
29700 6c 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63  led by this func
29710 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
29720 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20   assert( !MEMDB 
29730 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
29740 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
29750 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
29760 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31  r->doNotSync = 1
29770 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74  ;..    /* This t
29780 72 69 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61  rick assumes tha
29790 74 20 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d  t both the page-
297a0 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
297b0 73 69 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20  size are.    ** 
297c0 61 6e 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72  an integer power
297d0 20 6f 66 20 32 2e 20 49 74 20 73 65 74 73 20 76   of 2. It sets v
297e0 61 72 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74  ariable pg1 to t
297f0 68 65 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20  he identifier.  
29800 20 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73    ** of the firs
29810 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
29820 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
29830 74 65 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  ted on..    */. 
29840 20 20 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e     pg1 = ((pPg->
29850 70 67 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67  pgno-1) & ~(nPag
29860 65 50 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b  ePerSector-1)) +
29870 20 31 3b 0a 0a 20 20 20 20 73 71 6c 69 74 65 33   1;..    sqlite3
29880 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
29890 50 61 67 65 72 2c 20 28 69 6e 74 20 2a 29 26 6e  Pager, (int *)&n
298a0 50 61 67 65 43 6f 75 6e 74 29 3b 0a 20 20 20 20  PageCount);.    
298b0 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e 6e 50  if( pPg->pgno>nP
298c0 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
298d0 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67 2d 3e    nPage = (pPg->
298e0 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b 0a 20  pgno - pg1)+1;. 
298f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 67     }else if( (pg
29900 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  1+nPagePerSector
29910 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  -1)>nPageCount )
29920 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
29930 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70 67 31  nPageCount+1-pg1
29940 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29950 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65     nPage = nPage
29960 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20 20 7d  PerSector;.    }
29970 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50 61 67  .    assert(nPag
29980 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74  e>0);.    assert
29990 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e 6f 29  (pg1<=pPg->pgno)
299a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28 70 67  ;.    assert((pg
299b0 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e 70 67  1+nPage)>pPg->pg
299c0 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28 69 69  no);..    for(ii
299d0 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20  =0; ii<nPage && 
299e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69  rc==SQLITE_OK; i
299f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67 6e 6f  i++){.      Pgno
29a00 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a 20 20   pg = pg1+ii;.  
29a10 20 20 20 20 50 67 48 64 72 20 2a 70 50 61 67 65      PgHdr *pPage
29a20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67 3d 3d  ;.      if( pg==
29a30 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21 73 71  pPg->pgno || !sq
29a40 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
29a50 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
29a60 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20 20 20  al, pg) ){.     
29a70 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45 52     if( pg!=PAGER
29a80 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
29a90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
29aa0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
29ab0 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c 20 26  et(pPager, pg, &
29ac0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
29ad0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29ae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
29af0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
29b00 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
29b10 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
29b20 65 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  e->flags&PGHDR_N
29b30 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20  EED_SYNC ){.    
29b40 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
29b50 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
29b60 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50 61        assert(pPa
29b70 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  ger->needSync);.
29b80 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
29b90 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
29ba0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
29bb0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
29bc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
29bd0 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
29be0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
29bf0 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
29c00 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
29c10 50 61 67 65 2d 3e 66 6c 61 67 73 26 50 47 48 44  Page->flags&PGHD
29c20 52 5f 4e 45 45 44 5f 53 59 4e 43 20 29 7b 0a 20  R_NEED_SYNC ){. 
29c30 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
29c40 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
29c50 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29c60 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65  PagerUnref(pPage
29c70 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
29c80 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  ..    /* If the 
29c90 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20  PGHDR_NEED_SYNC 
29ca0 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
29cb0 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65  any of the nPage
29cc0 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
29cd0 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20  tarting at pg1, 
29ce0 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f  then it needs to
29cf0 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20   be set for all 
29d00 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65  of them. Because
29d10 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20  .    ** writing 
29d20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  to any of these 
29d30 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20  nPage pages may 
29d40 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72  damage the other
29d50 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  s, the.    ** jo
29d60 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
29d70 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64  contain sync()ed
29d80 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f   copies of all o
29d90 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65  f them.    ** be
29da0 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d  fore any of them
29db0 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
29dc0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
29dd0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
29de0 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
29df0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
29e00 74 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  t( !MEMDB && pPa
29e10 67 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 29  ger->noSync==0 )
29e20 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  ;.      for(ii=0
29e30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65  ; ii<nPage && ne
29e40 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  edSync; ii++){. 
29e50 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
29e60 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
29e70 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
29e80 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
29e90 70 50 61 67 65 20 29 7b 0a 20 20 20 20 20 20 20  pPage ){.       
29ea0 20 20 20 70 50 61 67 65 2d 3e 66 6c 61 67 73 20     pPage->flags 
29eb0 7c 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  |= PGHDR_NEED_SY
29ec0 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  NC;.          sq
29ed0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
29ee0 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20  pPage);.        
29ef0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
29f00 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
29f10 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a  eedSync);.    }.
29f20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
29f30 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
29f40 31 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  1 );.    pPager-
29f50 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a  >doNotSync = 0;.
29f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
29f70 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44  = pager_write(pD
29f80 62 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65  bPage);.  }.  re
29f90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
29fa0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
29fb0 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20   the page given 
29fc0 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20  in the argument 
29fd0 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70  was previously p
29fe0 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69  assed.** to sqli
29ff0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e  te3PagerWrite().
2a000 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
2a010 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
2a020 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
2a030 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
2a040 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
2a050 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
2a060 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  G.int sqlite3Pag
2a070 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62  erIswriteable(Db
2a080 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65  Page *pPg){.  re
2a090 74 75 72 6e 20 70 50 67 2d 3e 66 6c 61 67 73 26  turn pPg->flags&
2a0a0 50 47 48 44 52 5f 44 49 52 54 59 3b 0a 7d 0a 23  PGHDR_DIRTY;.}.#
2a0b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
2a0c0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
2a0d0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
2a0e0 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
2a0f0 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
2a100 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
2a110 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
2a120 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
2a130 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
2a140 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
2a150 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
2a160 61 73 20 64 69 72 74 79 2e 20 20 54 68 69 73 20  as dirty.  This 
2a170 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61  happens, for exa
2a180 6d 70 6c 65 2c 20 77 68 65 6e 0a 2a 2a 20 74 68  mple, when.** th
2a190 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
2a1a0 61 64 64 65 64 20 61 73 20 61 20 6c 65 61 66 20  added as a leaf 
2a1b0 6f 66 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  of the freelist 
2a1c0 61 6e 64 20 73 6f 20 69 74 73 0a 2a 2a 20 63 6f  and so its.** co
2a1d0 6e 74 65 6e 74 20 6e 6f 20 6c 6f 6e 67 65 72 20  ntent no longer 
2a1e0 6d 61 74 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 54  matters..**.** T
2a1f0 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
2a200 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
2a210 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
2a220 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
2a230 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
2a240 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
2a250 65 64 2e 20 54 68 65 20 70 61 67 65 72 20 6d 61  ed. The pager ma
2a260 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
2a270 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
2a280 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
2a290 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
2a2a0 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
2a2b0 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
2a2c0 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 71 75  imization can qu
2a2d0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
2a2e0 64 20 6f 66 20 6c 61 72 67 65 20 0a 2a 2a 20 44  d of large .** D
2a2f0 45 4c 45 54 45 20 6f 70 65 72 61 74 69 6f 6e 73  ELETE operations
2a300 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a310 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28  3PagerDontWrite(
2a320 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
2a330 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
2a340 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
2a350 28 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47  ( (pPg->flags&PG
2a360 48 44 52 5f 44 49 52 54 59 29 20 26 26 20 70 50  HDR_DIRTY) && pP
2a370 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2a380 3d 3d 30 20 29 7b 0a 20 20 20 20 50 41 47 45 52  ==0 ){.    PAGER
2a390 54 52 41 43 45 28 28 22 44 4f 4e 54 5f 57 52 49  TRACE(("DONT_WRI
2a3a0 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
2a3b0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
2a3c0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
2a3d0 29 3b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  );.    IOTRACE((
2a3e0 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c  "CLEAN %p %d\n",
2a3f0 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
2a400 6e 6f 29 29 0a 20 20 20 20 70 50 67 2d 3e 66 6c  no)).    pPg->fl
2a410 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 44 4f 4e  ags |= PGHDR_DON
2a420 54 5f 57 52 49 54 45 3b 0a 23 69 66 64 65 66 20  T_WRITE;.#ifdef 
2a430 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
2a440 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
2a450 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
2a460 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
2a470 69 66 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  if.  }.}../*.** 
2a480 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
2a490 63 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d  called to increm
2a4a0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ent the value of
2a4b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2a4c0 6c 65 20 0a 2a 2a 20 63 68 61 6e 67 65 2d 63 6f  le .** change-co
2a4d0 75 6e 74 65 72 2c 20 73 74 6f 72 65 64 20 61 73  unter, stored as
2a4e0 20 61 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e   a 4-byte big-en
2a4f0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 73 74 61  dian integer sta
2a500 72 74 69 6e 67 20 61 74 20 0a 2a 2a 20 62 79 74  rting at .** byt
2a510 65 20 6f 66 66 73 65 74 20 32 34 20 6f 66 20 74  e offset 24 of t
2a520 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a  he pager file..*
2a530 2a 0a 2a 2a 20 49 66 20 74 68 65 20 69 73 44 69  *.** If the isDi
2a540 72 65 63 74 20 66 6c 61 67 20 69 73 20 7a 65 72  rect flag is zer
2a550 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20  o, then this is 
2a560 64 6f 6e 65 20 62 79 20 63 61 6c 6c 69 6e 67 20  done by calling 
2a570 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72  .** sqlite3Pager
2a580 57 72 69 74 65 28 29 20 6f 6e 20 70 61 67 65 20  Write() on page 
2a590 31 2c 20 74 68 65 6e 20 6d 6f 64 69 66 79 69 6e  1, then modifyin
2a5a0 67 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  g the contents o
2a5b0 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 64 61  f the.** page da
2a5c0 74 61 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ta. In this case
2a5d0 20 74 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   the file will b
2a5e0 65 20 75 70 64 61 74 65 64 20 77 68 65 6e 20 74  e updated when t
2a5f0 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72  he current.** tr
2a600 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 63 6f 6d  ansaction is com
2a610 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  mitted..**.** Th
2a620 65 20 69 73 44 69 72 65 63 74 20 66 6c 61 67 20  e isDirect flag 
2a630 6d 61 79 20 6f 6e 6c 79 20 62 65 20 6e 6f 6e 2d  may only be non-
2a640 7a 65 72 6f 20 69 66 20 74 68 65 20 6c 69 62 72  zero if the libr
2a650 61 72 79 20 77 61 73 20 63 6f 6d 70 69 6c 65 64  ary was compiled
2a660 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 53 51 4c  .** with the SQL
2a670 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49  ITE_ENABLE_ATOMI
2a680 43 5f 57 52 49 54 45 20 6d 61 63 72 6f 20 64 65  C_WRITE macro de
2a690 66 69 6e 65 64 2e 20 49 6e 20 74 68 69 73 20 63  fined. In this c
2a6a0 61 73 65 2c 0a 2a 2a 20 69 66 20 69 73 44 69 72  ase,.** if isDir
2a6b0 65 63 74 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  ect is non-zero,
2a6c0 20 74 68 65 6e 20 74 68 65 20 64 61 74 61 62 61   then the databa
2a6d0 73 65 20 66 69 6c 65 20 69 73 20 75 70 64 61 74  se file is updat
2a6e0 65 64 20 64 69 72 65 63 74 6c 79 0a 2a 2a 20 62  ed directly.** b
2a6f0 79 20 77 72 69 74 69 6e 67 20 61 6e 20 75 70 64  y writing an upd
2a700 61 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20  ated version of 
2a710 70 61 67 65 20 31 20 75 73 69 6e 67 20 61 20 63  page 1 using a c
2a720 61 6c 6c 20 74 6f 20 74 68 65 20 0a 2a 2a 20 73  all to the .** s
2a730 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 29 20  qlite3OsWrite() 
2a740 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  function..*/.sta
2a750 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
2a760 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2a770 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
2a780 69 6e 74 20 69 73 44 69 72 65 63 74 4d 6f 64 65  int isDirectMode
2a790 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2a7a0 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 44  LITE_OK;..  /* D
2a7b0 65 63 6c 61 72 65 20 61 6e 64 20 69 6e 69 74 69  eclare and initi
2a7c0 61 6c 69 7a 65 20 63 6f 6e 73 74 61 6e 74 20 69  alize constant i
2a7d0 6e 74 65 67 65 72 20 27 69 73 44 69 72 65 63 74  nteger 'isDirect
2a7e0 27 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 61  '. If the.  ** a
2a7f0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
2a800 6d 69 7a 61 74 69 6f 6e 20 69 73 20 65 6e 61 62  mization is enab
2a810 6c 65 64 20 69 6e 20 74 68 69 73 20 62 75 69 6c  led in this buil
2a820 64 2c 20 74 68 65 6e 20 69 73 44 69 72 65 63 74  d, then isDirect
2a830 0a 20 20 2a 2a 20 69 73 20 69 6e 69 74 69 61 6c  .  ** is initial
2a840 69 7a 65 64 20 74 6f 20 74 68 65 20 76 61 6c 75  ized to the valu
2a850 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20  e passed as the 
2a860 69 73 44 69 72 65 63 74 4d 6f 64 65 20 70 61 72  isDirectMode par
2a870 61 6d 65 74 65 72 0a 20 20 2a 2a 20 74 6f 20 74  ameter.  ** to t
2a880 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 4f 74  his function. Ot
2a890 68 65 72 77 69 73 65 2c 20 69 74 20 69 73 20 61  herwise, it is a
2a8a0 6c 77 61 79 73 20 73 65 74 20 74 6f 20 7a 65 72  lways set to zer
2a8b0 6f 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  o..  **.  ** The
2a8c0 20 69 64 65 61 20 69 73 20 74 68 61 74 20 69 66   idea is that if
2a8d0 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74   the atomic-writ
2a8e0 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69  e optimization i
2a8f0 73 20 6e 6f 74 0a 20 20 2a 2a 20 65 6e 61 62 6c  s not.  ** enabl
2a900 65 64 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69  ed at compile ti
2a910 6d 65 2c 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  me, the compiler
2a920 20 63 61 6e 20 6f 6d 69 74 20 74 68 65 20 74 65   can omit the te
2a930 73 74 73 20 6f 66 0a 20 20 2a 2a 20 27 69 73 44  sts of.  ** 'isD
2a940 69 72 65 63 74 27 20 62 65 6c 6f 77 2c 20 61 73  irect' below, as
2a950 20 77 65 6c 6c 20 61 73 20 74 68 65 20 62 6c 6f   well as the blo
2a960 63 6b 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 74  ck enclosed in t
2a970 68 65 0a 20 20 2a 2a 20 22 69 66 28 20 69 73 44  he.  ** "if( isD
2a980 69 72 65 63 74 20 29 22 20 63 6f 6e 64 69 74 69  irect )" conditi
2a990 6f 6e 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66  on..  */.#ifndef
2a9a0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2a9b0 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 63 6f  TOMIC_WRITE.  co
2a9c0 6e 73 74 20 69 6e 74 20 69 73 44 69 72 65 63 74  nst int isDirect
2a9d0 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20   = 0;.  assert( 
2a9e0 69 73 44 69 72 65 63 74 4d 6f 64 65 3d 3d 30 20  isDirectMode==0 
2a9f0 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  );.  UNUSED_PARA
2aa00 4d 45 54 45 52 28 69 73 44 69 72 65 63 74 4d 6f  METER(isDirectMo
2aa10 64 65 29 3b 0a 23 65 6c 73 65 0a 20 20 63 6f 6e  de);.#else.  con
2aa20 73 74 20 69 6e 74 20 69 73 44 69 72 65 63 74 20  st int isDirect 
2aa30 3d 20 69 73 44 69 72 65 63 74 4d 6f 64 65 3b 0a  = isDirectMode;.
2aa40 23 65 6e 64 69 66 0a 0a 20 20 61 73 73 65 72 74  #endif..  assert
2aa50 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
2aa60 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
2aa70 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
2aa80 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  ->changeCountDon
2aa90 65 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53  e && pPager->dbS
2aaa0 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 50 67 48  ize>0 ){.    PgH
2aab0 64 72 20 2a 70 50 67 48 64 72 3b 20 20 20 20 20  dr *pPgHdr;     
2aac0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2aad0 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67 65 20  ference to page 
2aae0 31 20 2a 2f 0a 20 20 20 20 75 33 32 20 63 68 61  1 */.    u32 cha
2aaf0 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 20 20 20 20  nge_counter;    
2ab00 20 20 20 20 20 20 20 2f 2a 20 49 6e 69 74 69 61         /* Initia
2ab10 6c 20 76 61 6c 75 65 20 6f 66 20 63 68 61 6e 67  l value of chang
2ab20 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64 20  e-counter field 
2ab30 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72 74 28 20  */..    assert( 
2ab40 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
2ab50 65 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61 67  e && isOpen(pPag
2ab60 65 72 2d 3e 66 64 29 20 29 3b 0a 0a 20 20 20 20  er->fd) );..    
2ab70 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f  /* Open page 1 o
2ab80 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77  f the file for w
2ab90 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72  riting. */.    r
2aba0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
2abb0 47 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  Get(pPager, 1, &
2abc0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 61 73 73  pPgHdr);.    ass
2abd0 65 72 74 28 20 70 50 67 48 64 72 3d 3d 30 20 7c  ert( pPgHdr==0 |
2abe0 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  | rc==SQLITE_OK 
2abf0 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 70 61  );..    /* If pa
2ac00 67 65 20 6f 6e 65 20 77 61 73 20 66 65 74 63 68  ge one was fetch
2ac10 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c  ed successfully,
2ac20 20 61 6e 64 20 74 68 69 73 20 66 75 6e 63 74 69   and this functi
2ac30 6f 6e 20 69 73 20 6e 6f 74 0a 20 20 20 20 2a 2a  on is not.    **
2ac40 20 6f 70 65 72 61 74 69 6e 67 20 69 6e 20 64 69   operating in di
2ac50 72 65 63 74 2d 6d 6f 64 65 2c 20 6d 61 6b 65 20  rect-mode, make 
2ac60 70 61 67 65 20 31 20 77 72 69 74 61 62 6c 65 2e  page 1 writable.
2ac70 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2ac80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
2ac90 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
2aca0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2acb0 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
2acc0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  r);.    }..    i
2acd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ace0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e 63   ){.      /* Inc
2acf0 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65  rement the value
2ad00 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77   just read and w
2ad10 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20  rite it back to 
2ad20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20  byte 24. */.    
2ad30 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
2ad40 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
2ad50 74 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e  te((u8*)pPager->
2ad60 64 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20  dbFileVers);.   
2ad70 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65     change_counte
2ad80 72 2b 2b 3b 0a 20 20 20 20 20 20 70 75 74 33 32  r++;.      put32
2ad90 62 69 74 73 28 28 28 63 68 61 72 2a 29 70 50 67  bits(((char*)pPg
2ada0 48 64 72 2d 3e 70 44 61 74 61 29 2b 32 34 2c 20  Hdr->pData)+24, 
2adb0 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
2adc0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 72 75  ..      /* If ru
2add0 6e 6e 69 6e 67 20 69 6e 20 64 69 72 65 63 74 20  nning in direct 
2ade0 6d 6f 64 65 2c 20 77 72 69 74 65 20 74 68 65 20  mode, write the 
2adf0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 61 67 65  contents of page
2ae00 20 31 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20   1 to the file. 
2ae10 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 73 44  */.      if( isD
2ae20 69 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  irect ){.       
2ae30 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a 42 75   const void *zBu
2ae40 66 20 3d 20 70 50 67 48 64 72 2d 3e 70 44 61 74  f = pPgHdr->pDat
2ae50 61 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  a;.        asser
2ae60 74 28 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  t( pPager->dbFil
2ae70 65 53 69 7a 65 3e 30 20 29 3b 0a 20 20 20 20 20  eSize>0 );.     
2ae80 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
2ae90 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
2aea0 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
2aeb0 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
2aec0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
2aed0 20 49 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   If everything w
2aee0 6f 72 6b 65 64 2c 20 73 65 74 20 74 68 65 20 63  orked, set the c
2aef0 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 66  hangeCountDone f
2af00 6c 61 67 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  lag. */.      if
2af10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
2af20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
2af30 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
2af40 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ne = 1;.      }.
2af50 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
2af60 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
2af70 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
2af80 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2af90 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
2afa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
2afb0 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 70  /*.** Sync the p
2afc0 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69 73  ager file to dis
2afd0 6b 2e 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d  k. This is a no-
2afe0 6f 70 20 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79  op for in-memory
2aff0 20 66 69 6c 65 73 0a 2a 2a 20 6f 72 20 70 61 67   files.** or pag
2b000 65 73 20 77 69 74 68 20 74 68 65 20 50 61 67 65  es with the Page
2b010 72 2e 6e 6f 53 79 6e 63 20 66 6c 61 67 20 73 65  r.noSync flag se
2b020 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  t..**.** If succ
2b030 65 73 73 66 75 6c 2c 20 6f 72 20 63 61 6c 6c 65  essful, or calle
2b040 64 20 6f 6e 20 61 20 70 61 67 65 72 20 66 6f 72  d on a pager for
2b050 20 77 68 69 63 68 20 69 74 20 69 73 20 61 20 6e   which it is a n
2b060 6f 2d 6f 70 2c 20 74 68 69 73 0a 2a 2a 20 66 75  o-op, this.** fu
2b070 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 53  nction returns S
2b080 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68 65 72 77  QLITE_OK. Otherw
2b090 69 73 65 2c 20 61 6e 20 49 4f 20 65 72 72 6f 72  ise, an IO error
2b0a0 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
2b0b0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
2b0c0 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65 72  3PagerSync(Pager
2b0d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
2b0e0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
2b0f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b100 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2b110 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
2b120 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  || pPager->noSyn
2b130 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  c ){.    rc = SQ
2b140 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
2b150 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
2b160 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
2b170 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e  >fd, pPager->syn
2b180 63 5f 66 6c 61 67 73 29 3b 0a 20 20 7d 0a 20 20  c_flags);.  }.  
2b190 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2b1a0 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74  .** Sync the dat
2b1b0 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74  abase file for t
2b1c0 68 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e  he pager pPager.
2b1d0 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20   zMaster points 
2b1e0 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f  to the name.** o
2b1f0 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
2b200 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f  al file that sho
2b210 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69  uld be written i
2b220 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75  nto the individu
2b230 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  al.** journal fi
2b240 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20  le. zMaster may 
2b250 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69  be NULL, which i
2b260 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73  s interpreted as
2b270 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f   no master.** jo
2b280 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20  urnal (a single 
2b290 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63  database transac
2b2a0 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  tion)..**.** Thi
2b2b0 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65  s routine ensure
2b2c0 73 20 74 68 61 74 3a 0a 2a 2a 0a 2a 2a 20 20 20  s that:.**.**   
2b2d0 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
2b2e0 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  ile change-count
2b2f0 65 72 20 69 73 20 75 70 64 61 74 65 64 2c 0a 2a  er is updated,.*
2b300 2a 20 20 20 2a 20 74 68 65 20 6a 6f 75 72 6e 61  *   * the journa
2b310 6c 20 69 73 20 73 79 6e 63 65 64 20 28 75 6e 6c  l is synced (unl
2b320 65 73 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77  ess the atomic-w
2b330 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
2b340 6e 20 69 73 20 75 73 65 64 29 2c 0a 2a 2a 20 20  n is used),.**  
2b350 20 2a 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67   * all dirty pag
2b360 65 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 74  es are written t
2b370 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
2b380 69 6c 65 2c 20 0a 2a 2a 20 20 20 2a 20 74 68 65  ile, .**   * the
2b390 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
2b3a0 73 20 74 72 75 6e 63 61 74 65 64 20 28 69 66 20  s truncated (if 
2b3b0 72 65 71 75 69 72 65 64 29 2c 20 61 6e 64 0a 2a  required), and.*
2b3c0 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62 61  *   * the databa
2b3d0 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20  se file synced. 
2b3e0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 6e 6c 79 20  .**.** The only 
2b3f0 74 68 69 6e 67 20 74 68 61 74 20 72 65 6d 61 69  thing that remai
2b400 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  ns to commit the
2b410 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2b420 74 6f 20 66 69 6e 61 6c 69 7a 65 20 0a 2a 2a 20  to finalize .** 
2b430 28 64 65 6c 65 74 65 2c 20 74 72 75 6e 63 61 74  (delete, truncat
2b440 65 20 6f 72 20 7a 65 72 6f 20 74 68 65 20 66 69  e or zero the fi
2b450 72 73 74 20 70 61 72 74 20 6f 66 29 20 74 68 65  rst part of) the
2b460 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
2b470 72 20 0a 2a 2a 20 64 65 6c 65 74 65 20 74 68 65  r .** delete the
2b480 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
2b490 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
2b4a0 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
2b4b0 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
2b4c0 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
2b4d0 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
2b4e0 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
2b4f0 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
2b500 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69  qlite3PagerCommi
2b510 74 50 68 61 73 65 4f 6e 65 28 29 20 63 61 6c 6c  tPhaseOne() call
2b520 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66  ..**.** If the f
2b530 69 6e 61 6c 20 70 61 72 61 6d 65 74 65 72 20 2d  inal parameter -
2b540 20 6e 6f 53 79 6e 63 20 2d 20 69 73 20 74 72 75   noSync - is tru
2b550 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
2b560 62 61 73 65 20 66 69 6c 65 20 69 74 73 65 6c 66  base file itself
2b570 0a 2a 2a 20 69 73 20 6e 6f 74 20 73 79 6e 63 65  .** is not synce
2b580 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
2b590 73 74 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50  st call sqlite3P
2b5a0 61 67 65 72 53 79 6e 63 28 29 20 64 69 72 65 63  agerSync() direc
2b5b0 74 6c 79 20 74 6f 0a 2a 2a 20 73 79 6e 63 20 74  tly to.** sync t
2b5c0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2b5d0 20 62 65 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20   before calling 
2b5e0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 29  CommitPhaseTwo()
2b5f0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 0a 2a   to delete the.*
2b600 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  * journal file i
2b610 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
2b620 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2b630 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 0a  CommitPhaseOne(.
2b640 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
2b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b660 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65 63    /* Pager objec
2b670 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
2b680 72 20 2a 7a 4d 61 73 74 65 72 2c 20 20 20 20 20  r *zMaster,     
2b690 20 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 74         /* If not
2b6a0 20 4e 55 4c 4c 2c 20 74 68 65 20 6d 61 73 74 65   NULL, the maste
2b6b0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a  r journal name *
2b6c0 2f 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 20 20  /.  int noSync  
2b6d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b6e0 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f      /* True to o
2b6f0 6d 69 74 20 74 68 65 20 78 53 79 6e 63 20 6f 6e  mit the xSync on
2b700 20 74 68 65 20 64 62 20 66 69 6c 65 20 2a 2f 0a   the db file */.
2b710 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
2b720 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20  LITE_OK;        
2b730 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63       /* Return c
2b740 6f 64 65 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50  ode */..  if( pP
2b750 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
2b760 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
2b770 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
2b780 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
2b790 22 44 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20  "DATABASE SYNC: 
2b7a0 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d  File=%s zMaster=
2b7b0 25 73 20 6e 53 69 7a 65 3d 25 64 5c 6e 22 2c 20  %s nSize=%d\n", 
2b7c0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a  .      pPager->z
2b7d0 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65  Filename, zMaste
2b7e0 72 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  r, pPager->dbSiz
2b7f0 65 29 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  e));..  /* If th
2b800 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
2b810 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
2b820 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
2b830 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
2b840 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
2b850 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
2b860 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
2b870 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
2b880 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  ( MEMDB && pPage
2b890 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29 7b  r->dbModified ){
2b8a0 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63 6b  .    sqlite3Back
2b8b0 75 70 52 65 73 74 61 72 74 28 70 50 61 67 65 72  upRestart(pPager
2b8c0 2d 3e 70 42 61 63 6b 75 70 29 3b 0a 20 20 7d 65  ->pBackup);.  }e
2b8d0 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
2b8e0 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
2b8f0 43 45 44 20 26 26 20 70 50 61 67 65 72 2d 3e 64  CED && pPager->d
2b900 62 4d 6f 64 69 66 69 65 64 20 29 7b 0a 0a 20 20  bModified ){..  
2b910 20 20 2f 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69    /* The followi
2b920 6e 67 20 62 6c 6f 63 6b 20 75 70 64 61 74 65 73  ng block updates
2b930 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2b940 74 65 72 2e 20 45 78 61 63 74 6c 79 20 68 6f 77  ter. Exactly how
2b950 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 20   it.    ** does 
2b960 74 68 69 73 20 64 65 70 65 6e 64 73 20 6f 6e 20  this depends on 
2b970 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
2b980 68 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65  he atomic-update
2b990 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 20 20   optimization.  
2b9a0 20 20 2a 2a 20 77 61 73 20 65 6e 61 62 6c 65 64    ** was enabled
2b9b0 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
2b9c0 2c 20 61 6e 64 20 69 66 20 74 68 69 73 20 74 72  , and if this tr
2b9d0 61 6e 73 61 63 74 69 6f 6e 20 6d 65 65 74 73 20  ansaction meets 
2b9e0 74 68 65 20 0a 20 20 20 20 2a 2a 20 72 75 6e 74  the .    ** runt
2b9f0 69 6d 65 20 63 72 69 74 65 72 69 61 20 74 6f 20  ime criteria to 
2ba00 75 73 65 20 74 68 65 20 6f 70 65 72 61 74 69 6f  use the operatio
2ba10 6e 3a 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  n: .    **.    *
2ba20 2a 20 20 20 20 2a 20 54 68 65 20 66 69 6c 65 2d  *    * The file-
2ba30 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74 73 20  system supports 
2ba40 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
2ba50 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a 20 20   property for.  
2ba60 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63 6b 73    **      blocks
2ba70 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d 73 69   of size page-si
2ba80 7a 65 2c 20 61 6e 64 20 0a 20 20 20 20 2a 2a 20  ze, and .    ** 
2ba90 20 20 20 2a 20 54 68 69 73 20 63 6f 6d 6d 69 74     * This commit
2baa0 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
2bab0 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72 61  a multi-file tra
2bac0 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20 20  nsaction, and.  
2bad0 20 20 2a 2a 20 20 20 20 2a 20 45 78 61 63 74 6c    **    * Exactl
2bae0 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20 62  y one page has b
2baf0 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e 64  een modified and
2bb00 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a 6f   store in the jo
2bb10 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
2bb20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
2bb30 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 77 61   optimization wa
2bb40 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 61 74  s not enabled at
2bb50 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74   compile time, t
2bb60 68 65 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 70  hen the.    ** p
2bb70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2bb80 63 6f 75 6e 74 65 72 28 29 20 66 75 6e 63 74 69  counter() functi
2bb90 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2bba0 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67  update the chang
2bbb0 65 0a 20 20 20 20 2a 2a 20 63 6f 75 6e 74 65 72  e.    ** counter
2bbc0 20 69 6e 20 27 69 6e 64 69 72 65 63 74 2d 6d 6f   in 'indirect-mo
2bbd0 64 65 27 2e 20 49 66 20 74 68 65 20 6f 70 74 69  de'. If the opti
2bbe0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 63 6f 6d 70  mization is comp
2bbf0 69 6c 65 64 20 69 6e 20 62 75 74 0a 20 20 20 20  iled in but.    
2bc00 2a 2a 20 69 73 20 6e 6f 74 20 61 70 70 6c 69 63  ** is not applic
2bc10 61 62 6c 65 20 74 6f 20 74 68 69 73 20 74 72 61  able to this tra
2bc20 6e 73 61 63 74 69 6f 6e 2c 20 63 61 6c 6c 20 73  nsaction, call s
2bc30 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
2bc40 61 74 65 28 29 0a 20 20 20 20 2a 2a 20 74 6f 20  ate().    ** to 
2bc50 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20 6a 6f  make sure the jo
2bc60 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 61  urnal file has a
2bc70 63 74 75 61 6c 6c 79 20 62 65 65 6e 20 63 72 65  ctually been cre
2bc80 61 74 65 64 2c 20 74 68 65 6e 20 63 61 6c 6c 0a  ated, then call.
2bc90 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69 6e 63      ** pager_inc
2bca0 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2bcb0 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
2bcc0 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69  change-counter i
2bcd0 6e 20 69 6e 64 69 72 65 63 74 0a 20 20 20 20 2a  n indirect.    *
2bce0 2a 20 6d 6f 64 65 2e 20 0a 20 20 20 20 2a 2a 0a  * mode. .    **.
2bcf0 20 20 20 20 2a 2a 20 4f 74 68 65 72 77 69 73 65      ** Otherwise
2bd00 2c 20 69 66 20 74 68 65 20 6f 70 74 69 6d 69 7a  , if the optimiz
2bd10 61 74 69 6f 6e 20 69 73 20 62 6f 74 68 20 65 6e  ation is both en
2bd20 61 62 6c 65 64 20 61 6e 64 20 61 70 70 6c 69 63  abled and applic
2bd30 61 62 6c 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65  able,.    ** the
2bd40 6e 20 63 61 6c 6c 20 70 61 67 65 72 5f 69 6e 63  n call pager_inc
2bd50 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
2bd60 29 20 74 6f 20 75 70 64 61 74 65 20 74 68 65 20  ) to update the 
2bd70 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 0a 20  change-counter. 
2bd80 20 20 20 2a 2a 20 69 6e 20 27 64 69 72 65 63 74     ** in 'direct
2bd90 27 20 6d 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  ' mode. In this 
2bda0 63 61 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  case the journal
2bdb0 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72   file will never
2bdc0 20 62 65 0a 20 20 20 20 2a 2a 20 63 72 65 61 74   be.    ** creat
2bdd0 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e  ed for this tran
2bde0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  saction..    */.
2bdf0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2be00 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
2be10 45 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  E.    PgHdr *pPg
2be20 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 69 73  ;.    assert( is
2be30 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64  Open(pPager->jfd
2be40 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ) || pPager->jou
2be50 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
2be60 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20  JOURNALMODE_OFF 
2be70 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
2be80 74 65 72 20 26 26 20 69 73 4f 70 65 6e 28 70 50  ter && isOpen(pP
2be90 61 67 65 72 2d 3e 6a 66 64 29 20 0a 20 20 20 20  ager->jfd) .    
2bea0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2beb0 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66  nalOff==jrnlBuff
2bec0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 0a  erSize(pPager) .
2bed0 20 20 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e       && pPager->
2bee0 64 62 53 69 7a 65 3e 3d 70 50 61 67 65 72 2d 3e  dbSize>=pPager->
2bef0 64 62 46 69 6c 65 53 69 7a 65 0a 20 20 20 20 20  dbFileSize.     
2bf00 26 26 20 28 30 3d 3d 28 70 50 67 20 3d 20 73 71  && (0==(pPg = sq
2bf10 6c 69 74 65 33 50 63 61 63 68 65 44 69 72 74 79  lite3PcacheDirty
2bf20 4c 69 73 74 28 70 50 61 67 65 72 2d 3e 70 50 43  List(pPager->pPC
2bf30 61 63 68 65 29 29 20 7c 7c 20 30 3d 3d 70 50 67  ache)) || 0==pPg
2bf40 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29 7b  ->pDirty).    ){
2bf50 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65  .      /* Update
2bf60 20 74 68 65 20 64 62 20 66 69 6c 65 20 63 68 61   the db file cha
2bf70 6e 67 65 20 63 6f 75 6e 74 65 72 20 76 69 61 20  nge counter via 
2bf80 74 68 65 20 64 69 72 65 63 74 2d 77 72 69 74 65  the direct-write
2bf90 20 6d 65 74 68 6f 64 2e 20 54 68 65 20 0a 20 20   method. The .  
2bfa0 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67      ** following
2bfb0 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66   call will modif
2bfc0 79 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  y the in-memory 
2bfd0 72 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f  representation o
2bfe0 66 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  f page 1 .      
2bff0 2a 2a 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68  ** to include th
2c000 65 20 75 70 64 61 74 65 64 20 63 68 61 6e 67 65  e updated change
2c010 20 63 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65   counter and the
2c020 6e 20 77 72 69 74 65 20 70 61 67 65 20 31 20 0a  n write page 1 .
2c030 20 20 20 20 20 20 2a 2a 20 64 69 72 65 63 74 6c        ** directl
2c040 79 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  y to the databas
2c050 65 20 66 69 6c 65 2e 20 42 65 63 61 75 73 65 20  e file. Because 
2c060 6f 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  of the atomic-wr
2c070 69 74 65 20 0a 20 20 20 20 20 20 2a 2a 20 70 72  ite .      ** pr
2c080 6f 70 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f  operty of the ho
2c090 73 74 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20  st file-system, 
2c0a0 74 68 69 73 20 69 73 20 73 61 66 65 2e 0a 20 20  this is safe..  
2c0b0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20      */.      rc 
2c0c0 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
2c0d0 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
2c0e0 72 2c 20 31 29 3b 0a 20 20 20 20 7d 65 6c 73 65  r, 1);.    }else
2c0f0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2c100 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74  ite3JournalCreat
2c110 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
2c120 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
2c130 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c140 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e     rc = pager_in
2c150 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
2c160 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20  (pPager, 0);.   
2c170 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6c 73 65     }.    }.#else
2c180 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
2c190 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
2c1a0 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 23  er(pPager, 0);.#
2c1b0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
2c1c0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2c1d0 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2c1e0 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20 20 2f  one_exit;..    /
2c1f0 2a 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61  * If this transa
2c200 63 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74  ction has made t
2c210 68 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c  he database smal
2c220 6c 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61  ler, then all pa
2c230 67 65 73 0a 20 20 20 20 2a 2a 20 62 65 69 6e 67  ges.    ** being
2c240 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
2c250 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
2c260 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
2c270 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
2c280 2a 2a 20 66 69 6c 65 2e 20 54 68 69 73 20 63 61  ** file. This ca
2c290 6e 20 6f 6e 6c 79 20 68 61 70 70 65 6e 20 69 6e  n only happen in
2c2a0 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 6d 6f 64   auto-vacuum mod
2c2b0 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  e..    **.    **
2c2c0 20 42 65 66 6f 72 65 20 72 65 61 64 69 6e 67 20   Before reading 
2c2d0 74 68 65 20 70 61 67 65 73 20 77 69 74 68 20 70  the pages with p
2c2e0 61 67 65 20 6e 75 6d 62 65 72 73 20 6c 61 72 67  age numbers larg
2c2f0 65 72 20 74 68 61 6e 20 74 68 65 20 0a 20 20 20  er than the .   
2c300 20 2a 2a 20 63 75 72 72 65 6e 74 20 76 61 6c 75   ** current valu
2c310 65 20 6f 66 20 50 61 67 65 72 2e 64 62 53 69 7a  e of Pager.dbSiz
2c320 65 2c 20 73 65 74 20 64 62 53 69 7a 65 20 62 61  e, set dbSize ba
2c330 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75 65 0a  ck to the value.
2c340 20 20 20 20 2a 2a 20 74 68 61 74 20 69 74 20 74      ** that it t
2c350 6f 6f 6b 20 61 74 20 74 68 65 20 73 74 61 72 74  ook at the start
2c360 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
2c370 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ion. Otherwise, 
2c380 74 68 65 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 73  the.    ** calls
2c390 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
2c3a0 47 65 74 28 29 20 72 65 74 75 72 6e 20 7a 65 72  Get() return zer
2c3b0 6f 65 64 20 70 61 67 65 73 20 69 6e 73 74 65 61  oed pages instea
2c3c0 64 20 6f 66 20 0a 20 20 20 20 2a 2a 20 72 65 61  d of .    ** rea
2c3d0 64 69 6e 67 20 64 61 74 61 20 66 72 6f 6d 20 74  ding data from t
2c3e0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2c3f0 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 6e 64 65 66  ..    */.#ifndef
2c400 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
2c410 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20  OVACUUM.    if( 
2c420 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 70  pPager->dbSize<p
2c430 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2c440 65 0a 20 20 20 20 20 26 26 20 70 50 61 67 65 72  e.     && pPager
2c450 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d 50  ->journalMode!=P
2c460 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2c470 5f 4f 46 46 20 0a 20 20 20 20 29 7b 0a 20 20 20  _OFF .    ){.   
2c480 20 20 20 50 67 6e 6f 20 69 3b 20 20 20 20 20 20     Pgno i;      
2c490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c4b0 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c  Iterator variabl
2c4c0 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
2c4d0 20 50 67 6e 6f 20 69 53 6b 69 70 20 3d 20 50 41   Pgno iSkip = PA
2c4e0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
2c4f0 65 72 29 3b 20 2f 2a 20 50 65 6e 64 69 6e 67 20  er); /* Pending 
2c500 6c 6f 63 6b 20 70 61 67 65 20 2a 2f 0a 20 20 20  lock page */.   
2c510 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20 64 62     const Pgno db
2c520 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
2c530 62 53 69 7a 65 3b 20 20 20 20 20 20 20 2f 2a 20  bSize;       /* 
2c540 44 61 74 61 62 61 73 65 20 69 6d 61 67 65 20 73  Database image s
2c550 69 7a 65 20 2a 2f 20 0a 20 20 20 20 20 20 70 50  ize */ .      pP
2c560 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
2c570 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a  Pager->dbOrigSiz
2c580 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 20 69 3d  e;.      for( i=
2c590 64 62 53 69 7a 65 2b 31 3b 20 69 3c 3d 70 50 61  dbSize+1; i<=pPa
2c5a0 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3b  ger->dbOrigSize;
2c5b0 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20   i++ ){.        
2c5c0 69 66 28 20 21 73 71 6c 69 74 65 33 42 69 74 76  if( !sqlite3Bitv
2c5d0 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70  ecTest(pPager->p
2c5e0 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29 20 26 26  InJournal, i) &&
2c5f0 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20   i!=iSkip ){.   
2c600 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
2c610 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2c620 20 2f 2a 20 50 61 67 65 20 74 6f 20 6a 6f 75 72   /* Page to jour
2c630 6e 61 6c 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  nal */.         
2c640 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
2c650 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c  erGet(pPager, i,
2c660 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
2c670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2c680 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2c690 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2c6a0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  it;.          rc
2c6b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
2c6c0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
2c6d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
2c6e0 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
2c6f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
2c700 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
2c710 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65  oto commit_phase
2c720 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 20  _one_exit;.     
2c730 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20     }.      } .  
2c740 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
2c750 7a 65 20 3d 20 64 62 53 69 7a 65 3b 0a 20 20 20  ze = dbSize;.   
2c760 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f   }.#endif..    /
2c770 2a 20 57 72 69 74 65 20 74 68 65 20 6d 61 73 74  * Write the mast
2c780 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
2c790 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2c7a0 20 66 69 6c 65 2e 20 49 66 20 61 20 6d 61 73 74   file. If a mast
2c7b0 65 72 20 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  er .    ** journ
2c7c0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
2c7d0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
2c7e0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
2c7f0 72 6e 61 6c 20 66 69 6c 65 2c 20 0a 20 20 20 20  rnal file, .    
2c800 2a 2a 20 6f 72 20 69 66 20 7a 4d 61 73 74 65 72  ** or if zMaster
2c810 20 69 73 20 4e 55 4c 4c 20 28 6e 6f 20 6d 61 73   is NULL (no mas
2c820 74 65 72 20 6a 6f 75 72 6e 61 6c 29 2c 20 74 68  ter journal), th
2c830 65 6e 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20  en this call is 
2c840 61 20 6e 6f 2d 6f 70 2e 0a 20 20 20 20 2a 2f 0a  a no-op..    */.
2c850 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61      rc = writeMa
2c860 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67  sterJournal(pPag
2c870 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
2c880 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2c890 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d 6d 69  _OK ) goto commi
2c8a0 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74  t_phase_one_exit
2c8b0 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
2c8c0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2c8d0 20 49 66 20 74 68 65 20 61 74 6f 6d 69 63 2d 75   If the atomic-u
2c8e0 70 64 61 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  pdate optimizati
2c8f0 6f 6e 20 69 73 20 62 65 69 6e 67 0a 20 20 20 20  on is being.    
2c900 2a 2a 20 75 73 65 64 2c 20 74 68 69 73 20 63 61  ** used, this ca
2c910 6c 6c 20 77 69 6c 6c 20 6e 6f 74 20 63 72 65 61  ll will not crea
2c920 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
2c930 69 6c 65 20 6f 72 20 70 65 72 66 6f 72 6d 20 61  ile or perform a
2c940 6e 79 0a 20 20 20 20 2a 2a 20 72 65 61 6c 20 49  ny.    ** real I
2c950 4f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  O..    */.    rc
2c960 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
2c970 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
2c980 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2c990 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2c9a0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20  e_one_exit;..   
2c9b0 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
2c9c0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
2c9d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
2c9e0 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
2c9f0 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
2ca00 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 69  (sqlite3PcacheDi
2ca10 72 74 79 4c 69 73 74 28 70 50 61 67 65 72 2d 3e  rtyList(pPager->
2ca20 70 50 43 61 63 68 65 29 29 3b 0a 20 20 20 20 69  pPCache));.    i
2ca30 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2ca40 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
2ca50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc!=SQLITE_IOE
2ca60 52 52 5f 42 4c 4f 43 4b 45 44 20 29 3b 0a 20 20  RR_BLOCKED );.  
2ca70 20 20 20 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f      goto commit_
2ca80 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a  phase_one_exit;.
2ca90 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2caa0 33 50 63 61 63 68 65 43 6c 65 61 6e 41 6c 6c 28  3PcacheCleanAll(
2cab0 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
2cac0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ;..    /* If the
2cad0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
2cae0 20 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 73 69   not the same si
2caf0 7a 65 20 61 73 20 74 68 65 20 64 61 74 61 62 61  ze as the databa
2cb00 73 65 20 69 6d 61 67 65 2c 0a 20 20 20 20 2a 2a  se image,.    **
2cb10 20 74 68 65 6e 20 75 73 65 20 70 61 67 65 72 5f   then use pager_
2cb20 74 72 75 6e 63 61 74 65 20 74 6f 20 67 72 6f 77  truncate to grow
2cb30 20 6f 72 20 73 68 72 69 6e 6b 20 74 68 65 20 66   or shrink the f
2cb40 69 6c 65 20 68 65 72 65 2e 0a 20 20 20 20 2a 2f  ile here..    */
2cb50 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
2cb60 3e 64 62 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  >dbSize!=pPager-
2cb70 3e 64 62 46 69 6c 65 53 69 7a 65 20 29 7b 0a 20  >dbFileSize ){. 
2cb80 20 20 20 20 20 50 67 6e 6f 20 6e 4e 65 77 20 3d       Pgno nNew =
2cb90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
2cba0 2d 20 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  - (pPager->dbSiz
2cbb0 65 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  e==PAGER_MJ_PGNO
2cbc0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
2cbd0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2cbe0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
2cbf0 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 20 20 20  CLUSIVE );.     
2cc00 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
2cc10 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e 4e 65  cate(pPager, nNe
2cc20 77 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  w);.      if( rc
2cc30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
2cc40 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2cc50 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  one_exit;.    }.
2cc60 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c  .    /* Finally,
2cc70 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
2cc80 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
2cc90 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
2cca0 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29  ync && !noSync )
2ccb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
2ccc0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
2ccd0 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
2cce0 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
2ccf0 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
2cd00 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  DBSYNC %p\n", pP
2cd10 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67  ager))..    pPag
2cd20 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
2cd30 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a 0a 63  R_SYNCED;.  }..c
2cd40 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2cd50 65 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d  exit:.  if( rc==
2cd60 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
2cd70 43 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70  CKED ){.    /* p
2cd80 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65  ager_incr_change
2cd90 63 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74  counter() may at
2cda0 74 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20  tempt to obtain 
2cdb0 61 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20  an exclusive.   
2cdc0 20 2a 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c   ** lock to spil
2cdd0 6c 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  l the cache and 
2cde0 72 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f  return IOERR_BLO
2cdf0 43 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20  CKED. But since 
2ce00 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73  .    ** there is
2ce10 20 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63   no chance the c
2ce20 61 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73  ache is inconsis
2ce30 74 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20  tent, it is.    
2ce40 2a 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74  ** better to ret
2ce50 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  urn SQLITE_BUSY.
2ce60 0a 20 20 20 20 2a 2a 2f 0a 20 20 20 20 72 63 20  .    **/.    rc 
2ce70 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
2ce80 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
2ce90 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  }.../*.** When t
2cea0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2ceb0 63 61 6c 6c 65 64 2c 20 74 68 65 20 64 61 74 61  called, the data
2cec0 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
2ced0 65 6e 20 63 6f 6d 70 6c 65 74 65 6c 79 0a 2a 2a  en completely.**
2cee0 20 75 70 64 61 74 65 64 20 74 6f 20 72 65 66 6c   updated to refl
2cef0 65 63 74 20 74 68 65 20 63 68 61 6e 67 65 73 20  ect the changes 
2cf00 6d 61 64 65 20 62 79 20 74 68 65 20 63 75 72 72  made by the curr
2cf10 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
2cf20 61 6e 64 0a 2a 2a 20 73 79 6e 63 65 64 20 74 6f  and.** synced to
2cf30 20 64 69 73 6b 2e 20 54 68 65 20 6a 6f 75 72 6e   disk. The journ
2cf40 61 6c 20 66 69 6c 65 20 73 74 69 6c 6c 20 65 78  al file still ex
2cf50 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ists in the file
2cf60 2d 73 79 73 74 65 6d 20 0a 2a 2a 20 74 68 6f 75  -system .** thou
2cf70 67 68 2c 20 61 6e 64 20 69 66 20 61 20 66 61 69  gh, and if a fai
2cf80 6c 75 72 65 20 6f 63 63 75 72 73 20 61 74 20 74  lure occurs at t
2cf90 68 69 73 20 70 6f 69 6e 74 20 69 74 20 77 69 6c  his point it wil
2cfa0 6c 20 65 76 65 6e 74 75 61 6c 6c 79 0a 2a 2a 20  l eventually.** 
2cfb0 62 65 20 75 73 65 64 20 61 73 20 61 20 68 6f 74  be used as a hot
2cfc0 2d 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 65  -journal and the
2cfd0 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
2cfe0 74 69 6f 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b  tion rolled back
2cff0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2d000 63 74 69 6f 6e 20 66 69 6e 61 6c 69 7a 65 73 20  ction finalizes 
2d010 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2d020 2c 20 65 69 74 68 65 72 20 62 79 20 64 65 6c 65  , either by dele
2d030 74 69 6e 67 2c 20 0a 2a 2a 20 74 72 75 6e 63 61  ting, .** trunca
2d040 74 69 6e 67 20 6f 72 20 70 61 72 74 69 61 6c 6c  ting or partiall
2d050 79 20 7a 65 72 6f 69 6e 67 20 69 74 2c 20 73 6f  y zeroing it, so
2d060 20 74 68 61 74 20 69 74 20 63 61 6e 6e 6f 74 20   that it cannot 
2d070 62 65 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20  be used .** for 
2d080 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c  hot-journal roll
2d090 62 61 63 6b 2e 20 4f 6e 63 65 20 74 68 69 73 20  back. Once this 
2d0a0 69 73 20 64 6f 6e 65 20 74 68 65 20 74 72 61 6e  is done the tran
2d0b0 73 61 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 69 72  saction is.** ir
2d0c0 72 65 76 6f 63 61 62 6c 79 20 63 6f 6d 6d 69 74  revocably commit
2d0d0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ted..**.** If an
2d0e0 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 61   error occurs, a
2d0f0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2d100 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
2d110 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 6d 6f 76  the pager.** mov
2d120 65 73 20 69 6e 74 6f 20 74 68 65 20 65 72 72 6f  es into the erro
2d130 72 20 73 74 61 74 65 2e 20 4f 74 68 65 72 77 69  r state. Otherwi
2d140 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  se, SQLITE_OK is
2d150 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
2d160 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  t sqlite3PagerCo
2d170 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61 67  mmitPhaseTwo(Pag
2d180 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
2d190 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2d1a0 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K;              
2d1b0 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
2d1c0 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 44 6f 20 6e  de */..  /* Do n
2d1d0 6f 74 20 70 72 6f 63 65 65 64 20 69 66 20 74 68  ot proceed if th
2d1e0 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
2d1f0 64 79 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20  dy in the error 
2d200 73 74 61 74 65 2e 20 2a 2f 0a 20 20 69 66 28 20  state. */.  if( 
2d210 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
2d220 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
2d230 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
2d240 20 7d 0a 0a 20 20 2f 2a 20 54 68 69 73 20 66 75   }..  /* This fu
2d250 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 6e 6f  nction should no
2d260 74 20 62 65 20 63 61 6c 6c 65 64 20 69 66 20 74  t be called if t
2d270 68 65 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20  he pager is not 
2d280 69 6e 20 61 74 20 6c 65 61 73 74 0a 20 20 2a 2a  in at least.  **
2d290 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
2d2a0 73 74 61 74 65 2e 20 41 6e 64 20 69 6e 64 65 65  state. And indee
2d2b0 64 20 53 51 4c 69 74 65 20 6e 65 76 65 72 20 64  d SQLite never d
2d2c0 6f 65 73 20 74 68 69 73 2e 20 42 75 74 20 69 74  oes this. But it
2d2d0 20 69 73 0a 20 20 2a 2a 20 6e 69 63 65 20 74 6f   is.  ** nice to
2d2e0 20 68 61 76 65 20 74 68 69 73 20 64 65 66 65 6e   have this defen
2d2f0 73 69 76 65 20 62 6c 6f 63 6b 20 68 65 72 65 20  sive block here 
2d300 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 69  anyway..  */.  i
2d310 66 28 20 4e 45 56 45 52 28 70 50 61 67 65 72 2d  f( NEVER(pPager-
2d320 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
2d330 45 52 56 45 44 29 20 29 7b 0a 20 20 20 20 72 65  ERVED) ){.    re
2d340 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
2d350 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41 6e 20  R;.  }..  /* An 
2d360 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 49 66  optimization. If
2d370 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 61   the database wa
2d380 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79 20 6d  s not actually m
2d390 6f 64 69 66 69 65 64 20 64 75 72 69 6e 67 0a 20  odified during. 
2d3a0 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73 61 63   ** this transac
2d3b0 74 69 6f 6e 2c 20 74 68 65 20 70 61 67 65 72 20  tion, the pager 
2d3c0 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
2d3d0 63 6c 75 73 69 76 65 2d 6d 6f 64 65 20 61 6e 64  clusive-mode and
2d3e0 20 69 73 0a 20 20 2a 2a 20 75 73 69 6e 67 20 70   is.  ** using p
2d3f0 65 72 73 69 73 74 65 6e 74 20 6a 6f 75 72 6e 61  ersistent journa
2d400 6c 73 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75  ls, then this fu
2d410 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
2d420 70 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  p..  **.  ** The
2d430 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f   start of the jo
2d440 75 72 6e 61 6c 20 66 69 6c 65 20 63 75 72 72 65  urnal file curre
2d450 6e 74 6c 79 20 63 6f 6e 74 61 69 6e 73 20 61 20  ntly contains a 
2d460 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 20 0a  single journal .
2d470 20 20 2a 2a 20 68 65 61 64 65 72 20 77 69 74 68    ** header with
2d480 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20   the nRec field 
2d490 73 65 74 20 74 6f 20 30 2e 20 49 66 20 73 75 63  set to 0. If suc
2d4a0 68 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20 75  h a journal is u
2d4b0 73 65 64 20 61 73 0a 20 20 2a 2a 20 61 20 68 6f  sed as.  ** a ho
2d4c0 74 2d 6a 6f 75 72 6e 61 6c 20 64 75 72 69 6e 67  t-journal during
2d4d0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f 6c   hot-journal rol
2d4e0 6c 62 61 63 6b 2c 20 30 20 63 68 61 6e 67 65 73  lback, 0 changes
2d4f0 20 77 69 6c 6c 20 62 65 20 6d 61 64 65 0a 20 20   will be made.  
2d500 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
2d510 73 65 20 66 69 6c 65 2e 20 53 6f 20 74 68 65 72  se file. So ther
2d520 65 20 69 73 20 6e 6f 20 6e 65 65 64 20 74 6f 20  e is no need to 
2d530 7a 65 72 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  zero the journal
2d540 20 0a 20 20 2a 2a 20 68 65 61 64 65 72 2e 20 53   .  ** header. S
2d550 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
2d560 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d  s in exclusive m
2d570 6f 64 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f  ode, there is no
2d580 20 6e 65 65 64 0a 20 20 2a 2a 20 74 6f 20 64 72   need.  ** to dr
2d590 6f 70 20 61 6e 79 20 6c 6f 63 6b 73 20 65 69 74  op any locks eit
2d5a0 68 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  her..  */.  if( 
2d5b0 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
2d5c0 65 64 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d  ed==0 && pPager-
2d5d0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
2d5e0 20 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f     && pPager->jo
2d5f0 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52  urnalMode==PAGER
2d600 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
2d610 53 49 53 54 0a 20 20 29 7b 0a 20 20 20 20 61 73  SIST.  ){.    as
2d620 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
2d630 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41  urnalOff==JOURNA
2d640 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
2d650 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   );.    return S
2d660 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20  QLITE_OK;.  }.. 
2d670 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43 4f   PAGERTRACE(("CO
2d680 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45  MMIT %d\n", PAGE
2d690 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
2d6a0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2d6b0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59  >state==PAGER_SY
2d6c0 4e 43 45 44 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  NCED || MEMDB ||
2d6d0 20 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69   !pPager->dbModi
2d6e0 66 69 65 64 20 29 3b 0a 20 20 72 63 20 3d 20 70  fied );.  rc = p
2d6f0 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
2d700 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70 50 61  tion(pPager, pPa
2d710 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 3b  ger->setMaster);
2d720 0a 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f  .  return pager_
2d730 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
2d740 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  );.}../*.** Roll
2d750 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e 67 65 73  back all changes
2d760 2e 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  . The database f
2d770 61 6c 6c 73 20 62 61 63 6b 20 74 6f 20 50 41 47  alls back to PAG
2d780 45 52 5f 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a  ER_SHARED mode..
2d790 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2d7a0 69 6f 6e 20 70 65 72 66 6f 72 6d 73 20 74 77 6f  ion performs two
2d7b0 20 74 61 73 6b 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   tasks:.**.**   
2d7c0 31 29 20 49 74 20 72 6f 6c 6c 73 20 62 61 63 6b  1) It rolls back
2d7d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2d7e0 65 2c 20 72 65 73 74 6f 72 69 6e 67 20 61 6c 6c  e, restoring all
2d7f0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2d800 6e 64 20 0a 2a 2a 20 20 20 20 20 20 69 6e 2d 6d  nd .**      in-m
2d810 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
2d820 73 20 74 6f 20 74 68 65 20 73 74 61 74 65 20 74  s to the state t
2d830 68 65 79 20 77 65 72 65 20 69 6e 20 77 68 65 6e  hey were in when
2d840 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
2d850 0a 2a 2a 20 20 20 20 20 20 77 61 73 20 6f 70 65  .**      was ope
2d860 6e 65 64 2c 20 61 6e 64 0a 2a 2a 20 20 20 32 29  ned, and.**   2)
2d870 20 49 74 20 66 69 6e 61 6c 69 7a 65 73 20 74 68   It finalizes th
2d880 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20  e journal file, 
2d890 73 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  so that it is no
2d8a0 74 20 75 73 65 64 20 66 6f 72 20 68 6f 74 0a 2a  t used for hot.*
2d8b0 2a 20 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  *      rollback 
2d8c0 61 74 20 61 6e 79 20 70 6f 69 6e 74 20 69 6e 20  at any point in 
2d8d0 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 0a 2a  the future..**.*
2d8e0 2a 20 73 75 62 6a 65 63 74 20 74 6f 20 74 68 65  * subject to the
2d8f0 20 66 6f 6c 6c 6f 77 69 6e 67 20 71 75 61 6c 69   following quali
2d900 66 69 63 61 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  fications:.**.**
2d910 20 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61   * If the journa
2d920 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 79 65  l file is not ye
2d930 74 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  t open when this
2d940 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
2d950 6c 65 64 2c 0a 2a 2a 20 20 20 74 68 65 6e 20 6f  led,.**   then o
2d960 6e 6c 79 20 28 32 29 20 69 73 20 70 65 72 66 6f  nly (2) is perfo
2d970 72 6d 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61  rmed. In this ca
2d980 73 65 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6a  se there is no j
2d990 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
2d9a0 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 2e 0a 2a   to roll back..*
2d9b0 2a 0a 2a 2a 20 2a 20 49 66 20 69 6e 20 61 6e 20  *.** * If in an 
2d9c0 65 72 72 6f 72 20 73 74 61 74 65 20 6f 74 68 65  error state othe
2d9d0 72 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 46 55  r than SQLITE_FU
2d9e0 4c 4c 2c 20 74 68 65 6e 20 74 61 73 6b 20 28 31  LL, then task (1
2d9f0 29 20 69 73 20 0a 2a 2a 20 20 20 70 65 72 66 6f  ) is .**   perfo
2da00 72 6d 65 64 2e 20 49 66 20 73 75 63 63 65 73 73  rmed. If success
2da10 66 75 6c 2c 20 74 61 73 6b 20 28 32 29 2e 20 52  ful, task (2). R
2da20 65 67 61 72 64 6c 65 73 73 20 6f 66 20 74 68 65  egardless of the
2da30 20 6f 75 74 63 6f 6d 65 0a 2a 2a 20 20 20 6f 66   outcome.**   of
2da40 20 65 69 74 68 65 72 2c 20 74 68 65 20 65 72 72   either, the err
2da50 6f 72 20 73 74 61 74 65 20 65 72 72 6f 72 20 63  or state error c
2da60 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
2da70 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 0a 2a 2a  to the caller.**
2da80 20 20 20 28 69 2e 65 2e 20 65 69 74 68 65 72 20     (i.e. either 
2da90 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 6f 72 20  SQLITE_IOERR or 
2daa0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 2e  SQLITE_CORRUPT).
2dab0 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20 74 68 65 20  .**.** * If the 
2dac0 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47 45  pager is in PAGE
2dad0 52 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65  R_RESERVED state
2dae0 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20 28  , then attempt (
2daf0 31 29 2e 20 57 68 65 74 68 65 72 0a 2a 2a 20 20  1). Whether.**  
2db00 20 6f 72 20 6e 6f 74 20 28 31 29 20 69 73 20 73   or not (1) is s
2db10 75 63 63 75 73 73 66 75 6c 2c 20 61 6c 73 6f 20  uccussful, also 
2db20 61 74 74 65 6d 70 74 20 28 32 29 2e 20 49 66 20  attempt (2). If 
2db30 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
2db40 72 6e 0a 2a 2a 20 20 20 53 51 4c 49 54 45 5f 4f  rn.**   SQLITE_O
2db50 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 65 6e  K. Otherwise, en
2db60 74 65 72 20 74 68 65 20 65 72 72 6f 72 20 73 74  ter the error st
2db70 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74  ate and return t
2db80 68 65 20 66 69 72 73 74 20 0a 2a 2a 20 20 20 65  he first .**   e
2db90 72 72 6f 72 20 63 6f 64 65 20 65 6e 63 6f 75 6e  rror code encoun
2dba0 74 65 72 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 20 20  tered. .**.**   
2dbb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2dbc0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
2dbd0 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61 73  that the databas
2dbe0 65 20 77 61 73 20 77 72 69 74 74 65 6e 20 74 6f  e was written to
2dbf0 2e 20 0a 2a 2a 20 20 20 53 6f 20 69 73 20 73 61  . .**   So is sa
2dc00 66 65 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  fe to finalize t
2dc10 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2dc20 65 76 65 6e 20 69 66 20 74 68 65 20 70 6c 61 79  even if the play
2dc30 62 61 63 6b 20 0a 2a 2a 20 20 20 28 6f 70 65 72  back .**   (oper
2dc40 61 74 69 6f 6e 20 31 29 20 66 61 69 6c 65 64 2e  ation 1) failed.
2dc50 20 48 6f 77 65 76 65 72 20 74 68 65 20 70 61 67   However the pag
2dc60 65 72 20 6d 75 73 74 20 65 6e 74 65 72 20 74 68  er must enter th
2dc70 65 20 65 72 72 6f 72 20 73 74 61 74 65 0a 2a 2a  e error state.**
2dc80 20 20 20 61 73 20 74 68 65 20 63 6f 6e 74 65 6e     as the conten
2dc90 74 73 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65 6d  ts of the in-mem
2dca0 6f 72 79 20 63 61 63 68 65 20 61 72 65 20 6e 6f  ory cache are no
2dcb0 77 20 73 75 73 70 65 63 74 2e 0a 2a 2a 0a 2a 2a  w suspect..**.**
2dcc0 20 2a 20 46 69 6e 61 6c 6c 79 2c 20 69 66 20 69   * Finally, if i
2dcd0 6e 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  n PAGER_EXCLUSIV
2dce0 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 61 74  E state, then at
2dcf0 74 65 6d 70 74 20 28 31 29 2e 20 4f 6e 6c 79 0a  tempt (1). Only.
2dd00 2a 2a 20 20 20 61 74 74 65 6d 70 74 20 28 32 29  **   attempt (2)
2dd10 20 69 66 20 28 31 29 20 69 73 20 73 75 63 63 65   if (1) is succe
2dd20 73 73 66 75 6c 2e 20 52 65 74 75 72 6e 20 53 51  ssful. Return SQ
2dd30 4c 49 54 45 5f 4f 4b 20 69 66 20 73 75 63 63 65  LITE_OK if succe
2dd40 73 73 66 75 6c 2c 0a 2a 2a 20 20 20 6f 74 68 65  ssful,.**   othe
2dd50 72 77 69 73 65 20 65 6e 74 65 72 20 74 68 65 20  rwise enter the 
2dd60 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20  error state and 
2dd70 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72  return the error
2dd80 20 63 6f 64 65 20 66 72 6f 6d 20 74 68 65 20 0a   code from the .
2dd90 2a 2a 20 20 20 66 61 69 6c 69 6e 67 20 6f 70 65  **   failing ope
2dda0 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20  ration..**.**   
2ddb0 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2ddc0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d   database file m
2ddd0 61 79 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  ay have been wri
2dde0 74 74 65 6e 20 74 6f 2e 20 53 6f 20 69 66 20 74  tten to. So if t
2ddf0 68 65 0a 2a 2a 20 20 20 70 6c 61 79 62 61 63 6b  he.**   playback
2de00 20 6f 70 65 72 61 74 69 6f 6e 20 64 69 64 20 6e   operation did n
2de10 6f 74 20 73 75 63 63 65 65 64 20 69 74 20 77 6f  ot succeed it wo
2de20 75 6c 64 20 6e 6f 74 20 62 65 20 73 61 66 65 20  uld not be safe 
2de30 74 6f 20 66 69 6e 61 6c 69 7a 65 0a 2a 2a 20 20  to finalize.**  
2de40 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2de50 65 2e 20 49 74 20 6e 65 65 64 73 20 74 6f 20 62  e. It needs to b
2de60 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
2de70 6c 65 2d 73 79 73 74 65 6d 20 73 6f 20 74 68 61  le-system so tha
2de80 74 0a 2a 2a 20 20 20 73 6f 6d 65 20 6f 74 68 65  t.**   some othe
2de90 72 20 70 72 6f 63 65 73 73 20 63 61 6e 20 75 73  r process can us
2dea0 65 20 69 74 20 74 6f 20 72 65 73 74 6f 72 65 20  e it to restore 
2deb0 74 68 65 20 64 61 74 61 62 61 73 65 20 73 74 61  the database sta
2dec0 74 65 20 28 62 79 0a 2a 2a 20 20 20 68 6f 74 2d  te (by.**   hot-
2ded0 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
2dee0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
2def0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
2df00 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2df10 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
2df20 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
2df30 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
2df40 63 6f 64 65 20 2a 2f 0a 20 20 50 41 47 45 52 54  code */.  PAGERT
2df50 52 41 43 45 28 28 22 52 4f 4c 4c 42 41 43 4b 20  RACE(("ROLLBACK 
2df60 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
2df70 50 61 67 65 72 29 29 29 3b 0a 20 20 69 66 28 20  Pager)));.  if( 
2df80 21 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66  !pPager->dbModif
2df90 69 65 64 20 7c 7c 20 21 69 73 4f 70 65 6e 28 70  ied || !isOpen(p
2dfa0 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20  Pager->jfd) ){. 
2dfb0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e     rc = pager_en
2dfc0 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50  d_transaction(pP
2dfd0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65  ager, pPager->se
2dfe0 74 4d 61 73 74 65 72 29 3b 0a 20 20 7d 65 6c 73  tMaster);.  }els
2dff0 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72  e if( pPager->er
2e000 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
2e010 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
2e020 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69 66 28  _FULL ){.    if(
2e030 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
2e040 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
2e050 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 70  ){.      pager_p
2e060 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
2e070 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  0);.    }.    rc
2e080 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f   = pPager->errCo
2e090 64 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  de;.  }else{.   
2e0a0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
2e0b0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
2e0c0 45 44 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ED ){.      int 
2e0d0 72 63 32 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  rc2;.      rc = 
2e0e0 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
2e0f0 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 20  Pager, 0);.     
2e100 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64   rc2 = pager_end
2e110 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
2e120 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
2e130 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
2e140 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2e150 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
2e160 20 72 63 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc2;.      }.  
2e170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2e180 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
2e190 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
2e1a0 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d     }..    if( !M
2e1b0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 50  EMDB ){.      pP
2e1c0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2e1d0 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  d = 0;.    }..  
2e1e0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
2e1f0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
2e200 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
2e210 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
2e220 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 20 20  t the pager.    
2e230 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c  ** cache. So cal
2e240 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20  l pager_error() 
2e250 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74 20 74  on the way out t
2e260 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72  o make any error
2e270 20 0a 20 20 20 20 2a 2a 20 70 65 72 73 69 73 74   .    ** persist
2e280 65 6e 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ent..    */.    
2e290 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72  rc = pager_error
2e2a0 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
2e2b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
2e2c0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
2e2d0 52 55 45 20 69 66 20 74 68 65 20 64 61 74 61 62  RUE if the datab
2e2e0 61 73 65 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  ase file is open
2e2f0 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52  ed read-only.  R
2e300 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
2e310 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69  f the database i
2e320 73 20 28 69 6e 20 74 68 65 6f 72 79 29 20 77 72  s (in theory) wr
2e330 69 74 61 62 6c 65 2e 0a 2a 2f 0a 75 38 20 73 71  itable..*/.u8 sq
2e340 6c 69 74 65 33 50 61 67 65 72 49 73 72 65 61 64  lite3PagerIsread
2e350 6f 6e 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67  only(Pager *pPag
2e360 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2e370 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a  ager->readOnly;.
2e380 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2e390 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
2e3a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
2e3b0 70 61 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71  pager..*/.int sq
2e3c0 6c 69 74 65 33 50 61 67 65 72 52 65 66 63 6f 75  lite3PagerRefcou
2e3d0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
2e3e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
2e3f0 74 65 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e  te3PcacheRefCoun
2e400 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2e410 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  e);.}../*.** Ret
2e420 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
2e430 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
2e440 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
2e450 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
2e460 65 33 50 61 67 65 72 50 61 67 65 52 65 66 63 6f  e3PagerPageRefco
2e470 75 6e 74 28 44 62 50 61 67 65 20 2a 70 50 61 67  unt(DbPage *pPag
2e480 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
2e490 69 74 65 33 50 63 61 63 68 65 50 61 67 65 52 65  ite3PcachePageRe
2e4a0 66 63 6f 75 6e 74 28 70 50 61 67 65 29 3b 0a 7d  fcount(pPage);.}
2e4b0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
2e4c0 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  TEST./*.** This 
2e4d0 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20  routine is used 
2e4e0 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64 20  for testing and 
2e4f0 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a  analysis only..*
2e500 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65 33 50 61  /.int *sqlite3Pa
2e510 67 65 72 53 74 61 74 73 28 50 61 67 65 72 20 2a  gerStats(Pager *
2e520 70 50 61 67 65 72 29 7b 0a 20 20 73 74 61 74 69  pPager){.  stati
2e530 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61  c int a[11];.  a
2e540 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 50 63 61  [0] = sqlite3Pca
2e550 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
2e560 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20 20  er->pPCache);.  
2e570 61 5b 31 5d 20 3d 20 73 71 6c 69 74 65 33 50 63  a[1] = sqlite3Pc
2e580 61 63 68 65 50 61 67 65 63 6f 75 6e 74 28 70 50  achePagecount(pP
2e590 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
2e5a0 20 20 61 5b 32 5d 20 3d 20 73 71 6c 69 74 65 33    a[2] = sqlite3
2e5b0 50 63 61 63 68 65 47 65 74 43 61 63 68 65 73 69  PcacheGetCachesi
2e5c0 7a 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  ze(pPager->pPCac
2e5d0 68 65 29 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50  he);.  a[3] = pP
2e5e0 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69  ager->dbSizeVali
2e5f0 64 20 3f 20 28 69 6e 74 29 20 70 50 61 67 65 72  d ? (int) pPager
2e600 2d 3e 64 62 53 69 7a 65 20 3a 20 2d 31 3b 0a 20  ->dbSize : -1;. 
2e610 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[4] = pPager->
2e620 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20 3d 20  state;.  a[5] = 
2e630 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b  pPager->errCode;
2e640 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67 65 72  .  a[6] = pPager
2e650 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d 20 3d  ->nHit;.  a[7] =
2e660 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a   pPager->nMiss;.
2e670 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f 2a 20    a[8] = 0;  /* 
2e680 55 73 65 64 20 74 6f 20 62 65 20 70 50 61 67 65  Used to be pPage
2e690 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20 61 5b  r->nOvfl */.  a[
2e6a0 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
2e6b0 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
2e6c0 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
2e6d0 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65 6e 64  return a;.}.#end
2e6e0 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  if../*.** Return
2e6f0 20 74 72 75 65 20 69 66 20 74 68 69 73 20 69 73   true if this is
2e700 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   an in-memory pa
2e710 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
2e720 74 65 33 50 61 67 65 72 49 73 4d 65 6d 64 62 28  te3PagerIsMemdb(
2e730 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2e740 20 20 72 65 74 75 72 6e 20 4d 45 4d 44 42 3b 0a    return MEMDB;.
2e750 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74  }../*.** Check t
2e760 68 61 74 20 74 68 65 72 65 20 61 72 65 20 61 74  hat there are at
2e770 20 6c 65 61 73 74 20 6e 53 61 76 65 70 6f 69 6e   least nSavepoin
2e780 74 20 73 61 76 65 70 6f 69 6e 74 73 20 6f 70 65  t savepoints ope
2e790 6e 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 0a  n. If there are.
2e7a0 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20 6c 65 73  ** currently les
2e7b0 73 20 74 68 61 6e 20 6e 53 61 76 65 70 6f 69 6e  s than nSavepoin
2e7c0 74 73 20 6f 70 65 6e 2c 20 74 68 65 6e 20 6f 70  ts open, then op
2e7d0 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  en one or more s
2e7e0 61 76 65 70 6f 69 6e 74 73 0a 2a 2a 20 74 6f 20  avepoints.** to 
2e7f0 6d 61 6b 65 20 75 70 20 74 68 65 20 64 69 66 66  make up the diff
2e800 65 72 65 6e 63 65 2e 20 49 66 20 74 68 65 20 6e  erence. If the n
2e810 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70 6f 69  umber of savepoi
2e820 6e 74 73 20 69 73 20 61 6c 72 65 61 64 79 0a 2a  nts is already.*
2e830 2a 20 65 71 75 61 6c 20 74 6f 20 6e 53 61 76 65  * equal to nSave
2e840 70 6f 69 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  point, then this
2e850 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
2e860 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61  o-op..**.** If a
2e870 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69   memory allocati
2e880 6f 6e 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  on fails, SQLITE
2e890 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
2e8a0 65 64 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20  ed. If an error 
2e8b0 0a 2a 2a 20 6f 63 63 75 72 73 20 77 68 69 6c 65  .** occurs while
2e8c0 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 73 75 62   opening the sub
2e8d0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74  -journal file, t
2e8e0 68 65 6e 20 61 6e 20 49 4f 20 65 72 72 6f 72 20  hen an IO error 
2e8f0 63 6f 64 65 20 69 73 0a 2a 2a 20 72 65 74 75 72  code is.** retur
2e900 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
2e910 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e  SQLITE_OK..*/.in
2e920 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70  t sqlite3PagerOp
2e930 65 6e 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65  enSavepoint(Page
2e940 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e  r *pPager, int n
2e950 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69 6e  Savepoint){.  in
2e960 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
2e970 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2e980 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
2e990 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n code */.  int 
2e9a0 6e 43 75 72 72 65 6e 74 20 3d 20 70 50 61 67 65  nCurrent = pPage
2e9b0 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20  r->nSavepoint;  
2e9c0 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
2e9d0 20 6e 75 6d 62 65 72 20 6f 66 20 73 61 76 65 70   number of savep
2e9e0 6f 69 6e 74 73 20 2a 2f 0a 0a 20 20 69 66 28 20  oints */..  if( 
2e9f0 6e 53 61 76 65 70 6f 69 6e 74 3e 6e 43 75 72 72  nSavepoint>nCurr
2ea00 65 6e 74 20 26 26 20 70 50 61 67 65 72 2d 3e 75  ent && pPager->u
2ea10 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  seJournal ){.   
2ea20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
2ea30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea40 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72           /* Iter
2ea50 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f  ator variable */
2ea60 0a 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f  .    PagerSavepo
2ea70 69 6e 74 20 2a 61 4e 65 77 3b 20 20 20 20 20 20  int *aNew;      
2ea80 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2ea90 4e 65 77 20 50 61 67 65 72 2e 61 53 61 76 65 70  New Pager.aSavep
2eaa0 6f 69 6e 74 20 61 72 72 61 79 20 2a 2f 0a 0a 20  oint array */.. 
2eab0 20 20 20 2f 2a 20 45 69 74 68 65 72 20 74 68 65     /* Either the
2eac0 72 65 20 69 73 20 6e 6f 20 61 63 74 69 76 65 20  re is no active 
2ead0 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 73  journal or the s
2eae0 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  ub-journal is op
2eaf0 65 6e 20 6f 72 20 0a 20 20 20 20 2a 2a 20 74 68  en or .    ** th
2eb00 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  e journal is alw
2eb10 61 79 73 20 73 74 6f 72 65 64 20 69 6e 20 6d 65  ays stored in me
2eb20 6d 6f 72 79 20 2a 2f 0a 20 20 20 20 61 73 73 65  mory */.    asse
2eb30 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  rt( pPager->nSav
2eb40 65 70 6f 69 6e 74 3d 3d 30 20 7c 7c 20 69 73 4f  epoint==0 || isO
2eb50 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64  pen(pPager->sjfd
2eb60 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
2eb70 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
2eb80 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52  Mode==PAGER_JOUR
2eb90 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29  NALMODE_MEMORY )
2eba0 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
2ebb0 68 65 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  he Pager.aSavepo
2ebc0 69 6e 74 20 61 72 72 61 79 20 75 73 69 6e 67 20  int array using 
2ebd0 72 65 61 6c 6c 6f 63 28 29 2e 20 52 65 74 75 72  realloc(). Retur
2ebe0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 20  n SQLITE_NOMEM. 
2ebf0 20 20 20 2a 2a 20 69 66 20 74 68 65 20 61 6c 6c     ** if the all
2ec00 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2e 20 4f  ocation fails. O
2ec10 74 68 65 72 77 69 73 65 2c 20 7a 65 72 6f 20 74  therwise, zero t
2ec20 68 65 20 6e 65 77 20 70 6f 72 74 69 6f 6e 20 69  he new portion i
2ec30 6e 20 63 61 73 65 20 61 20 0a 20 20 20 20 2a 2a  n case a .    **
2ec40 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
2ec50 6f 63 63 75 72 73 20 77 68 69 6c 65 20 70 6f 70  occurs while pop
2ec60 75 6c 61 74 69 6e 67 20 69 74 20 69 6e 20 74 68  ulating it in th
2ec70 65 20 66 6f 72 28 2e 2e 2e 29 20 6c 6f 6f 70 20  e for(...) loop 
2ec80 62 65 6c 6f 77 2e 0a 20 20 20 20 2a 2f 0a 20 20  below..    */.  
2ec90 20 20 61 4e 65 77 20 3d 20 28 50 61 67 65 72 53    aNew = (PagerS
2eca0 61 76 65 70 6f 69 6e 74 20 2a 29 73 71 6c 69 74  avepoint *)sqlit
2ecb0 65 33 52 65 61 6c 6c 6f 63 28 0a 20 20 20 20 20  e3Realloc(.     
2ecc0 20 20 20 70 50 61 67 65 72 2d 3e 61 53 61 76 65     pPager->aSave
2ecd0 70 6f 69 6e 74 2c 20 73 69 7a 65 6f 66 28 50 61  point, sizeof(Pa
2ece0 67 65 72 53 61 76 65 70 6f 69 6e 74 29 2a 6e 53  gerSavepoint)*nS
2ecf0 61 76 65 70 6f 69 6e 74 0a 20 20 20 20 29 3b 0a  avepoint.    );.
2ed00 20 20 20 20 69 66 28 20 21 61 4e 65 77 20 29 7b      if( !aNew ){
2ed10 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
2ed20 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
2ed30 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 61 4e  }.    memset(&aN
2ed40 65 77 5b 6e 43 75 72 72 65 6e 74 5d 2c 20 30 2c  ew[nCurrent], 0,
2ed50 20 28 6e 53 61 76 65 70 6f 69 6e 74 2d 6e 43 75   (nSavepoint-nCu
2ed60 72 72 65 6e 74 29 20 2a 20 73 69 7a 65 6f 66 28  rrent) * sizeof(
2ed70 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 29 29  PagerSavepoint))
2ed80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53  ;.    pPager->aS
2ed90 61 76 65 70 6f 69 6e 74 20 3d 20 61 4e 65 77 3b  avepoint = aNew;
2eda0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53 61  .    pPager->nSa
2edb0 76 65 70 6f 69 6e 74 20 3d 20 6e 53 61 76 65 70  vepoint = nSavep
2edc0 6f 69 6e 74 3b 0a 0a 20 20 20 20 2f 2a 20 50 6f  oint;..    /* Po
2edd0 70 75 6c 61 74 65 20 74 68 65 20 50 61 67 65 72  pulate the Pager
2ede0 53 61 76 65 70 6f 69 6e 74 20 73 74 72 75 63 74  Savepoint struct
2edf0 75 72 65 73 20 6a 75 73 74 20 61 6c 6c 6f 63 61  ures just alloca
2ee00 74 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ted. */.    for(
2ee10 69 69 3d 6e 43 75 72 72 65 6e 74 3b 20 69 69 3c  ii=nCurrent; ii<
2ee20 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b  nSavepoint; ii++
2ee30 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2ee40 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
2ee50 61 6c 69 64 20 29 3b 0a 20 20 20 20 20 20 61 4e  alid );.      aN
2ee60 65 77 5b 69 69 5d 2e 6e 4f 72 69 67 20 3d 20 70  ew[ii].nOrig = p
2ee70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
2ee80 20 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e 28       if( isOpen(
2ee90 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 26 26 20  pPager->jfd) && 
2eea0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2eeb0 66 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ff>0 ){.        
2eec0 61 4e 65 77 5b 69 69 5d 2e 69 4f 66 66 73 65 74  aNew[ii].iOffset
2eed0 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
2eee0 61 6c 4f 66 66 3b 0a 20 20 20 20 20 20 7d 65 6c  alOff;.      }el
2eef0 73 65 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77  se{.        aNew
2ef00 5b 69 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 4a  [ii].iOffset = J
2ef10 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
2ef20 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
2ef30 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69 53       aNew[ii].iS
2ef40 75 62 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e  ubRec = pPager->
2ef50 6e 53 75 62 52 65 63 3b 0a 20 20 20 20 20 20 61  nSubRec;.      a
2ef60 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70  New[ii].pInSavep
2ef70 6f 69 6e 74 20 3d 20 73 71 6c 69 74 65 33 42 69  oint = sqlite3Bi
2ef80 74 76 65 63 43 72 65 61 74 65 28 70 50 61 67 65  tvecCreate(pPage
2ef90 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 20 20  r->dbSize);.    
2efa0 20 20 69 66 28 20 21 61 4e 65 77 5b 69 69 5d 2e    if( !aNew[ii].
2efb0 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  pInSavepoint ){.
2efc0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
2efd0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
2efe0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
2eff0 2f 2a 20 4f 70 65 6e 20 74 68 65 20 73 75 62 2d  /* Open the sub-
2f000 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
2f010 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70  s not already op
2f020 65 6e 65 64 2e 20 2a 2f 0a 20 20 20 20 72 63 20  ened. */.    rc 
2f030 3d 20 6f 70 65 6e 53 75 62 4a 6f 75 72 6e 61 6c  = openSubJournal
2f040 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
2f050 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
2f060 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
2f070 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
2f080 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72 65 6c 65  rollback or rele
2f090 61 73 65 20 28 63 6f 6d 6d 69 74 29 20 61 20 73  ase (commit) a s
2f0a0 61 76 65 70 6f 69 6e 74 2e 0a 2a 2a 20 54 68 65  avepoint..** The
2f0b0 20 73 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 65   savepoint to re
2f0c0 6c 65 61 73 65 20 6f 72 20 72 6f 6c 6c 62 61 63  lease or rollbac
2f0d0 6b 20 6e 65 65 64 20 6e 6f 74 20 62 65 20 74 68  k need not be th
2f0e0 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
2f0f0 0a 2a 2a 20 63 72 65 61 74 65 64 20 73 61 76 65  .** created save
2f100 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 50 61 72  point..**.** Par
2f110 61 6d 65 74 65 72 20 6f 70 20 69 73 20 61 6c 77  ameter op is alw
2f120 61 79 73 20 65 69 74 68 65 72 20 53 41 56 45 50  ays either SAVEP
2f130 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 6f 72  OINT_ROLLBACK or
2f140 20 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41   SAVEPOINT_RELEA
2f150 53 45 2e 0a 2a 2a 20 49 66 20 69 74 20 69 73 20  SE..** If it is 
2f160 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53  SAVEPOINT_RELEAS
2f170 45 2c 20 74 68 65 6e 20 72 65 6c 65 61 73 65 20  E, then release 
2f180 61 6e 64 20 64 65 73 74 72 6f 79 20 74 68 65 20  and destroy the 
2f190 73 61 76 65 70 6f 69 6e 74 20 77 69 74 68 0a 2a  savepoint with.*
2f1a0 2a 20 69 6e 64 65 78 20 69 53 61 76 65 70 6f 69  * index iSavepoi
2f1b0 6e 74 2e 20 49 66 20 69 74 20 69 73 20 53 41 56  nt. If it is SAV
2f1c0 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 2c  EPOINT_ROLLBACK,
2f1d0 20 74 68 65 6e 20 72 6f 6c 6c 62 61 63 6b 20 61   then rollback a
2f1e0 6c 6c 20 63 68 61 6e 67 65 73 0a 2a 2a 20 74 68  ll changes.** th
2f1f0 61 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64  at have occurred
2f200 20 73 69 6e 63 65 20 74 68 65 20 73 70 65 63 69   since the speci
2f210 66 69 65 64 20 73 61 76 65 70 6f 69 6e 74 20 77  fied savepoint w
2f220 61 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  as created..**.*
2f230 2a 20 54 68 65 20 73 61 76 65 70 6f 69 6e 74 20  * The savepoint 
2f240 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 6f 72 20 72  to rollback or r
2f250 65 6c 65 61 73 65 20 69 73 20 69 64 65 6e 74 69  elease is identi
2f260 66 69 65 64 20 62 79 20 70 61 72 61 6d 65 74 65  fied by paramete
2f270 72 20 0a 2a 2a 20 69 53 61 76 65 70 6f 69 6e 74  r .** iSavepoint
2f280 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 30 20 6d  . A value of 0 m
2f290 65 61 6e 73 20 74 6f 20 6f 70 65 72 61 74 65 20  eans to operate 
2f2a0 6f 6e 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74  on the outermost
2f2b0 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 28 74   savepoint.** (t
2f2c0 68 65 20 66 69 72 73 74 20 63 72 65 61 74 65 64  he first created
2f2d0 29 2e 20 41 20 76 61 6c 75 65 20 6f 66 20 28 50  ). A value of (P
2f2e0 61 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d  ager.nSavepoint-
2f2f0 31 29 20 6d 65 61 6e 73 20 6f 70 65 72 61 74 65  1) means operate
2f300 0a 2a 2a 20 6f 6e 20 74 68 65 20 6d 6f 73 74 20  .** on the most 
2f310 72 65 63 65 6e 74 6c 79 20 63 72 65 61 74 65 64  recently created
2f320 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 69   savepoint. If i
2f330 53 61 76 65 70 6f 69 6e 74 20 69 73 20 67 72 65  Savepoint is gre
2f340 61 74 65 72 20 74 68 61 6e 0a 2a 2a 20 28 50 61  ater than.** (Pa
2f350 67 65 72 2e 6e 53 61 76 65 70 6f 69 6e 74 2d 31  ger.nSavepoint-1
2f360 29 2c 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e  ), then this fun
2f370 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
2f380 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 6e 65 67  ..**.** If a neg
2f390 61 74 69 76 65 20 76 61 6c 75 65 20 69 73 20 70  ative value is p
2f3a0 61 73 73 65 64 20 74 6f 20 74 68 69 73 20 66 75  assed to this fu
2f3b0 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65  nction, then the
2f3c0 20 63 75 72 72 65 6e 74 0a 2a 2a 20 74 72 61 6e   current.** tran
2f3d0 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
2f3e0 64 20 62 61 63 6b 2e 20 54 68 69 73 20 69 73 20  d back. This is 
2f3f0 64 69 66 66 65 72 65 6e 74 20 74 6f 20 63 61 6c  different to cal
2f400 6c 69 6e 67 20 0a 2a 2a 20 73 71 6c 69 74 65 33  ling .** sqlite3
2f410 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29 20  PagerRollback() 
2f420 62 65 63 61 75 73 65 20 74 68 69 73 20 66 75 6e  because this fun
2f430 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 74  ction does not t
2f440 65 72 6d 69 6e 61 74 65 0a 2a 2a 20 74 68 65 20  erminate.** the 
2f450 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20 75  transaction or u
2f460 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
2f470 73 65 2c 20 69 74 20 6a 75 73 74 20 72 65 73 74  se, it just rest
2f480 6f 72 65 73 20 74 68 65 20 0a 2a 2a 20 63 6f 6e  ores the .** con
2f490 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
2f4a0 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
2f4b0 67 69 6e 61 6c 20 73 74 61 74 65 2e 20 0a 2a 2a  ginal state. .**
2f4c0 0a 2a 2a 20 49 6e 20 61 6e 79 20 63 61 73 65 2c  .** In any case,
2f4d0 20 61 6c 6c 20 73 61 76 65 70 6f 69 6e 74 73 20   all savepoints 
2f4e0 77 69 74 68 20 61 6e 20 69 6e 64 65 78 20 67 72  with an index gr
2f4f0 65 61 74 65 72 20 74 68 61 6e 20 69 53 61 76 65  eater than iSave
2f500 70 6f 69 6e 74 20 0a 2a 2a 20 61 72 65 20 64 65  point .** are de
2f510 73 74 72 6f 79 65 64 2e 20 49 66 20 74 68 69 73  stroyed. If this
2f520 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f 70   is a release op
2f530 65 72 61 74 69 6f 6e 20 28 6f 70 3d 3d 53 41 56  eration (op==SAV
2f540 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 29 2c  EPOINT_RELEASE),
2f550 0a 2a 2a 20 74 68 65 6e 20 73 61 76 65 70 6f 69  .** then savepoi
2f560 6e 74 20 69 53 61 76 65 70 6f 69 6e 74 20 69 73  nt iSavepoint is
2f570 20 61 6c 73 6f 20 64 65 73 74 72 6f 79 65 64 2e   also destroyed.
2f580 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
2f590 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20  tion may return 
2f5a0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
2f5b0 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74  a memory allocat
2f5c0 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20 6f 72  ion fails,.** or
2f5d0 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64   an IO error cod
2f5e0 65 20 69 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  e if an IO error
2f5f0 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 6f   occurs while ro
2f600 6c 6c 69 6e 67 20 62 61 63 6b 20 61 20 0a 2a 2a  lling back a .**
2f610 20 73 61 76 65 70 6f 69 6e 74 2e 20 49 66 20 6e   savepoint. If n
2f620 6f 20 65 72 72 6f 72 73 20 6f 63 63 75 72 2c 20  o errors occur, 
2f630 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
2f640 75 72 6e 65 64 2e 0a 2a 2f 20 0a 69 6e 74 20 73  urned..*/ .int s
2f650 71 6c 69 74 65 33 50 61 67 65 72 53 61 76 65 70  qlite3PagerSavep
2f660 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67  oint(Pager *pPag
2f670 65 72 2c 20 69 6e 74 20 6f 70 2c 20 69 6e 74 20  er, int op, int 
2f680 69 53 61 76 65 70 6f 69 6e 74 29 7b 0a 20 20 69  iSavepoint){.  i
2f690 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2f6a0 4b 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6f 70  K;..  assert( op
2f6b0 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 45 4c 45  ==SAVEPOINT_RELE
2f6c0 41 53 45 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50  ASE || op==SAVEP
2f6d0 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b  OINT_ROLLBACK );
2f6e0 0a 20 20 61 73 73 65 72 74 28 20 69 53 61 76 65  .  assert( iSave
2f6f0 70 6f 69 6e 74 3e 3d 30 20 7c 7c 20 6f 70 3d 3d  point>=0 || op==
2f700 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2f710 43 4b 20 29 3b 0a 0a 20 20 69 66 28 20 69 53 61  CK );..  if( iSa
2f720 76 65 70 6f 69 6e 74 3c 70 50 61 67 65 72 2d 3e  vepoint<pPager->
2f730 6e 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a 20 20  nSavepoint ){.  
2f740 20 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20    int ii;       
2f750 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
2f760 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20   variable */.   
2f770 20 69 6e 74 20 6e 4e 65 77 3b 20 20 20 20 20 20   int nNew;      
2f780 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2f790 20 72 65 6d 61 69 6e 69 6e 67 20 73 61 76 65 70   remaining savep
2f7a0 6f 69 6e 74 73 20 61 66 74 65 72 20 74 68 69 73  oints after this
2f7b0 20 6f 70 2e 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20   op. */..    /* 
2f7c0 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d  Figure out how m
2f7d0 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 77  any savepoints w
2f7e0 69 6c 6c 20 73 74 69 6c 6c 20 62 65 20 61 63 74  ill still be act
2f7f0 69 76 65 20 61 66 74 65 72 20 74 68 69 73 0a 20  ive after this. 
2f800 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e     ** operation.
2f810 20 53 74 6f 72 65 20 74 68 69 73 20 76 61 6c 75   Store this valu
2f820 65 20 69 6e 20 6e 4e 65 77 2e 20 54 68 65 6e 20  e in nNew. Then 
2f830 66 72 65 65 20 72 65 73 6f 75 72 63 65 73 20 61  free resources a
2f840 73 73 6f 63 69 61 74 65 64 20 0a 20 20 20 20 2a  ssociated .    *
2f850 2a 20 77 69 74 68 20 61 6e 79 20 73 61 76 65 70  * with any savep
2f860 6f 69 6e 74 73 20 74 68 61 74 20 61 72 65 20 64  oints that are d
2f870 65 73 74 72 6f 79 65 64 20 62 79 20 74 68 69 73  estroyed by this
2f880 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20   operation..    
2f890 2a 2f 0a 20 20 20 20 6e 4e 65 77 20 3d 20 69 53  */.    nNew = iS
2f8a0 61 76 65 70 6f 69 6e 74 20 2b 20 28 6f 70 3d 3d  avepoint + (op==
2f8b0 53 41 56 45 50 4f 49 4e 54 5f 52 4f 4c 4c 42 41  SAVEPOINT_ROLLBA
2f8c0 43 4b 29 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d  CK);.    for(ii=
2f8d0 6e 4e 65 77 3b 20 69 69 3c 70 50 61 67 65 72 2d  nNew; ii<pPager-
2f8e0 3e 6e 53 61 76 65 70 6f 69 6e 74 3b 20 69 69 2b  >nSavepoint; ii+
2f8f0 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  +){.      sqlite
2f900 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
2f910 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e  Pager->aSavepoin
2f920 74 5b 69 69 5d 2e 70 49 6e 53 61 76 65 70 6f 69  t[ii].pInSavepoi
2f930 6e 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  nt);.    }.    p
2f940 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2f950 74 20 3d 20 6e 4e 65 77 3b 0a 0a 20 20 20 20 2f  t = nNew;..    /
2f960 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  * If this is a r
2f970 6f 6c 6c 62 61 63 6b 20 6f 70 65 72 61 74 69 6f  ollback operatio
2f980 6e 2c 20 70 6c 61 79 62 61 63 6b 20 74 68 65 20  n, playback the 
2f990 73 70 65 63 69 66 69 65 64 20 73 61 76 65 70 6f  specified savepo
2f9a0 69 6e 74 2e 0a 20 20 20 20 2a 2a 20 49 66 20 74  int..    ** If t
2f9b0 68 69 73 20 69 73 20 61 20 74 65 6d 70 2d 66 69  his is a temp-fi
2f9c0 6c 65 2c 20 69 74 20 69 73 20 70 6f 73 73 69 62  le, it is possib
2f9d0 6c 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  le that the jour
2f9e0 6e 61 6c 20 66 69 6c 65 20 68 61 73 0a 20 20 20  nal file has.   
2f9f0 20 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e   ** not yet been
2fa00 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74 68 69 73   opened. In this
2fa10 20 63 61 73 65 20 74 68 65 72 65 20 68 61 76 65   case there have
2fa20 20 62 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73   been no changes
2fa30 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 64   to.    ** the d
2fa40 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 73 6f  atabase file, so
2fa50 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 6f 70   the playback op
2fa60 65 72 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 73  eration can be s
2fa70 6b 69 70 70 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  kipped..    */. 
2fa80 20 20 20 69 66 28 20 6f 70 3d 3d 53 41 56 45 50     if( op==SAVEP
2fa90 4f 49 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 26 26  OINT_ROLLBACK &&
2faa0 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2fab0 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20 50 61  jfd) ){.      Pa
2fac0 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 53  gerSavepoint *pS
2fad0 61 76 65 70 6f 69 6e 74 20 3d 20 28 6e 4e 65 77  avepoint = (nNew
2fae0 3d 3d 30 29 3f 30 3a 26 70 50 61 67 65 72 2d 3e  ==0)?0:&pPager->
2faf0 61 53 61 76 65 70 6f 69 6e 74 5b 6e 4e 65 77 2d  aSavepoint[nNew-
2fb00 31 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  1];.      rc = p
2fb10 61 67 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65  agerPlaybackSave
2fb20 70 6f 69 6e 74 28 70 50 61 67 65 72 2c 20 70 53  point(pPager, pS
2fb30 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20 20 20 20  avepoint);.     
2fb40 20 61 73 73 65 72 74 28 72 63 21 3d 53 51 4c 49   assert(rc!=SQLI
2fb50 54 45 5f 44 4f 4e 45 29 3b 0a 20 20 20 20 7d 0a  TE_DONE);.    }.
2fb60 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69    .    /* If thi
2fb70 73 20 69 73 20 61 20 72 65 6c 65 61 73 65 20 6f  s is a release o
2fb80 66 20 74 68 65 20 6f 75 74 65 72 6d 6f 73 74 20  f the outermost 
2fb90 73 61 76 65 70 6f 69 6e 74 2c 20 74 72 75 6e 63  savepoint, trunc
2fba0 61 74 65 20 0a 20 20 20 20 2a 2a 20 74 68 65 20  ate .    ** the 
2fbb0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 74 6f 20 7a  sub-journal to z
2fbc0 65 72 6f 20 62 79 74 65 73 20 69 6e 20 73 69 7a  ero bytes in siz
2fbd0 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 4e  e. */.    if( nN
2fbe0 65 77 3d 3d 30 20 26 26 20 6f 70 3d 3d 53 41 56  ew==0 && op==SAV
2fbf0 45 50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 26  EPOINT_RELEASE &
2fc00 26 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  & isOpen(pPager-
2fc10 3e 73 6a 66 64 29 20 29 7b 0a 20 20 20 20 20 20  >sjfd) ){.      
2fc20 61 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49  assert( rc==SQLI
2fc30 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20 20 20 72  TE_OK );.      r
2fc40 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
2fc50 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 6a  ncate(pPager->sj
2fc60 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  fd, 0);.      pP
2fc70 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
2fc80 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  0;.    }.  }.  r
2fc90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
2fca0 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
2fcb0 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
2fcc0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2fcd0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
2fce0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
2fcf0 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  ename(Pager *pPa
2fd00 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2fd10 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
2fd20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2fd30 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63 74  n the VFS struct
2fd40 75 72 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ure for the page
2fd50 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c 69  r..*/.const sqli
2fd60 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65 33  te3_vfs *sqlite3
2fd70 50 61 67 65 72 56 66 73 28 50 61 67 65 72 20 2a  PagerVfs(Pager *
2fd80 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
2fd90 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  n pPager->pVfs;.
2fda0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2fdb0 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  the file handle 
2fdc0 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65  for the database
2fdd0 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
2fde0 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61 67  .** with the pag
2fdf0 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74 20  er.  This might 
2fe00 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74  return NULL if t
2fe10 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20 6e  he file has.** n
2fe20 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e  ot yet been open
2fe30 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f 66  ed..*/.sqlite3_f
2fe40 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  ile *sqlite3Page
2fe50 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50 61  rFile(Pager *pPa
2fe60 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2fe70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a  Pager->fd;.}../*
2fe80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
2fe90 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
2fea0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2feb0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
2fec0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
2fed0 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
2fee0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
2fef0 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
2ff00 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
2ff10 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
2ff20 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
2ff30 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
2ff40 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
2ff50 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
2ff60 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
2ff70 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
2ff80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
2ff90 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
2ffa0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
2ffb0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
2ffc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
2ffd0 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
2ffe0 65 74 20 6f 72 20 72 65 74 72 69 65 76 65 20 74  et or retrieve t
2fff0 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
30000 73 20 70 61 67 65 72 0a 2a 2f 0a 73 74 61 74 69  s pager.*/.stati
30010 63 20 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  c void sqlite3Pa
30020 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20 20 50  gerSetCodec(.  P
30030 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20  ager *pPager,.  
30040 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63 29 28  void *(*xCodec)(
30050 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
30060 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20 28 2a  ,int),.  void (*
30070 78 43 6f 64 65 63 53 69 7a 65 43 68 6e 67 29 28  xCodecSizeChng)(
30080 76 6f 69 64 2a 2c 69 6e 74 2c 69 6e 74 29 2c 0a  void*,int,int),.
30090 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 46    void (*xCodecF
300a0 72 65 65 29 28 76 6f 69 64 2a 29 2c 0a 20 20 76  ree)(void*),.  v
300b0 6f 69 64 20 2a 70 43 6f 64 65 63 0a 29 7b 0a 20  oid *pCodec.){. 
300c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 43 6f   if( pPager->xCo
300d0 64 65 63 46 72 65 65 20 29 20 70 50 61 67 65 72  decFree ) pPager
300e0 2d 3e 78 43 6f 64 65 63 46 72 65 65 28 70 50 61  ->xCodecFree(pPa
300f0 67 65 72 2d 3e 70 43 6f 64 65 63 29 3b 0a 20 20  ger->pCodec);.  
30100 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
30110 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
30120 72 2d 3e 78 43 6f 64 65 63 53 69 7a 65 43 68 6e  r->xCodecSizeChn
30130 67 20 3d 20 78 43 6f 64 65 63 53 69 7a 65 43 68  g = xCodecSizeCh
30140 6e 67 3b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  ng;.  pPager->xC
30150 6f 64 65 63 46 72 65 65 20 3d 20 78 43 6f 64 65  odecFree = xCode
30160 63 46 72 65 65 3b 0a 20 20 70 50 61 67 65 72 2d  cFree;.  pPager-
30170 3e 70 43 6f 64 65 63 20 3d 20 70 43 6f 64 65 63  >pCodec = pCodec
30180 3b 0a 20 20 70 61 67 65 72 52 65 70 6f 72 74 53  ;.  pagerReportS
30190 69 7a 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 73  ize(pPager);.}.s
301a0 74 61 74 69 63 20 76 6f 69 64 20 2a 73 71 6c 69  tatic void *sqli
301b0 74 65 33 50 61 67 65 72 47 65 74 43 6f 64 65 63  te3PagerGetCodec
301c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
301d0 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
301e0 2d 3e 70 43 6f 64 65 63 3b 0a 7d 0a 23 65 6e 64  ->pCodec;.}.#end
301f0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
30200 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
30210 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
30220 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f  e page pPg to lo
30230 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
30240 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
30250 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
30260 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
30270 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
30280 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
30290 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
302a0 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
302b0 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
302c0 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
302d0 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
302e0 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
302f0 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67  ly located at pg
30300 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64  no is not alread
30310 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c  y.** in the roll
30320 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
30330 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72   is not put ther
30340 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f 75  e by by this rou
30350 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65  tine..**.** Refe
30360 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
30370 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61  ge pPg remain va
30380 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e  lid. Updating an
30390 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61  y.** meta-data a
303a0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 70  ssociated with p
303b0 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  Pg (i.e. data st
303c0 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
303d0 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
303e0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
303f0 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
30400 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
30410 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
30420 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
30430 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
30440 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
30450 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
30460 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a  It used to be.**
30470 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20 61   required that a
30480 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
30490 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61  action was not a
304a0 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73 20  ctive, but this 
304b0 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68  restriction.** h
304c0 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20  as been removed 
304d0 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65  (CREATE INDEX ne
304e0 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61  eds to move a pa
304f0 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d  ge when a statem
30500 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  ent.** transacti
30510 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a  on is active)..*
30520 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 75 72  *.** If the four
30530 74 68 20 61 72 67 75 6d 65 6e 74 2c 20 69 73 43  th argument, isC
30540 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f 6e 2d 7a 65  ommit, is non-ze
30550 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61  ro, then this pa
30560 67 65 20 69 73 20 62 65 69 6e 67 0a 2a 2a 20 6d  ge is being.** m
30570 6f 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  oved as part of 
30580 61 20 64 61 74 61 62 61 73 65 20 72 65 6f 72 67  a database reorg
30590 61 6e 69 7a 61 74 69 6f 6e 20 6a 75 73 74 20 62  anization just b
305a0 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
305b0 63 74 69 6f 6e 20 0a 2a 2a 20 69 73 20 62 65 69  ction .** is bei
305c0 6e 67 20 63 6f 6d 6d 69 74 74 65 64 2e 20 49 6e  ng committed. In
305d0 20 74 68 69 73 20 63 61 73 65 2c 20 69 74 20 69   this case, it i
305e0 73 20 67 75 61 72 61 6e 74 65 65 64 20 74 68 61  s guaranteed tha
305f0 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70  t the database p
30600 61 67 65 20 0a 2a 2a 20 70 50 67 20 72 65 66 65  age .** pPg refe
30610 72 73 20 74 6f 20 77 69 6c 6c 20 6e 6f 74 20 62  rs to will not b
30620 65 20 77 72 69 74 74 65 6e 20 74 6f 20 61 67 61  e written to aga
30630 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
30640 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a  ransaction..**.*
30650 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
30660 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
30670 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f  E_NOMEM or an IO
30680 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61   error code if a
30690 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f 63 63 75 72  n error.** occur
306a0 73 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69 74  s. Otherwise, it
306b0 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
306c0 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  OK..*/.int sqlit
306d0 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28  e3PagerMovepage(
306e0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 44  Pager *pPager, D
306f0 62 50 61 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f  bPage *pPg, Pgno
30700 20 70 67 6e 6f 2c 20 69 6e 74 20 69 73 43 6f 6d   pgno, int isCom
30710 6d 69 74 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  mit){.  PgHdr *p
30720 50 67 4f 6c 64 3b 20 20 20 20 20 20 20 20 20 20  PgOld;          
30730 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
30740 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74   being overwritt
30750 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e 6f 20 6e 65  en. */.  Pgno ne
30760 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 20  edSyncPgno = 0; 
30770 20 20 20 20 20 20 2f 2a 20 4f 6c 64 20 76 61 6c        /* Old val
30780 75 65 20 6f 66 20 70 50 67 2d 3e 70 67 6e 6f 2c  ue of pPg->pgno,
30790 20 69 66 20 73 79 6e 63 20 69 73 20 72 65 71 75   if sync is requ
307a0 69 72 65 64 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ired */.  int rc
307b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
307c0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
307d0 20 63 6f 64 65 20 2a 2f 0a 20 20 50 67 6e 6f 20   code */.  Pgno 
307e0 6f 72 69 67 50 67 6e 6f 3b 20 20 20 20 20 20 20  origPgno;       
307f0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f          /* The o
30800 72 69 67 69 6e 61 6c 20 70 61 67 65 20 6e 75 6d  riginal page num
30810 62 65 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  ber */..  assert
30820 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b  ( pPg->nRef>0 );
30830 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61  ..  /* If the pa
30840 67 65 20 62 65 69 6e 67 20 6d 6f 76 65 64 20 69  ge being moved i
30850 73 20 64 69 72 74 79 20 61 6e 64 20 68 61 73 20  s dirty and has 
30860 6e 6f 74 20 62 65 65 6e 20 73 61 76 65 64 20 62  not been saved b
30870 79 20 74 68 65 20 6c 61 74 65 73 74 0a 20 20 2a  y the latest.  *
30880 2a 20 73 61 76 65 70 6f 69 6e 74 2c 20 74 68 65  * savepoint, the
30890 6e 20 73 61 76 65 20 74 68 65 20 63 75 72 72 65  n save the curre
308a0 6e 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  nt contents of t
308b0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
308c0 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f 75 72 6e   .  ** sub-journ
308d0 61 6c 20 6e 6f 77 2e 20 54 68 69 73 20 69 73 20  al now. This is 
308e0 72 65 71 75 69 72 65 64 20 74 6f 20 68 61 6e 64  required to hand
308f0 6c 65 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  le the following
30900 20 73 63 65 6e 61 72 69 6f 3a 0a 20 20 2a 2a 0a   scenario:.  **.
30910 20 20 2a 2a 20 20 20 42 45 47 49 4e 3b 0a 20 20    **   BEGIN;.  
30920 2a 2a 20 20 20 20 20 3c 6a 6f 75 72 6e 61 6c 20  **     <journal 
30930 70 61 67 65 20 58 2c 20 74 68 65 6e 20 6d 6f 64  page X, then mod
30940 69 66 79 20 69 74 20 69 6e 20 6d 65 6d 6f 72 79  ify it in memory
30950 3e 0a 20 20 2a 2a 20 20 20 20 20 53 41 56 45 50  >.  **     SAVEP
30960 4f 49 4e 54 20 6f 6e 65 3b 0a 20 20 2a 2a 20 20  OINT one;.  **  
30970 20 20 20 20 20 3c 4d 6f 76 65 20 70 61 67 65 20       <Move page 
30980 58 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 59 3e  X to location Y>
30990 0a 20 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41  .  **     ROLLBA
309a0 43 4b 20 54 4f 20 6f 6e 65 3b 0a 20 20 2a 2a 0a  CK TO one;.  **.
309b0 20 20 2a 2a 20 49 66 20 70 61 67 65 20 58 20 77    ** If page X w
309c0 65 72 65 20 6e 6f 74 20 77 72 69 74 74 65 6e 20  ere not written 
309d0 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  to the sub-journ
309e0 61 6c 20 68 65 72 65 2c 20 69 74 20 77 6f 75 6c  al here, it woul
309f0 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 70 6f  d not.  ** be po
30a00 73 73 69 62 6c 65 20 74 6f 20 72 65 73 74 6f 72  ssible to restor
30a10 65 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 20 77  e its contents w
30a20 68 65 6e 20 74 68 65 20 22 52 4f 4c 4c 42 41 43  hen the "ROLLBAC
30a30 4b 20 54 4f 20 6f 6e 65 22 0a 20 20 2a 2a 20 73  K TO one".  ** s
30a40 74 61 74 65 6d 65 6e 74 20 77 65 72 65 20 69 73  tatement were is
30a50 20 70 72 6f 63 65 73 73 65 64 2e 0a 20 20 2a 2a   processed..  **
30a60 0a 20 20 2a 2a 20 73 75 62 6a 6f 75 72 6e 61 6c  .  ** subjournal
30a70 50 61 67 65 28 29 20 6d 61 79 20 6e 65 65 64 20  Page() may need 
30a80 74 6f 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63  to allocate spac
30a90 65 20 74 6f 20 73 74 6f 72 65 20 70 50 67 2d 3e  e to store pPg->
30aa0 70 67 6e 6f 20 69 6e 74 6f 0a 20 20 2a 2a 20 6f  pgno into.  ** o
30ab0 6e 65 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70  ne or more savep
30ac0 6f 69 6e 74 20 62 69 74 76 65 63 73 2e 20 54 68  oint bitvecs. Th
30ad0 69 73 20 69 73 20 74 68 65 20 72 65 61 73 6f 6e  is is the reason
30ae0 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 0a 20   this function. 
30af0 20 2a 2a 20 6d 61 79 20 72 65 74 75 72 6e 20 53   ** may return S
30b00 51 4c 49 54 45 5f 4e 4f 4d 45 4d 2e 0a 20 20 2a  QLITE_NOMEM..  *
30b10 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c 61  /.  if( pPg->fla
30b20 67 73 26 50 47 48 44 52 5f 44 49 52 54 59 20 0a  gs&PGHDR_DIRTY .
30b30 20 20 20 26 26 20 73 75 62 6a 52 65 71 75 69 72     && subjRequir
30b40 65 73 50 61 67 65 28 70 50 67 29 0a 20 20 20 26  esPage(pPg).   &
30b50 26 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63  & SQLITE_OK!=(rc
30b60 20 3d 20 73 75 62 6a 6f 75 72 6e 61 6c 50 61 67   = subjournalPag
30b70 65 28 70 50 67 29 29 0a 20 20 29 7b 0a 20 20 20  e(pPg)).  ){.   
30b80 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
30b90 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22  .  PAGERTRACE(("
30ba0 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20  MOVE %d page %d 
30bb0 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f  (needSync=%d) mo
30bc0 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20  ves to %d\n", . 
30bd0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
30be0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
30bf0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
30c00 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a  DR_NEED_SYNC)?1:
30c10 30 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 49 4f 54  0, pgno));.  IOT
30c20 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
30c30 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
30c40 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
30c50 29 29 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  ))..  /* If the 
30c60 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f  journal needs to
30c70 20 62 65 20 73 79 6e 63 28 29 65 64 20 62 65 66   be sync()ed bef
30c80 6f 72 65 20 70 61 67 65 20 70 50 67 2d 3e 70 67  ore page pPg->pg
30c90 6e 6f 20 63 61 6e 0a 20 20 2a 2a 20 62 65 20 77  no can.  ** be w
30ca0 72 69 74 74 65 6e 20 74 6f 2c 20 73 74 6f 72 65  ritten to, store
30cb0 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 20 6c 6f   pPg->pgno in lo
30cc0 63 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 65 65  cal variable nee
30cd0 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 2a 2a 0a  dSyncPgno..  **.
30ce0 20 20 2a 2a 20 49 66 20 74 68 65 20 69 73 43 6f    ** If the isCo
30cf0 6d 6d 69 74 20 66 6c 61 67 20 69 73 20 73 65 74  mmit flag is set
30d00 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65  , there is no ne
30d10 65 64 20 74 6f 20 72 65 6d 65 6d 62 65 72 20 74  ed to remember t
30d20 68 61 74 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75  hat.  ** the jou
30d30 72 6e 61 6c 20 6e 65 65 64 73 20 74 6f 20 62 65  rnal needs to be
30d40 20 73 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65   sync()ed before
30d50 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 70   database page p
30d60 50 67 2d 3e 70 67 6e 6f 20 0a 20 20 2a 2a 20 63  Pg->pgno .  ** c
30d70 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  an be written to
30d80 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 68 61 73  . The caller has
30d90 20 61 6c 72 65 61 64 79 20 70 72 6f 6d 69 73 65   already promise
30da0 64 20 6e 6f 74 20 74 6f 20 77 72 69 74 65 20 74  d not to write t
30db0 6f 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o it..  */.  if(
30dc0 20 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48   (pPg->flags&PGH
30dd0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 20 26 26  DR_NEED_SYNC) &&
30de0 20 21 69 73 43 6f 6d 6d 69 74 20 29 7b 0a 20 20   !isCommit ){.  
30df0 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
30e00 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
30e10 61 73 73 65 72 74 28 20 70 61 67 65 49 6e 4a 6f  assert( pageInJo
30e20 75 72 6e 61 6c 28 70 50 67 29 20 7c 7c 20 70 50  urnal(pPg) || pP
30e30 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
30e40 64 62 4f 72 69 67 53 69 7a 65 20 29 3b 0a 20 20  dbOrigSize );.  
30e50 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 66    assert( pPg->f
30e60 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52 54 59  lags&PGHDR_DIRTY
30e70 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
30e80 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
30e90 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66   );.  }..  /* If
30ea0 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
30eb0 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
30ec0 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
30ed0 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
30ee0 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
30ef0 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74  hain. Also, if t
30f00 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
30f10 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20  c was set for . 
30f20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65   ** page pgno be
30f30 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20  fore the 'move' 
30f40 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65  operation, it ne
30f50 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e  eds to be retain
30f60 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65  ed .  ** for the
30f70 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72   page moved ther
30f80 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 66  e..  */.  pPg->f
30f90 6c 61 67 73 20 26 3d 20 7e 50 47 48 44 52 5f 4e  lags &= ~PGHDR_N
30fa0 45 45 44 5f 53 59 4e 43 3b 0a 20 20 70 50 67 4f  EED_SYNC;.  pPgO
30fb0 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
30fc0 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
30fd0 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 67 4f  .  assert( !pPgO
30fe0 6c 64 20 7c 7c 20 70 50 67 4f 6c 64 2d 3e 6e 52  ld || pPgOld->nR
30ff0 65 66 3d 3d 31 20 29 3b 0a 20 20 69 66 28 20 70  ef==1 );.  if( p
31000 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 70 50 67  PgOld ){.    pPg
31010 2d 3e 66 6c 61 67 73 20 7c 3d 20 28 70 50 67 4f  ->flags |= (pPgO
31020 6c 64 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  ld->flags&PGHDR_
31030 4e 45 45 44 5f 53 59 4e 43 29 3b 0a 20 20 20 20  NEED_SYNC);.    
31040 73 71 6c 69 74 65 33 50 63 61 63 68 65 44 72 6f  sqlite3PcacheDro
31050 70 28 70 50 67 4f 6c 64 29 3b 0a 20 20 7d 0a 0a  p(pPgOld);.  }..
31060 20 20 6f 72 69 67 50 67 6e 6f 20 3d 20 70 50 67    origPgno = pPg
31070 2d 3e 70 67 6e 6f 3b 0a 20 20 73 71 6c 69 74 65  ->pgno;.  sqlite
31080 33 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c  3PcacheMove(pPg,
31090 20 70 67 6e 6f 29 3b 0a 20 20 73 71 6c 69 74 65   pgno);.  sqlite
310a0 33 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79  3PcacheMakeDirty
310b0 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d  (pPg);.  pPager-
310c0 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b  >dbModified = 1;
310d0 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
310e0 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
310f0 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
31100 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
31110 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
31120 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
31130 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
31140 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
31150 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
31160 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
31170 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
31180 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
31190 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
311a0 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
311b0 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
311c0 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75 72 6e 61     ** "is journa
311d0 6c 65 64 22 20 62 69 74 76 65 63 20 66 6c 61 67  led" bitvec flag
311e0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
311f0 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
31200 72 65 6d 65 64 69 65 64 20 62 79 0a 20 20 20 20  remedied by.    
31210 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68 65 20 70  ** loading the p
31220 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
31230 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
31240 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
31250 65 65 64 53 79 6e 63 20 0a 20 20 20 20 2a 2a 20  eedSync .    ** 
31260 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  flag..    **.   
31270 20 2a 2a 20 49 66 20 74 68 65 20 61 74 74 65 6d   ** If the attem
31280 70 74 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 70  pt to load the p
31290 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
312a0 65 2d 63 61 63 68 65 20 66 61 69 6c 73 2c 20 28  e-cache fails, (
312b0 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f 20 61 20  due.    ** to a 
312c0 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 66  malloc() or IO f
312d0 61 69 6c 75 72 65 29 2c 20 63 6c 65 61 72 20 74  ailure), clear t
312e0 68 65 20 62 69 74 20 69 6e 20 74 68 65 20 70 49  he bit in the pI
312f0 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20 20 20 2a  nJournal[].    *
31300 2a 20 61 72 72 61 79 2e 20 4f 74 68 65 72 77 69  * array. Otherwi
31310 73 65 2c 20 69 66 20 74 68 65 20 70 61 67 65 20  se, if the page 
31320 69 73 20 6c 6f 61 64 65 64 20 61 6e 64 20 77 72  is loaded and wr
31330 69 74 74 65 6e 20 61 67 61 69 6e 20 69 6e 0a 20  itten again in. 
31340 20 20 20 2a 2a 20 74 68 69 73 20 74 72 61 6e 73     ** this trans
31350 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61 79 20 62  action, it may b
31360 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
31370 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 62   database file b
31380 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20 69 74 20  efore.    ** it 
31390 69 73 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74  is synced into t
313a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
313b0 20 54 68 69 73 20 77 61 79 2c 20 69 74 20 6d 61   This way, it ma
313c0 79 20 65 6e 64 20 75 70 20 69 6e 0a 20 20 20 20  y end up in.    
313d0 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** the journal f
313e0 69 6c 65 20 74 77 69 63 65 2c 20 62 75 74 20 74  ile twice, but t
313f0 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 72 6f  hat is not a pro
31400 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  blem..    **.   
31410 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33 50   ** The sqlite3P
31420 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20 6d  agerGet() call m
31430 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f 75  ay cause the jou
31440 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53 6f  rnal to sync. So
31450 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75 72   make.    ** sur
31460 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  e the Pager.need
31470 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65 74  Sync flag is set
31480 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20   too..    */.   
31490 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
314a0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
314b0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
314c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
314d0 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
314e0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
314f0 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
31500 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
31510 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
31520 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->pInJournal &
31530 26 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 3c 3d  & needSyncPgno<=
31540 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69  pPager->dbOrigSi
31550 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  ze ){.        as
31560 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 54  sert( pPager->pT
31570 6d 70 53 70 61 63 65 21 3d 30 20 29 3b 0a 20 20  mpSpace!=0 );.  
31580 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
31590 76 65 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d  vecClear(pPager-
315a0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65  >pInJournal, nee
315b0 64 53 79 6e 63 50 67 6e 6f 2c 20 70 50 61 67 65  dSyncPgno, pPage
315c0 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
315d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
315e0 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
315f0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
31600 6e 63 20 3d 20 31 3b 0a 20 20 20 20 61 73 73 65  nc = 1;.    asse
31610 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  rt( pPager->noSy
31620 6e 63 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20  nc==0 && !MEMDB 
31630 29 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 66  );.    pPgHdr->f
31640 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f 4e 45  lags |= PGHDR_NE
31650 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 73 71 6c  ED_SYNC;.    sql
31660 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
31670 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20 20 20  rty(pPgHdr);.   
31680 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
31690 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a  ef(pPgHdr);.  }.
316a0 0a 20 20 2f 2a 0a 20 20 2a 2a 20 46 6f 72 20 61  .  /*.  ** For a
316b0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
316c0 62 61 73 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  base, make sure 
316d0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
316e0 65 20 63 6f 6e 74 69 6e 75 65 73 0a 20 20 2a 2a  e continues.  **
316f0 20 74 6f 20 65 78 69 73 74 2c 20 69 6e 20 63 61   to exist, in ca
31700 73 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  se the transacti
31710 6f 6e 20 6e 65 65 64 73 20 74 6f 20 72 6f 6c 6c  on needs to roll
31720 20 62 61 63 6b 2e 20 20 57 65 20 61 6c 6c 6f 63   back.  We alloc
31730 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67  ate.  ** the pag
31740 65 20 6e 6f 77 2c 20 69 6e 73 74 65 61 64 20 6f  e now, instead o
31750 66 20 61 74 20 72 6f 6c 6c 62 61 63 6b 2c 20 62  f at rollback, b
31760 65 63 61 75 73 65 20 77 65 20 63 61 6e 20 62 65  ecause we can be
31770 74 74 65 72 20 64 65 61 6c 0a 20 20 2a 2a 20 77  tter deal.  ** w
31780 69 74 68 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65  ith an out-of-me
31790 6d 6f 72 79 20 65 72 72 6f 72 20 6e 6f 77 2e 20  mory error now. 
317a0 20 54 69 63 6b 65 74 20 23 33 37 36 31 2e 0a 20   Ticket #3761.. 
317b0 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44 42 20   */.  if( MEMDB 
317c0 29 7b 0a 20 20 20 20 44 62 50 61 67 65 20 2a 70  ){.    DbPage *p
317d0 4e 65 77 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  New;.    rc = sq
317e0 6c 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72  lite3PagerAcquir
317f0 65 28 70 50 61 67 65 72 2c 20 6f 72 69 67 50 67  e(pPager, origPg
31800 6e 6f 2c 20 26 70 4e 65 77 2c 20 31 29 3b 0a 20  no, &pNew, 1);. 
31810 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
31820 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
31830 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
31840 65 72 55 6e 72 65 66 28 70 4e 65 77 29 3b 0a 20  erUnref(pNew);. 
31850 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
31860 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
31870 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
31880 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
31890 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
318a0 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
318b0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
318c0 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
318d0 20 2a 70 50 67 29 7b 0a 20 20 61 73 73 65 72 74   *pPg){.  assert
318e0 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 7c 7c  ( pPg->nRef>0 ||
318f0 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65   pPg->pPager->me
31900 6d 44 62 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  mDb );.  return 
31910 70 50 67 2d 3e 70 44 61 74 61 3b 0a 7d 0a 0a 2f  pPg->pData;.}../
31920 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
31930 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61 67  inter to the Pag
31940 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
31950 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63 65  of "extra" space
31960 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61   .** allocated a
31970 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73 70  long with the sp
31980 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
31990 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
319a0 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50 61  gerGetExtra(DbPa
319b0 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  ge *pPg){.  Page
319c0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
319d0 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72  >pPager;.  retur
319e0 6e 20 28 70 50 61 67 65 72 3f 70 50 67 2d 3e 70  n (pPager?pPg->p
319f0 45 78 74 72 61 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a  Extra:0);.}../*.
31a00 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 6c  ** Get/set the l
31a10 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72 20  ocking-mode for 
31a20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72 61  this pager. Para
31a30 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74  meter eMode must
31a40 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41   be one.** of PA
31a50 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31a60 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f 43  QUERY, PAGER_LOC
31a70 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
31a80 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43  or .** PAGER_LOC
31a90 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
31aa0 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d  VE. If the param
31ab0 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45  eter is not _QUE
31ac0 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20  RY, then.** the 
31ad0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73 20  locking-mode is 
31ae0 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
31af0 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a   specified..**.*
31b00 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76  * The returned v
31b10 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50  alue is either P
31b20 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31b30 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50 41  _NORMAL or.** PA
31b40 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31b50 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69 63  EXCLUSIVE, indic
31b60 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  ating the curren
31b70 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64 61  t (possibly upda
31b80 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 2d  ted).** locking-
31b90 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  mode..*/.int sql
31ba0 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e 67  ite3PagerLocking
31bb0 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67  Mode(Pager *pPag
31bc0 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a  er, int eMode){.
31bd0 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65 3d    assert( eMode=
31be0 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f  =PAGER_LOCKINGMO
31bf0 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20 20  DE_QUERY.       
31c00 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
31c10 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
31c20 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20 20  _NORMAL.        
31c30 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
31c40 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31c50 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 61  EXCLUSIVE );.  a
31c60 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
31c70 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c 30  KINGMODE_QUERY<0
31c80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
31c90 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
31ca0 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41 47  NORMAL>=0 && PAG
31cb0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
31cc0 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a 20  XCLUSIVE>=0 );. 
31cd0 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26 26   if( eMode>=0 &&
31ce0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
31cf0 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  le ){.    pPager
31d00 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
31d10 3d 20 28 75 38 29 65 4d 6f 64 65 3b 0a 20 20 7d  = (u8)eMode;.  }
31d20 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 70  .  return (int)p
31d30 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
31d40 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Mode;.}../*.** G
31d50 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75 72 6e  et/set the journ
31d60 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68 69 73  al-mode for this
31d70 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65 74 65   pager. Paramete
31d80 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62 65 20  r eMode must be 
31d90 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a 2a 2a 20 20 20  one of:.**.**   
31da0 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
31db0 44 45 5f 51 55 45 52 59 0a 2a 2a 20 20 20 20 50  DE_QUERY.**    P
31dc0 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
31dd0 5f 44 45 4c 45 54 45 0a 2a 2a 20 20 20 20 50 41  _DELETE.**    PA
31de0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
31df0 54 52 55 4e 43 41 54 45 0a 2a 2a 20 20 20 20 50  TRUNCATE.**    P
31e00 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
31e10 5f 50 45 52 53 49 53 54 0a 2a 2a 20 20 20 20 50  _PERSIST.**    P
31e20 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
31e30 5f 4f 46 46 0a 2a 2a 20 20 20 20 50 41 47 45 52  _OFF.**    PAGER
31e40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
31e50 4f 52 59 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ORY.**.** If the
31e60 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
31e70 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 20 74  t _QUERY, then t
31e80 68 65 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20  he journal_mode 
31e90 69 73 20 73 65 74 20 74 6f 20 74 68 65 0a 2a 2a  is set to the.**
31ea0 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
31eb0 20 69 66 20 74 68 65 20 63 68 61 6e 67 65 20 69   if the change i
31ec0 73 20 61 6c 6c 6f 77 65 64 2e 20 20 54 68 65 20  s allowed.  The 
31ed0 63 68 61 6e 67 65 20 69 73 20 64 69 73 61 6c 6c  change is disall
31ee0 6f 77 65 64 0a 2a 2a 20 66 6f 72 20 74 68 65 20  owed.** for the 
31ef0 66 6f 6c 6c 6f 77 69 6e 67 20 72 65 61 73 6f 6e  following reason
31f00 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 41 6e  s:.**.**   *  An
31f10 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
31f20 61 73 65 20 63 61 6e 20 6f 6e 6c 79 20 68 61 76  ase can only hav
31f30 65 20 69 74 73 20 6a 6f 75 72 6e 61 6c 5f 6d 6f  e its journal_mo
31f40 64 65 20 73 65 74 20 74 6f 20 5f 4f 46 46 0a 2a  de set to _OFF.*
31f50 2a 20 20 20 20 20 20 6f 72 20 5f 4d 45 4d 4f 52  *      or _MEMOR
31f60 59 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 54 68  Y..**.**   *  Th
31f70 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 6d  e journal mode m
31f80 61 79 20 6e 6f 74 20 62 65 20 63 68 61 6e 67 65  ay not be change
31f90 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e 73 61  d while a transa
31fa0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
31fb0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
31fc0 6e 65 64 20 69 6e 64 69 63 61 74 65 20 74 68 65  ned indicate the
31fd0 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
31fe0 6c 79 20 75 70 64 61 74 65 64 29 20 6a 6f 75 72  ly updated) jour
31ff0 6e 61 6c 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74  nal-mode..*/.int
32000 20 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75   sqlite3PagerJou
32010 72 6e 61 6c 4d 6f 64 65 28 50 61 67 65 72 20 2a  rnalMode(Pager *
32020 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64  pPager, int eMod
32030 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65 4d  e){.  assert( eM
32040 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
32050 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20 20  ALMODE_QUERY.   
32060 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32070 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32080 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 20 20 20 20  MODE_DELETE.    
32090 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
320a0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
320b0 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 20 20 20  ODE_TRUNCATE.   
320c0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
320d0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
320e0 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20  MODE_PERSIST.   
320f0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
32100 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
32110 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
32120 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
32130 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
32140 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20 61 73  E_MEMORY );.  as
32150 73 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52  sert( PAGER_JOUR
32160 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 3c 30 20  NALMODE_QUERY<0 
32170 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d  );.  if( eMode>=
32180 30 0a 20 20 20 26 26 20 28 21 4d 45 4d 44 42 20  0.   && (!MEMDB 
32190 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  || eMode==PAGER_
321a0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d 4f  JOURNALMODE_MEMO
321b0 52 59 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  RY .            
321c0 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
321d0 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46  R_JOURNALMODE_OF
321e0 46 29 0a 20 20 20 26 26 20 21 70 50 61 67 65 72  F).   && !pPager
321f0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 0a 20 20 20  ->dbModified.   
32200 26 26 20 28 21 69 73 4f 70 65 6e 28 70 50 61 67  && (!isOpen(pPag
32210 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 30 3d 3d 70  er->jfd) || 0==p
32220 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
32230 66 29 0a 20 20 29 7b 0a 20 20 20 20 69 66 28 20  f).  ){.    if( 
32240 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
32250 66 64 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  fd) ){.      sql
32260 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
32270 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
32280 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
32290 6e 61 6c 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d  nalMode = (u8)eM
322a0 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ode;.  }.  retur
322b0 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a  n (int)pPager->j
322c0 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f  ournalMode;.}../
322d0 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65  *.** Get/set the
322e0 20 73 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64   size-limit used
322f0 20 66 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20   for persistent 
32300 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
32310 2a 0a 2a 2a 20 53 65 74 74 69 6e 67 20 74 68 65  *.** Setting the
32320 20 73 69 7a 65 20 6c 69 6d 69 74 20 74 6f 20 2d   size limit to -
32330 31 20 6d 65 61 6e 73 20 6e 6f 20 6c 69 6d 69 74  1 means no limit
32340 20 69 73 20 65 6e 66 6f 72 63 65 64 2e 0a 2a 2a   is enforced..**
32350 20 41 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 73   An attempt to s
32360 65 74 20 61 20 6c 69 6d 69 74 20 73 6d 61 6c 6c  et a limit small
32370 65 72 20 74 68 61 6e 20 2d 31 20 69 73 20 61 20  er than -1 is a 
32380 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 69 36 34 20 73 71  no-op..*/.i64 sq
32390 6c 69 74 65 33 50 61 67 65 72 4a 6f 75 72 6e 61  lite3PagerJourna
323a0 6c 53 69 7a 65 4c 69 6d 69 74 28 50 61 67 65 72  lSizeLimit(Pager
323b0 20 2a 70 50 61 67 65 72 2c 20 69 36 34 20 69 4c   *pPager, i64 iL
323c0 69 6d 69 74 29 7b 0a 20 20 69 66 28 20 69 4c 69  imit){.  if( iLi
323d0 6d 69 74 3e 3d 2d 31 20 29 7b 0a 20 20 20 20 70  mit>=-1 ){.    p
323e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
323f0 7a 65 4c 69 6d 69 74 20 3d 20 69 4c 69 6d 69 74  zeLimit = iLimit
32400 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
32410 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
32420 7a 65 4c 69 6d 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  zeLimit;.}../*.*
32430 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
32440 65 72 20 74 6f 20 74 68 65 20 70 50 61 67 65 72  er to the pPager
32450 2d 3e 70 42 61 63 6b 75 70 20 76 61 72 69 61 62  ->pBackup variab
32460 6c 65 2e 20 54 68 65 20 62 61 63 6b 75 70 20 6d  le. The backup m
32470 6f 64 75 6c 65 0a 2a 2a 20 69 6e 20 62 61 63 6b  odule.** in back
32480 75 70 2e 63 20 6d 61 69 6e 74 61 69 6e 73 20 74  up.c maintains t
32490 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
324a0 69 73 20 76 61 72 69 61 62 6c 65 2e 20 54 68 69  is variable. Thi
324b0 73 20 6d 6f 64 75 6c 65 0a 2a 2a 20 75 73 65 73  s module.** uses
324c0 20 69 74 20 6f 70 61 71 75 65 6c 79 20 61 73 20   it opaquely as 
324d0 61 6e 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 73  an argument to s
324e0 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
324f0 61 72 74 28 29 20 61 6e 64 0a 2a 2a 20 73 71 6c  art() and.** sql
32500 69 74 65 33 42 61 63 6b 75 70 55 70 64 61 74 65  ite3BackupUpdate
32510 28 29 20 6f 6e 6c 79 2e 0a 2a 2f 0a 73 71 6c 69  () only..*/.sqli
32520 74 65 33 5f 62 61 63 6b 75 70 20 2a 2a 73 71 6c  te3_backup **sql
32530 69 74 65 33 50 61 67 65 72 42 61 63 6b 75 70 50  ite3PagerBackupP
32540 74 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  tr(Pager *pPager
32550 29 7b 0a 20 20 72 65 74 75 72 6e 20 26 70 50 61  ){.  return &pPa
32560 67 65 72 2d 3e 70 42 61 63 6b 75 70 3b 0a 7d 0a  ger->pBackup;.}.
32570 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
32580 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f  E_OMIT_DISKIO */
32590 0a                                               .