/ Hex Artifact Content
Login

Artifact 57665d91e54da810df27176093936bdee02256b9:


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 36  : pager.c,v 1.56
0350: 37 20 32 30 30 39 2f 30 32 2f 31 32 20 30 39 3a  7 2009/02/12 09:
0360: 31 31 3a 35 36 20 64 61 6e 69 65 6c 6b 31 39 37  11:56 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 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1120: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1130: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1140: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1150: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
1160: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
1170: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
1180: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
1190: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
11a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
11b0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
11c0: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
11d0: 0a 2a 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64  .** A macro used
11e0: 20 66 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68   for invoking th
11f0: 65 20 63 6f 64 65 63 20 69 66 20 74 68 65 72 65  e codec if there
1200: 20 69 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65   is one.*/.#ifde
1210: 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44  f SQLITE_HAS_COD
1220: 45 43 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  EC.# define CODE
1230: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20  C1(P,D,N,X) if( 
1240: 50 2d 3e 78 43 6f 64 65 63 21 3d 30 20 29 7b 20  P->xCodec!=0 ){ 
1250: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
1260: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3b 20 7d  decArg,D,N,X); }
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 29 20 28 28 63 68 61 72  (P,D,N,X) ((char
1290: 2a 29 28 50 2d 3e 78 43 6f 64 65 63 21 3d 30 3f  *)(P->xCodec!=0?
12a0: 50 2d 3e 78 43 6f 64 65 63 28 50 2d 3e 70 43 6f  P->xCodec(P->pCo
12b0: 64 65 63 41 72 67 2c 44 2c 4e 2c 58 29 3a 44 29  decArg,D,N,X):D)
12c0: 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  ).#else.# define
12d0: 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58 29   CODEC1(P,D,N,X)
12e0: 20 2f 2a 20 4e 4f 2d 4f 50 20 2a 2f 0a 23 20 64   /* NO-OP */.# d
12f0: 65 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44  efine CODEC2(P,D
1300: 2c 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 44 29  ,N,X) ((char*)D)
1310: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54  .#endif../*.** T
1320: 68 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77  he maximum allow
1330: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 2e 20  ed sector size. 
1340: 31 36 4d 42 2e 20 49 66 20 74 68 65 20 78 53 65  16MB. If the xSe
1350: 63 74 6f 72 73 69 7a 65 28 29 20 6d 65 74 68 6f  ctorsize() metho
1360: 64 20 0a 2a 2a 20 72 65 74 75 72 6e 73 20 61 20  d .** returns a 
1370: 76 61 6c 75 65 20 6c 61 72 67 65 72 20 74 68 61  value larger tha
1380: 6e 20 74 68 69 73 2c 20 74 68 65 6e 20 4d 41 58  n this, then MAX
1390: 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 69 73 20  _SECTOR_SIZE is 
13a0: 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a 2a  used instead..**
13b0: 20 54 68 69 73 20 63 6f 75 6c 64 20 63 6f 6e 63   This could conc
13c0: 65 69 76 61 62 6c 79 20 63 61 75 73 65 20 63 6f  eivably cause co
13d0: 72 72 75 70 74 69 6f 6e 20 66 6f 6c 6c 6f 77 69  rruption followi
13e0: 6e 67 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  ng a power failu
13f0: 72 65 20 6f 6e 0a 2a 2a 20 73 75 63 68 20 61 20  re on.** such a 
1400: 73 79 73 74 65 6d 2e 20 54 68 69 73 20 69 73 20  system. This is 
1410: 63 75 72 72 65 6e 74 6c 79 20 61 6e 20 75 6e 64  currently an und
1420: 6f 63 75 6d 65 6e 74 65 64 20 6c 69 6d 69 74 2e  ocumented limit.
1430: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 41 58 5f  .*/.#define MAX_
1440: 53 45 43 54 4f 52 5f 53 49 5a 45 20 30 78 30 31  SECTOR_SIZE 0x01
1450: 30 30 30 30 30 0a 0a 2f 2a 0a 2a 2a 20 41 6e 20  00000../*.** An 
1460: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
1470: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63 74  following struct
1480: 75 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  ure is allocated
1490: 20 66 6f 72 20 65 61 63 68 20 61 63 74 69 76 65   for each active
14a0: 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74 20 61 6e  .** savepoint an
14b0: 64 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  d statement tran
14c0: 73 61 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 73  saction in the s
14d0: 79 73 74 65 6d 2e 20 41 6c 6c 20 73 75 63 68 20  ystem. All such 
14e0: 73 74 72 75 63 74 75 72 65 73 0a 2a 2a 20 61 72  structures.** ar
14f0: 65 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  e stored in the 
1500: 50 61 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74  Pager.aSavepoint
1510: 5b 5d 20 61 72 72 61 79 2c 20 77 68 69 63 68 20  [] array, which 
1520: 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64  is allocated and
1530: 0a 2a 2a 20 72 65 73 69 7a 65 64 20 75 73 69 6e  .** resized usin
1540: 67 20 73 71 6c 69 74 65 33 52 65 61 6c 6c 6f 63  g sqlite3Realloc
1550: 28 29 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 61  ()..**.** When a
1560: 20 73 61 76 65 70 6f 69 6e 74 20 69 73 20 63 72   savepoint is cr
1570: 65 61 74 65 64 2c 20 74 68 65 20 50 61 67 65 72  eated, the Pager
1580: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
1590: 66 73 65 74 20 66 69 65 6c 64 20 69 73 0a 2a 2a  fset field is.**
15a0: 20 73 65 74 20 74 6f 20 30 2e 20 49 66 20 61 20   set to 0. If a 
15b0: 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 69  journal-header i
15c0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
15d0: 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  he main journal 
15e0: 77 68 69 6c 65 0a 2a 2a 20 74 68 65 20 73 61 76  while.** the sav
15f0: 65 70 6f 69 6e 74 20 69 73 20 61 63 74 69 76 65  epoint is active
1600: 2c 20 74 68 65 6e 20 69 48 64 72 4f 66 66 73 65  , then iHdrOffse
1610: 74 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  t is set to the 
1620: 62 79 74 65 20 6f 66 66 73 65 74 20 0a 2a 2a 20  byte offset .** 
1630: 69 6d 6d 65 64 69 61 74 65 6c 79 20 66 6f 6c 6c  immediately foll
1640: 6f 77 69 6e 67 20 74 68 65 20 6c 61 73 74 20 6a  owing the last j
1650: 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 72  ournal record wr
1660: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6d  itten into the m
1670: 61 69 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 62  ain.** journal b
1680: 65 66 6f 72 65 20 74 68 65 20 6a 6f 75 72 6e 61  efore the journa
1690: 6c 2d 68 65 61 64 65 72 2e 20 54 68 69 73 20 69  l-header. This i
16a0: 73 20 72 65 71 75 69 72 65 64 20 64 75 72 69 6e  s required durin
16b0: 67 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 72  g savepoint.** r
16c0: 6f 6c 6c 62 61 63 6b 20 28 73 65 65 20 70 61 67  ollback (see pag
16d0: 65 72 50 6c 61 79 62 61 63 6b 53 61 76 65 70 6f  erPlaybackSavepo
16e0: 69 6e 74 28 29 29 2e 0a 2a 2f 0a 74 79 70 65 64  int())..*/.typed
16f0: 65 66 20 73 74 72 75 63 74 20 50 61 67 65 72 53  ef struct PagerS
1700: 61 76 65 70 6f 69 6e 74 20 50 61 67 65 72 53 61  avepoint PagerSa
1710: 76 65 70 6f 69 6e 74 3b 0a 73 74 72 75 63 74 20  vepoint;.struct 
1720: 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 7b  PagerSavepoint {
1730: 0a 20 20 69 36 34 20 69 4f 66 66 73 65 74 3b 20  .  i64 iOffset; 
1740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1750: 2f 2a 20 53 74 61 72 74 69 6e 67 20 6f 66 66 73  /* Starting offs
1760: 65 74 20 69 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e  et in main journ
1770: 61 6c 20 2a 2f 0a 20 20 69 36 34 20 69 48 64 72  al */.  i64 iHdr
1780: 4f 66 66 73 65 74 3b 20 20 20 20 20 20 20 20 20  Offset;         
1790: 20 20 20 20 20 2f 2a 20 53 65 65 20 61 62 6f 76       /* See abov
17a0: 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
17b0: 49 6e 53 61 76 65 70 6f 69 6e 74 3b 20 20 20 20  InSavepoint;    
17c0: 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20 70 61      /* Set of pa
17d0: 67 65 73 20 69 6e 20 74 68 69 73 20 73 61 76 65  ges in this save
17e0: 70 6f 69 6e 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  point */.  Pgno 
17f0: 6e 4f 72 69 67 3b 20 20 20 20 20 20 20 20 20 20  nOrig;          
1800: 20 20 20 20 20 20 20 20 2f 2a 20 4f 72 69 67 69          /* Origi
1810: 6e 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  nal number of pa
1820: 67 65 73 20 69 6e 20 66 69 6c 65 20 2a 2f 0a 20  ges in file */. 
1830: 20 50 67 6e 6f 20 69 53 75 62 52 65 63 3b 20 20   Pgno iSubRec;  
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1850: 20 49 6e 64 65 78 20 6f 66 20 66 69 72 73 74 20   Index of first 
1860: 72 65 63 6f 72 64 20 69 6e 20 73 75 62 2d 6a 6f  record in sub-jo
1870: 75 72 6e 61 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a  urnal */.};../*.
1880: 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20 63  ** A open page c
1890: 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74 61  ache is an insta
18a0: 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  nce of the follo
18b0: 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e 0a  wing structure..
18c0: 2a 2a 0a 2a 2a 20 65 72 72 43 6f 64 65 0a 2a 2a  **.** errCode.**
18d0: 0a 2a 2a 20 20 20 50 61 67 65 72 2e 65 72 72 43  .**   Pager.errC
18e0: 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20 74  ode may be set t
18f0: 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20  o SQLITE_IOERR, 
1900: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20  SQLITE_CORRUPT, 
1910: 6f 72 0a 2a 2a 20 20 20 6f 72 20 53 51 4c 49 54  or.**   or SQLIT
1920: 45 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65  E_FULL. Once one
1930: 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68   of the first th
1940: 72 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72  ree errors occur
1950: 73 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a  s, it persists.*
1960: 2a 20 20 20 61 6e 64 20 69 73 20 72 65 74 75 72  *   and is retur
1970: 6e 65 64 20 61 73 20 74 68 65 20 72 65 73 75 6c  ned as the resul
1980: 74 20 6f 66 20 65 76 65 72 79 20 6d 61 6a 6f 72  t of every major
1990: 20 70 61 67 65 72 20 41 50 49 20 63 61 6c 6c 2e   pager API call.
19a0: 20 20 54 68 65 0a 2a 2a 20 20 20 53 51 4c 49 54    The.**   SQLIT
19b0: 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20 63 6f  E_FULL return co
19c0: 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79 20 64  de is slightly d
19d0: 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70 65 72  ifferent. It per
19e0: 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74 69 6c  sists only until
19f0: 20 74 68 65 0a 2a 2a 20 20 20 6e 65 78 74 20 73   the.**   next s
1a00: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
1a10: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
1a20: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
1a30: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 20 20 53  he. Also,.**   S
1a40: 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20  QLITE_FULL does 
1a50: 6e 6f 74 20 61 66 66 65 63 74 20 74 68 65 20 73  not affect the s
1a60: 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29  qlite3PagerGet()
1a70: 20 61 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65   and sqlite3Page
1a80: 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 20 20 41  rLookup().**   A
1a90: 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73 74  PIs, they may st
1aa0: 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63 63  ill be used succ
1ab0: 65 73 73 66 75 6c 6c 79 2e 0a 2a 2a 0a 2a 2a 20  essfully..**.** 
1ac0: 64 62 53 69 7a 65 56 61 6c 69 64 2c 20 64 62 53  dbSizeValid, dbS
1ad0: 69 7a 65 2c 20 64 62 4f 72 69 67 53 69 7a 65 2c  ize, dbOrigSize,
1ae0: 20 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 0a 2a   dbFileSize.**.*
1af0: 2a 20 20 20 4d 61 6e 61 67 69 6e 67 20 74 68 65  *   Managing the
1b00: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
1b10: 61 62 61 73 65 20 66 69 6c 65 20 69 6e 20 70 61  abase file in pa
1b20: 67 65 73 20 69 73 20 61 20 6c 69 74 74 6c 65 20  ges is a little 
1b30: 63 6f 6d 70 6c 69 63 61 74 65 64 2e 0a 2a 2a 20  complicated..** 
1b40: 20 20 54 68 65 20 76 61 72 69 61 62 6c 65 20 50    The variable P
1b50: 61 67 65 72 2e 64 62 53 69 7a 65 20 63 6f 6e 74  ager.dbSize cont
1b60: 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  ains the number 
1b70: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 74 68  of pages that th
1b80: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20  e database.**   
1b90: 69 6d 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20  image currently 
1ba0: 63 6f 6e 74 61 69 6e 73 2e 20 41 73 20 74 68 65  contains. As the
1bb0: 20 64 61 74 61 62 61 73 65 20 69 6d 61 67 65 20   database image 
1bc0: 67 72 6f 77 73 20 6f 72 20 73 68 72 69 6e 6b 73  grows or shrinks
1bd0: 20 74 68 69 73 0a 2a 2a 20 20 20 76 61 72 69 61   this.**   varia
1be0: 62 6c 65 20 69 73 20 75 70 64 61 74 65 64 2e 20  ble is updated. 
1bf0: 54 68 65 20 76 61 72 69 61 62 6c 65 20 50 61 67  The variable Pag
1c00: 65 72 2e 64 62 46 69 6c 65 53 69 7a 65 20 63 6f  er.dbFileSize co
1c10: 6e 74 61 69 6e 73 20 74 68 65 20 6e 75 6d 62 65  ntains the numbe
1c20: 72 0a 2a 2a 20 20 20 6f 66 20 70 61 67 65 73 20  r.**   of pages 
1c30: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1c40: 66 69 6c 65 2e 20 54 68 69 73 20 6d 61 79 20 62  file. This may b
1c50: 65 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  e different from
1c60: 20 50 61 67 65 72 2e 64 62 53 69 7a 65 0a 2a 2a   Pager.dbSize.**
1c70: 20 20 20 69 66 20 73 6f 6d 65 20 70 61 67 65 73     if some pages
1c80: 20 68 61 76 65 20 62 65 65 6e 20 61 70 70 65 6e   have been appen
1c90: 64 65 64 20 74 6f 20 74 68 65 20 64 61 74 61 62  ded to the datab
1ca0: 61 73 65 20 69 6d 61 67 65 20 62 75 74 20 6e 6f  ase image but no
1cb0: 74 20 79 65 74 20 77 72 69 74 74 65 6e 0a 2a 2a  t yet written.**
1cc0: 20 20 20 6f 75 74 20 66 72 6f 6d 20 74 68 65 20     out from the 
1cd0: 63 61 63 68 65 20 74 6f 20 74 68 65 20 61 63 74  cache to the act
1ce0: 75 61 6c 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b  ual file on disk
1cf0: 2e 20 4f 72 20 69 66 20 74 68 65 20 69 6d 61 67  . Or if the imag
1d00: 65 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20  e has been.**   
1d10: 74 72 75 6e 63 61 74 65 64 20 62 79 20 61 6e 20  truncated by an 
1d20: 69 6e 63 72 65 6d 65 6e 74 61 6c 2d 76 61 63 75  incremental-vacu
1d30: 75 6d 20 6f 70 65 72 61 74 69 6f 6e 2e 20 54 68  um operation. Th
1d40: 65 20 50 61 67 65 72 2e 64 62 4f 72 69 67 53 69  e Pager.dbOrigSi
1d50: 7a 65 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 20  ze variable.**  
1d60: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 75   contains the nu
1d70: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
1d80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d   the database im
1d90: 61 67 65 20 77 68 65 6e 20 74 68 65 20 63 75 72  age when the cur
1da0: 72 65 6e 74 0a 2a 2a 20 20 20 74 72 61 6e 73 61  rent.**   transa
1db0: 63 74 69 6f 6e 20 77 61 73 20 6f 70 65 6e 65 64  ction was opened
1dc0: 2e 20 54 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  . The contents o
1dd0: 66 20 61 6c 6c 20 74 68 72 65 65 20 6f 66 20 74  f all three of t
1de0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 69  hese variables i
1df0: 73 0a 2a 2a 20 20 20 6f 6e 6c 79 20 67 75 61 72  s.**   only guar
1e00: 61 6e 74 65 65 64 20 74 6f 20 62 65 20 63 6f 72  anteed to be cor
1e10: 72 65 63 74 20 69 66 20 74 68 65 20 62 6f 6f 6c  rect if the bool
1e20: 65 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  ean Pager.dbSize
1e30: 56 61 6c 69 64 20 69 73 20 74 72 75 65 2e 0a 2a  Valid is true..*
1e40: 2a 0a 2a 2a 20 20 20 54 4f 44 4f 3a 20 55 6e 64  *.**   TODO: Und
1e50: 65 72 20 77 68 61 74 20 63 6f 6e 64 69 74 69 6f  er what conditio
1e60: 6e 73 20 69 73 20 64 62 53 69 7a 65 56 61 6c 69  ns is dbSizeVali
1e70: 64 20 73 65 74 3f 20 43 6c 65 61 72 65 64 3f 0a  d set? Cleared?.
1e80: 2a 2a 0a 2a 2a 20 63 68 61 6e 67 65 43 6f 75 6e  **.** changeCoun
1e90: 74 44 6f 6e 65 0a 2a 2a 0a 2a 2a 20 20 20 54 68  tDone.**.**   Th
1ea0: 69 73 20 62 6f 6f 6c 65 61 6e 20 76 61 72 69 61  is boolean varia
1eb0: 62 6c 65 20 69 73 20 75 73 65 64 20 74 6f 20 6d  ble is used to m
1ec0: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
1ed0: 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
1ee0: 20 0a 2a 2a 20 20 20 28 74 68 65 20 34 2d 62 79   .**   (the 4-by
1ef0: 74 65 20 68 65 61 64 65 72 20 66 69 65 6c 64 20  te header field 
1f00: 61 74 20 62 79 74 65 20 6f 66 66 73 65 74 20 32  at byte offset 2
1f10: 34 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  4 of the databas
1f20: 65 20 66 69 6c 65 29 20 69 73 20 0a 2a 2a 20 20  e file) is .**  
1f30: 20 6e 6f 74 20 75 70 64 61 74 65 64 20 6d 6f 72   not updated mor
1f40: 65 20 6f 66 74 65 6e 20 74 68 61 6e 20 6e 65 63  e often than nec
1f50: 65 73 73 61 72 79 2e 20 0a 2a 2a 0a 2a 2a 20 20  essary. .**.**  
1f60: 20 49 74 20 69 73 20 73 65 74 20 74 6f 20 74 72   It is set to tr
1f70: 75 65 20 77 68 65 6e 20 74 68 65 20 63 68 61 6e  ue when the chan
1f80: 67 65 2d 63 6f 75 6e 74 65 72 20 66 69 65 6c 64  ge-counter field
1f90: 20 69 73 20 75 70 64 61 74 65 64 2c 20 77 68 69   is updated, whi
1fa0: 63 68 20 0a 2a 2a 20 20 20 63 61 6e 20 6f 6e 6c  ch .**   can onl
1fb0: 79 20 68 61 70 70 65 6e 20 69 66 20 61 6e 20 65  y happen if an e
1fc0: 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 69 73  xclusive lock is
1fd0: 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 64 61 74   held on the dat
1fe0: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
1ff0: 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20 28   It is cleared (
2000: 73 65 74 20 74 6f 20 66 61 6c 73 65 29 20 77 68  set to false) wh
2010: 65 6e 65 76 65 72 20 61 6e 20 65 78 63 6c 75 73  enever an exclus
2020: 69 76 65 20 6c 6f 63 6b 20 69 73 20 0a 2a 2a 20  ive lock is .** 
2030: 20 20 72 65 6c 69 6e 71 75 69 73 68 65 64 20 6f    relinquished o
2040: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2050: 69 6c 65 2e 20 45 61 63 68 20 74 69 6d 65 20 61  ile. Each time a
2060: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
2070: 63 6f 6d 6d 69 74 74 65 64 2c 0a 2a 2a 20 20 20  committed,.**   
2080: 54 68 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44  The changeCountD
2090: 6f 6e 65 20 66 6c 61 67 20 69 73 20 69 6e 73 70  one flag is insp
20a0: 65 63 74 65 64 2e 20 49 66 20 69 74 20 69 73 20  ected. If it is 
20b0: 74 72 75 65 2c 20 74 68 65 20 77 6f 72 6b 20 6f  true, the work o
20c0: 66 0a 2a 2a 20 20 20 75 70 64 61 74 69 6e 67 20  f.**   updating 
20d0: 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74  the change-count
20e0: 65 72 20 69 73 20 6f 6d 69 74 74 65 64 20 66 6f  er is omitted fo
20f0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  r the current tr
2100: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  ansaction..**.**
2110: 20 20 20 54 68 69 73 20 6d 65 63 68 61 6e 69 73     This mechanis
2120: 6d 20 6d 65 61 6e 73 20 74 68 61 74 20 77 68 65  m means that whe
2130: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63  n running in exc
2140: 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 61 20 63  lusive mode, a c
2150: 6f 6e 6e 65 63 74 69 6f 6e 20 0a 2a 2a 20 20 20  onnection .**   
2160: 6e 65 65 64 20 6f 6e 6c 79 20 75 70 64 61 74 65  need only update
2170: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
2180: 74 65 72 20 6f 6e 63 65 2c 20 66 6f 72 20 74 68  ter once, for th
2190: 65 20 66 69 72 73 74 20 74 72 61 6e 73 61 63 74  e first transact
21a0: 69 6f 6e 0a 2a 2a 20 20 20 63 6f 6d 6d 69 74 74  ion.**   committ
21b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 64 62 4d 6f 64 69  ed..**.** dbModi
21c0: 66 69 65 64 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65  fied.**.**   The
21d0: 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61 67   dbModified flag
21e0: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
21f0: 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67 65   a database page
2200: 20 69 73 20 64 69 72 74 69 65 64 2e 0a 2a 2a 20   is dirtied..** 
2210: 20 20 49 74 20 69 73 20 63 6c 65 61 72 65 64 20    It is cleared 
2220: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 65 61  at the end of ea
2230: 63 68 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ch transaction..
2240: 2a 2a 0a 2a 2a 20 20 20 49 74 20 69 73 20 75 73  **.**   It is us
2250: 65 64 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 69  ed when committi
2260: 6e 67 20 6f 72 20 6f 74 68 65 72 77 69 73 65 20  ng or otherwise 
2270: 65 6e 64 69 6e 67 20 61 20 74 72 61 6e 73 61 63  ending a transac
2280: 74 69 6f 6e 2e 20 49 66 0a 2a 2a 20 20 20 74 68  tion. If.**   th
2290: 65 20 64 62 4d 6f 64 69 66 69 65 64 20 66 6c 61  e dbModified fla
22a0: 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
22b0: 6c 65 73 73 20 77 6f 72 6b 20 68 61 73 20 74 6f  less work has to
22c0: 20 62 65 20 64 6f 6e 65 2e 0a 2a 2a 0a 2a 2a 20   be done..**.** 
22d0: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 0a 2a  journalStarted.*
22e0: 2a 0a 2a 2a 20 20 20 54 68 69 73 20 66 6c 61 67  *.**   This flag
22f0: 20 69 73 20 73 65 74 20 77 68 65 6e 65 76 65 72   is set whenever
2300: 20 74 68 65 20 74 68 65 20 6d 61 69 6e 20 6a 6f   the the main jo
2310: 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2e  urnal is synced.
2320: 20 0a 2a 2a 0a 2a 2a 20 20 20 54 68 65 20 70 6f   .**.**   The po
2330: 69 6e 74 20 6f 66 20 74 68 69 73 20 66 6c 61 67  int of this flag
2340: 20 69 73 20 74 68 61 74 20 69 74 20 6d 75 73 74   is that it must
2350: 20 62 65 20 73 65 74 20 61 66 74 65 72 20 74 68   be set after th
2360: 65 20 0a 2a 2a 20 20 20 66 69 72 73 74 20 6a 6f  e .**   first jo
2370: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 20  urnal header in 
2380: 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  a journal file h
2390: 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74  as been synced t
23a0: 6f 20 64 69 73 6b 2e 0a 2a 2a 20 20 20 41 66 74  o disk..**   Aft
23b0: 65 72 20 74 68 69 73 20 68 61 73 20 68 61 70 70  er this has happ
23c0: 65 6e 65 64 2c 20 6e 65 77 20 70 61 67 65 73 20  ened, new pages 
23d0: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
23e0: 64 61 74 61 62 61 73 65 20 0a 2a 2a 20 20 20 64  database .**   d
23f0: 6f 20 6e 6f 74 20 6e 65 65 64 20 74 68 65 20 50  o not need the P
2400: 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66  GHDR_NEED_SYNC f
2410: 6c 61 67 20 73 65 74 2c 20 61 73 20 74 68 65 79  lag set, as they
2420: 20 64 6f 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20   do not need.** 
2430: 20 20 74 6f 20 77 61 69 74 20 66 6f 72 20 61 20    to wait for a 
2440: 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 62 65 66  journal sync bef
2450: 6f 72 65 20 74 68 65 79 20 63 61 6e 20 62 65 20  ore they can be 
2460: 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 2a  written out to.*
2470: 2a 20 20 20 74 68 65 20 64 61 74 61 62 61 73 65  *   the database
2480: 20 66 69 6c 65 20 28 73 65 65 20 66 75 6e 63 74   file (see funct
2490: 69 6f 6e 20 70 61 67 65 72 5f 77 72 69 74 65 28  ion pager_write(
24a0: 29 29 2e 0a 2a 2a 20 20 20 0a 2a 2a 20 73 65 74  ))..**   .** set
24b0: 4d 61 73 74 65 72 0a 2a 2a 0a 2a 2a 20 20 20 54  Master.**.**   T
24c0: 68 69 73 20 76 61 72 69 61 62 6c 65 20 69 73 20  his variable is 
24d0: 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20 74  used to ensure t
24e0: 68 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a  hat the master j
24f0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
2500: 0a 2a 2a 20 20 20 28 69 66 20 61 6e 79 29 20 69  .**   (if any) i
2510: 73 20 6f 6e 6c 79 20 77 72 69 74 74 65 6e 20 69  s only written i
2520: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
2530: 66 69 6c 65 20 6f 6e 63 65 2e 0a 2a 2a 0a 2a 2a  file once..**.**
2540: 20 20 20 57 68 65 6e 20 63 6f 6d 6d 69 74 74 69     When committi
2550: 6e 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ng a transaction
2560: 2c 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  , the master jou
2570: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 28  rnal file name (
2580: 69 66 20 61 6e 79 29 0a 2a 2a 20 20 20 6d 61 79  if any).**   may
2590: 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
25a0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25b0: 65 20 77 68 69 6c 65 20 74 68 65 20 70 61 67 65  e while the page
25c0: 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 0a 2a 2a  r is still in.**
25d0: 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45     PAGER_RESERVE
25e0: 44 20 73 74 61 74 65 20 28 73 65 65 20 43 6f 6d  D state (see Com
25f0: 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 66 6f  mitPhaseOne() fo
2600: 72 20 74 68 65 20 61 63 74 69 6f 6e 29 2e 20 49  r the action). I
2610: 74 0a 2a 2a 20 20 20 74 68 65 6e 20 61 74 74 65  t.**   then atte
2620: 6d 70 74 73 20 74 6f 20 75 70 67 72 61 64 65 20  mpts to upgrade 
2630: 74 6f 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20  to an exclusive 
2640: 6c 6f 63 6b 2e 20 49 66 20 74 68 69 73 20 61 74  lock. If this at
2650: 74 65 6d 70 74 0a 2a 2a 20 20 20 66 61 69 6c 73  tempt.**   fails
2660: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 42 55  , then SQLITE_BU
2670: 53 59 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  SY may be return
2680: 65 64 20 74 6f 20 74 68 65 20 75 73 65 72 20 61  ed to the user a
2690: 6e 64 20 74 68 65 20 75 73 65 72 0a 2a 2a 20 20  nd the user.**  
26a0: 20 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20   may attempt to 
26b0: 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
26c0: 61 63 74 69 6f 6e 20 61 67 61 69 6e 20 6c 61 74  action again lat
26d0: 65 72 20 28 63 61 6c 6c 69 6e 67 0a 2a 2a 20 20  er (calling.**  
26e0: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
26f0: 29 20 61 67 61 69 6e 29 2e 20 54 68 69 73 20 66  ) again). This f
2700: 6c 61 67 20 69 73 20 75 73 65 64 20 74 6f 20 65  lag is used to e
2710: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 0a  nsure that the .
2720: 2a 2a 20 20 20 6d 61 73 74 65 72 20 6a 6f 75 72  **   master jour
2730: 6e 61 6c 20 6e 61 6d 65 20 69 73 20 6f 6e 6c 79  nal name is only
2740: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
2750: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
2760: 20 66 69 72 73 74 0a 2a 2a 20 20 20 74 69 6d 65   first.**   time
2770: 20 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28   CommitPhaseOne(
2780: 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a  ) is called..**.
2790: 2a 2a 20 64 6f 4e 6f 74 53 79 6e 63 0a 2a 2a 0a  ** doNotSync.**.
27a0: 2a 2a 20 20 20 54 68 69 73 20 76 61 72 69 61 62  **   This variab
27b0: 6c 65 20 69 73 20 73 65 74 20 61 6e 64 20 63 6c  le is set and cl
27c0: 65 61 72 65 64 20 62 79 20 73 71 6c 69 74 65 33  eared by sqlite3
27d0: 50 61 67 65 72 57 72 69 74 65 28 29 2e 0a 2a 2a  PagerWrite()..**
27e0: 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a  .** needSync.**.
27f0: 2a 2a 20 20 20 54 4f 44 4f 3a 20 49 74 20 6d 69  **   TODO: It mi
2800: 67 68 74 20 62 65 20 65 61 73 69 65 72 20 74 6f  ght be easier to
2810: 20 73 65 74 20 74 68 69 73 20 76 61 72 69 61 62   set this variab
2820: 6c 65 20 69 6e 20 77 72 69 74 65 4a 6f 75 72 6e  le in writeJourn
2830: 61 6c 48 64 72 28 29 0a 2a 2a 20 20 20 61 6e 64  alHdr().**   and
2840: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
2850: 6e 61 6c 28 29 20 6f 6e 6c 79 2e 20 43 68 61 6e  nal() only. Chan
2860: 67 65 20 69 74 73 20 6d 65 61 6e 69 6e 67 20 74  ge its meaning t
2870: 6f 20 22 75 6e 73 79 6e 63 65 64 20 64 61 74 61  o "unsynced data
2880: 0a 2a 2a 20 20 20 68 61 73 20 62 65 65 6e 20 77  .**   has been w
2890: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
28a0: 75 72 6e 61 6c 22 2e 0a 2a 2f 0a 73 74 72 75 63  urnal"..*/.struc
28b0: 74 20 50 61 67 65 72 20 7b 0a 20 20 73 71 6c 69  t Pager {.  sqli
28c0: 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 20 20  te3_vfs *pVfs;  
28d0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 53 20 66 75          /* OS fu
28e0: 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73 65 20 66  nctions to use f
28f0: 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38 20 65 78  or IO */.  u8 ex
2900: 63 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20  clusiveMode;    
2910: 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61         /* Boolea
2920: 6e 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69  n. True if locki
2930: 6e 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49  ng_mode==EXCLUSI
2940: 56 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  VE */.  u8 journ
2950: 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  alMode;         
2960: 20 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65      /* On of the
2970: 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2980: 44 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20  DE_* values */. 
2990: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
29b0: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
29c0: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
29d0: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65  ile */.  u8 noRe
29e0: 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20  adlock;         
29f0: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62       /* Do not b
2a00: 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20  other to obtain 
2a10: 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75  readlocks */.  u
2a20: 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20  8 noSync;       
2a30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f             /* Do
2a40: 20 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f   not sync the jo
2a50: 75 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f  urnal if true */
2a60: 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20  .  u8 fullSync; 
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a80: 2a 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73  * Do extra syncs
2a90: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2aa0: 66 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a  for robustness *
2ab0: 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67  /.  u8 sync_flag
2ac0: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
2ad0: 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e  /* One of SYNC_N
2ae0: 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55  ORMAL or SYNC_FU
2af0: 4c 4c 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  LL */.  u8 tempF
2b00: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2b10: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2b20: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2b30: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2b40: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2b50: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2b60: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2b70: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6d  tabase */.  u8 m
2b80: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2b90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2ba0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2bb0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 0a 20 20 2f 2a  ile I/O */..  /*
2bc0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62   The following b
2bd0: 6c 6f 63 6b 20 63 6f 6e 74 61 69 6e 73 20 74 68  lock contains th
2be0: 6f 73 65 20 63 6c 61 73 73 20 6d 65 6d 62 65 72  ose class member
2bf0: 73 20 74 68 61 74 20 61 72 65 20 64 79 6e 61 6d  s that are dynam
2c00: 69 63 61 6c 6c 79 0a 20 20 2a 2a 20 6d 6f 64 69  ically.  ** modi
2c10: 66 69 65 64 20 64 75 72 69 6e 67 20 6e 6f 72 6d  fied during norm
2c20: 61 6c 20 6f 70 65 72 61 74 69 6f 6e 73 2e 20 54  al operations. T
2c30: 68 65 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c  he other variabl
2c40: 65 73 20 69 6e 20 74 68 69 73 20 73 74 72 75 63  es in this struc
2c50: 74 75 72 65 0a 20 20 2a 2a 20 61 72 65 20 65 69  ture.  ** are ei
2c60: 74 68 65 72 20 63 6f 6e 73 74 61 6e 74 20 74 68  ther constant th
2c70: 72 6f 75 67 68 6f 75 74 20 74 68 65 20 6c 69 66  roughout the lif
2c80: 65 74 69 6d 65 20 6f 66 20 74 68 65 20 70 61 67  etime of the pag
2c90: 65 72 2c 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  er, or else.  **
2ca0: 20 75 73 65 64 20 74 6f 20 73 74 6f 72 65 20 63   used to store c
2cb0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 70 61 72  onfiguration par
2cc0: 61 6d 65 74 65 72 73 20 74 68 61 74 20 61 66 66  ameters that aff
2cd0: 65 63 74 20 74 68 65 20 77 61 79 20 74 68 65 20  ect the way the 
2ce0: 70 61 67 65 72 20 0a 20 20 2a 2a 20 6f 70 65 72  pager .  ** oper
2cf0: 61 74 65 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ates..  **.  ** 
2d00: 54 68 65 20 27 73 74 61 74 65 27 20 76 61 72 69  The 'state' vari
2d10: 61 62 6c 65 20 69 73 20 64 65 73 63 72 69 62 65  able is describe
2d20: 64 20 69 6e 20 6d 6f 72 65 20 64 65 74 61 69 6c  d in more detail
2d30: 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 0a   along with the.
2d40: 20 20 2a 2a 20 64 65 73 63 72 69 70 74 69 6f 6e    ** description
2d50: 73 20 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20  s of the values 
2d60: 69 74 20 6d 61 79 20 74 61 6b 65 20 2d 20 50 41  it may take - PA
2d70: 47 45 52 5f 55 4e 4c 4f 43 4b 20 65 74 63 2e 20  GER_UNLOCK etc. 
2d80: 4d 61 6e 79 20 6f 66 20 74 68 65 0a 20 20 2a 2a  Many of the.  **
2d90: 20 6f 74 68 65 72 20 76 61 72 69 61 62 6c 65 73   other variables
2da0: 20 69 6e 20 74 68 69 73 20 62 6c 6f 63 6b 20 61   in this block a
2db0: 72 65 20 64 65 73 63 72 69 62 65 64 20 69 6e 20  re described in 
2dc0: 74 68 65 20 63 6f 6d 6d 65 6e 74 20 64 69 72 65  the comment dire
2dd0: 63 74 6c 79 20 0a 20 20 2a 2a 20 61 62 6f 76 65  ctly .  ** above
2de0: 20 74 68 69 73 20 63 6c 61 73 73 20 64 65 66 69   this class defi
2df0: 6e 69 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 75  nition..  */.  u
2e00: 38 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20  8 state;        
2e10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41             /* PA
2e20: 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41  GER_UNLOCK, _SHA
2e30: 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20  RED, _RESERVED, 
2e40: 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 64 62 4d  etc. */.  u8 dbM
2e50: 6f 64 69 66 69 65 64 3b 20 20 20 20 20 20 20 20  odified;        
2e60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2e70: 20 74 68 65 72 65 20 61 72 65 20 61 6e 79 20 63   there are any c
2e80: 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 44 62  hanges to the Db
2e90: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2ea0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2eb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
2ec0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
2ed0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
2ee0: 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61 6c   */.  u8 journal
2ef0: 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20 20  Started;        
2f00: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65 61    /* True if hea
2f10: 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 69  der of journal i
2f20: 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75 38  s synced */.  u8
2f30: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
2f40: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
2f50: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
2f60: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
2f70: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 75 38 20 73  ounter */.  u8 s
2f80: 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20  etMaster;       
2f90: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2fa0: 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61  if a m-j name ha
2fb0: 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  s been written t
2fc0: 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64  o jrnl */.  u8 d
2fd0: 6f 4e 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20  oNotSync;       
2fe0: 20 20 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65          /* Boole
2ff0: 61 6e 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20  an. While true, 
3000: 64 6f 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65  do not spill the
3010: 20 63 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 64   cache */.  u8 d
3020: 62 53 69 7a 65 56 61 6c 69 64 3b 20 20 20 20 20  bSizeValid;     
3030: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 77          /* Set w
3040: 68 65 6e 20 64 62 53 69 7a 65 20 69 73 20 63 6f  hen dbSize is co
3050: 72 72 65 63 74 20 2a 2f 0a 20 20 50 67 6e 6f 20  rrect */.  Pgno 
3060: 64 62 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  dbSize;         
3070: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
3080: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
3090: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 50   database */.  P
30a0: 67 6e 6f 20 64 62 4f 72 69 67 53 69 7a 65 3b 20  gno dbOrigSize; 
30b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
30c0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
30d0: 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
30e0: 69 6f 6e 20 2a 2f 0a 20 20 50 67 6e 6f 20 64 62  ion */.  Pgno db
30f0: 46 69 6c 65 53 69 7a 65 3b 20 20 20 20 20 20 20  FileSize;       
3100: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
3110: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
3120: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
3130: 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20 20    int errCode;  
3140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3150: 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c 20   One of several 
3160: 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73 20  kinds of errors 
3170: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  */.  int nRec;  
3180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3190: 20 2f 2a 20 50 61 67 65 73 20 6a 6f 75 72 6e 61   /* Pages journa
31a0: 6c 6c 65 64 20 73 69 6e 63 65 20 6c 61 73 74 20  lled since last 
31b0: 6a 2d 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  j-header written
31c0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
31d0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
31e0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
31f0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
3200: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
3210: 2a 2f 0a 20 20 75 33 32 20 6e 53 75 62 52 65 63  */.  u32 nSubRec
3220: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3230: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
3240: 63 6f 72 64 73 20 77 72 69 74 74 65 6e 20 74 6f  cords written to
3250: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 2a 2f 0a   sub-journal */.
3260: 20 20 42 69 74 76 65 63 20 2a 70 49 6e 4a 6f 75    Bitvec *pInJou
3270: 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 2f 2a  rnal;         /*
3280: 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63   One bit for eac
3290: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61  h page in the da
32a0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
32b0: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
32c0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  d;           /* 
32d0: 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  File descriptor 
32e0: 66 6f 72 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  for database */.
32f0: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
3300: 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  jfd;          /*
3310: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
3320: 20 66 6f 72 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   for main journa
3330: 6c 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  l */.  sqlite3_f
3340: 69 6c 65 20 2a 73 6a 66 64 3b 20 20 20 20 20 20  ile *sjfd;      
3350: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
3360: 69 70 74 6f 72 20 66 6f 72 20 73 75 62 2d 6a 6f  iptor for sub-jo
3370: 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20 6a  urnal */.  i64 j
3380: 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20  ournalOff;      
3390: 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e         /* Curren
33a0: 74 20 77 72 69 74 65 20 6f 66 66 73 65 74 20 69  t write offset i
33b0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
33c0: 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72  le */.  i64 jour
33d0: 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20 20  nalHdr;         
33e0: 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66 73      /* Byte offs
33f0: 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20 6a  et to previous j
3400: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f  ournal header */
3410: 0a 20 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e  .  PagerSavepoin
3420: 74 20 2a 61 53 61 76 65 70 6f 69 6e 74 3b 20 2f  t *aSavepoint; /
3430: 2a 20 41 72 72 61 79 20 6f 66 20 61 63 74 69 76  * Array of activ
3440: 65 20 73 61 76 65 70 6f 69 6e 74 73 20 2a 2f 0a  e savepoints */.
3450: 20 20 69 6e 74 20 6e 53 61 76 65 70 6f 69 6e 74    int nSavepoint
3460: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3470: 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   Number of eleme
3480: 6e 74 73 20 69 6e 20 61 53 61 76 65 70 6f 69 6e  nts in aSavepoin
3490: 74 5b 5d 20 2a 2f 0a 20 20 63 68 61 72 20 64 62  t[] */.  char db
34a0: 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20 20 20  FileVers[16];   
34b0: 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65 73 20       /* Changes 
34c0: 77 68 65 6e 65 76 65 72 20 64 61 74 61 62 61 73  whenever databas
34d0: 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73 20 2a  e file changes *
34e0: 2f 0a 20 20 75 33 32 20 73 65 63 74 6f 72 53 69  /.  u32 sectorSi
34f0: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3500: 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f  /* Assumed secto
3510: 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f  r size during ro
3520: 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 69 6e 74  llback */..  int
3530: 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20 20   nExtra;        
3540: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 20           /* Add 
3550: 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20  this many bytes 
3560: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
3570: 79 20 70 61 67 65 20 2a 2f 0a 20 20 75 33 32 20  y page */.  u32 
3580: 76 66 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20  vfsFlags;       
3590: 20 20 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73          /* Flags
35a0: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73   for sqlite3_vfs
35b0: 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e  .xOpen() */.  in
35c0: 74 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20  t pageSize;     
35d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
35e0: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
35f0: 61 20 70 61 67 65 20 2a 2f 0a 20 20 50 67 6e 6f  a page */.  Pgno
3600: 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20   mxPgno;        
3610: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
3620: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20  um allowed size 
3630: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3640: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c 65  */.  char *zFile
3650: 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  name;           
3660: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3670: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3680: 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61  .  char *zJourna
3690: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  l;             /
36a0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f  * Name of the jo
36b0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20  urnal file */.  
36c0: 69 6e 74 20 28 2a 78 42 75 73 79 48 61 6e 64 6c  int (*xBusyHandl
36d0: 65 72 29 28 76 6f 69 64 2a 29 3b 20 2f 2a 20 46  er)(void*); /* F
36e0: 75 6e 63 74 69 6f 6e 20 74 6f 20 63 61 6c 6c 20  unction to call 
36f0: 77 68 65 6e 20 62 75 73 79 20 2a 2f 0a 20 20 76  when busy */.  v
3700: 6f 69 64 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  oid *pBusyHandle
3710: 72 41 72 67 3b 20 20 20 20 20 20 2f 2a 20 43 6f  rArg;      /* Co
3720: 6e 74 65 78 74 20 61 72 67 75 6d 65 6e 74 20 66  ntext argument f
3730: 6f 72 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20  or xBusyHandler 
3740: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3750: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
3760: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
3770: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
3780: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
3790: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
37a0: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
37b0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
37c0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
37d0: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
37e0: 2a 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61  *xReiniter)(DbPa
37f0: 67 65 2a 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68  ge*); /* Call th
3800: 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
3810: 72 65 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20  reloading pages 
3820: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3830: 5f 48 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69  _HAS_CODEC.  voi
3840: 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
3850: 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
3860: 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66  t); /* Routine f
3870: 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64  or en/decoding d
3880: 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70  ata */.  void *p
3890: 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20 20  CodecArg;       
38a0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72       /* First ar
38b0: 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63  gument to xCodec
38c0: 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  () */.#endif.  c
38d0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
38e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
38f0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
3900: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
3910: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 69 36 34  tmp use */.  i64
3920: 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69   journalSizeLimi
3930: 74 3b 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65  t;       /* Size
3940: 20 6c 69 6d 69 74 20 66 6f 72 20 70 65 72 73 69   limit for persi
3950: 73 74 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69  stent journal fi
3960: 6c 65 73 20 2a 2f 0a 20 20 50 43 61 63 68 65 20  les */.  PCache 
3970: 2a 70 50 43 61 63 68 65 3b 20 20 20 20 20 20 20  *pPCache;       
3980: 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
3990: 74 6f 20 70 61 67 65 20 63 61 63 68 65 20 6f 62  to page cache ob
39a0: 6a 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ject */.  sqlite
39b0: 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75  3_backup *pBacku
39c0: 70 3b 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72  p;    /* Pointer
39d0: 20 74 6f 20 6c 69 73 74 20 6f 66 20 6f 6e 67 6f   to list of ongo
39e0: 69 6e 67 20 62 61 63 6b 75 70 20 70 72 6f 63 65  ing backup proce
39f0: 73 73 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  sses */.};../*.*
3a00: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
3a10: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
3a20: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
3a30: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
3a40: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
3a50: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
3a60: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
3a70: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
3a80: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
3a90: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
3aa0: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
3ab0: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
3ac0: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
3ad0: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
3ae0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
3af0: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
3b00: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
3b10: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
3b20: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
3b30: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
3b40: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
3b50: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
3b60: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
3b70: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
3b80: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
3b90: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
3ba0: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
3bb0: 61 6c 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50  al */.# define P
3bc0: 41 47 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b  AGER_INCR(v)  v+
3bd0: 2b 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  +.#else.# define
3be0: 20 50 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23   PAGER_INCR(v).#
3bf0: 65 6e 64 69 66 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 4a  endif..../*.** J
3c00: 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67  ournal files beg
3c10: 69 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c  in with the foll
3c20: 6f 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69  owing magic stri
3c30: 6e 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a  ng.  The data.**
3c40: 20 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72   was obtained fr
3c50: 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20  om /dev/random. 
3c60: 20 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79   It is used only
3c70: 20 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65   as a sanity che
3c80: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20  ck..**.** Since 
3c90: 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74  version 2.8.0, t
3ca0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  he journal forma
3cb0: 74 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74  t contains addit
3cc0: 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20  ional sanity.** 
3cd0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3ce0: 74 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f  tion.  If the po
3cf0: 77 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20  wer fails while 
3d00: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62  the journal is b
3d10: 65 69 6e 67 0a 2a 2a 20 77 72 69 74 74 65 6e 2c  eing.** written,
3d20: 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72   semi-random gar
3d30: 62 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20  bage data might 
3d40: 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f  appear in the jo
3d50: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66  urnal.** file af
3d60: 74 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73  ter power is res
3d70: 74 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74  tored.  If an at
3d80: 74 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61  tempt is then ma
3d90: 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68  de.** to roll th
3da0: 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20  e journal back, 
3db0: 74 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75  the database cou
3dc0: 6c 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e  ld be corrupted.
3dd0: 20 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c    The additional
3de0: 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b  .** sanity check
3df0: 69 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61  ing data is an a
3e00: 74 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76  ttempt to discov
3e10: 65 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69  er the garbage i
3e20: 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  n the.** journal
3e30: 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a   and ignore it..
3e40: 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79  **.** The sanity
3e50: 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d   checking inform
3e60: 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65  ation for the ne
3e70: 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  w journal format
3e80: 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20   consists.** of 
3e90: 61 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75  a 32-bit checksu
3ea0: 6d 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f  m on each page o
3eb0: 66 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65  f data.  The che
3ec0: 63 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74  cksum covers bot
3ed0: 68 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75  h.** the page nu
3ee0: 6d 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61  mber and the pPa
3ef0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79  ger->pageSize by
3f00: 74 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20  tes of data for 
3f10: 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69  the page..** Thi
3f20: 73 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69  s cksum is initi
3f30: 61 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62  alized to a 32-b
3f40: 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  it random value 
3f50: 74 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20  that appears in 
3f60: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
3f70: 69 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20  ile right after 
3f80: 74 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65  the header.  The
3f90: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69   random initiali
3fa0: 7a 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74  zer is important
3fb0: 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72  ,.** because gar
3fc0: 62 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61  bage data that a
3fd0: 70 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e  ppears at the en
3fe0: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69  d of a journal i
3ff0: 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61  s likely.** data
4000: 20 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69   that was once i
4010: 6e 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68  n other files th
4020: 61 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e  at have now been
4030: 20 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68   deleted.  If th
4040: 65 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74  e.** garbage dat
4050: 61 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f  a came from an o
4060: 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20  bsolete journal 
4070: 66 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73  file, the checks
4080: 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20  ums might.** be 
4090: 63 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79  correct.  But by
40a0: 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68   initializing th
40b0: 65 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61  e checksum to ra
40c0: 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68  ndom value which
40d0: 0a 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74  .** is different
40e0: 20 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e   for every journ
40f0: 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20  al, we minimize 
4100: 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74  that risk..*/.st
4110: 61 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67  atic const unsig
4120: 6e 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61  ned char aJourna
4130: 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30  lMagic[] = {.  0
4140: 78 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c  xd9, 0xd5, 0x05,
4150: 20 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61   0xf9, 0x20, 0xa
4160: 31 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d  1, 0x63, 0xd7,.}
4170: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a  ;../*.** The siz
4180: 65 20 6f 66 20 74 68 65 20 6f 66 20 65 61 63 68  e of the of each
4190: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 6e 20   page record in 
41a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 67  the journal is g
41b0: 69 76 65 6e 20 62 79 0a 2a 2a 20 74 68 65 20 66  iven by.** the f
41c0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 2e 0a  ollowing macro..
41d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
41e0: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
41f0: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
4200: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
4210: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
4220: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
4230: 69 73 20 70 61 67 65 72 2e 20 54 68 69 73 20 69  is pager. This i
4240: 73 20 75 73 75 61 6c 6c 79 20 74 68 65 20 73 61  s usually the sa
4250: 6d 65 20 0a 2a 2a 20 73 69 7a 65 20 61 73 20 61  me .** size as a
4260: 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65 63   single disk sec
4270: 74 6f 72 2e 20 53 65 65 20 61 6c 73 6f 20 73 65  tor. See also se
4280: 74 53 65 63 74 6f 72 53 69 7a 65 28 29 2e 0a 2a  tSectorSize()..*
4290: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
42a0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
42b0: 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
42c0: 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  Size)../*.** The
42d0: 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69 73 20   macro MEMDB is 
42e0: 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20 64  true if we are d
42f0: 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e 20 69  ealing with an i
4300: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
4310: 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68 69 73  e..** We do this
4320: 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f 20 74   as a macro so t
4330: 68 61 74 20 69 66 20 74 68 65 20 53 51 4c 49 54  hat if the SQLIT
4340: 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20  E_OMIT_MEMORYDB 
4350: 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a  macro is set,.**
4360: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 4d 45   the value of ME
4370: 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20 63 6f  MDB will be a co
4380: 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65 20 63  nstant and the c
4390: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74  ompiler will opt
43a0: 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64  imize.** out cod
43b0: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e 65 76  e that would nev
43c0: 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23  er execute..*/.#
43d0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
43e0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64 65 66  T_MEMORYDB.# def
43f0: 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73  ine MEMDB 0.#els
4400: 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  e.# define MEMDB
4410: 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23   pPager->memDb.#
4420: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  endif../*.** The
4430: 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70   maximum legal p
4440: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28 32  age number is (2
4450: 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65  ^31 - 1)..*/.#de
4460: 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f 50  fine PAGER_MAX_P
4470: 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a 0a  GNO 2147483647..
4480: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
4490: 2f 2a 0a 2a 2a 20 55 73 61 67 65 3a 0a 2a 2a 0a  /*.** Usage:.**.
44a0: 2a 2a 20 20 20 61 73 73 65 72 74 28 20 61 73 73  **   assert( ass
44b0: 65 72 74 5f 70 61 67 65 72 5f 73 74 61 74 65 28  ert_pager_state(
44c0: 70 50 61 67 65 72 29 20 29 3b 0a 2a 2f 0a 73 74  pPager) );.*/.st
44d0: 61 74 69 63 20 69 6e 74 20 61 73 73 65 72 74 5f  atic int assert_
44e0: 70 61 67 65 72 5f 73 74 61 74 65 28 50 61 67 65  pager_state(Page
44f0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 2f  r *pPager){..  /
4500: 2a 20 41 20 74 65 6d 70 2d 66 69 6c 65 20 69 73  * A temp-file is
4510: 20 61 6c 77 61 79 73 20 69 6e 20 50 41 47 45 52   always in PAGER
4520: 5f 45 58 43 4c 55 53 49 56 45 20 6f 72 20 50 41  _EXCLUSIVE or PA
4530: 47 45 52 5f 53 59 4e 43 45 44 20 73 74 61 74 65  GER_SYNCED state
4540: 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
4550: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3d  Pager->tempFile=
4560: 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  =0 || pPager->st
4570: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
4580: 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 54 68  SIVE );..  /* Th
4590: 65 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e  e changeCountDon
45a0: 65 20 66 6c 61 67 20 69 73 20 61 6c 77 61 79 73  e flag is always
45b0: 20 73 65 74 20 66 6f 72 20 74 65 6d 70 2d 66 69   set for temp-fi
45c0: 6c 65 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  les */.  assert(
45d0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
45e0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
45f0: 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
4600: 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  );..  return 1;.
4610: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
4620: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 69  Return true if i
4630: 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
4640: 6f 20 77 72 69 74 65 20 70 61 67 65 20 2a 70 50  o write page *pP
4650: 67 20 69 6e 74 6f 20 74 68 65 20 73 75 62 2d 6a  g into the sub-j
4660: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 41 20 70 61 67  ournal..** A pag
4670: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 77 72  e needs to be wr
4680: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 73  itten into the s
4690: 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66 20 74 68  ub-journal if th
46a0: 65 72 65 20 65 78 69 73 74 73 20 6f 6e 65 0a 2a  ere exists one.*
46b0: 2a 20 6f 72 20 6d 6f 72 65 20 6f 70 65 6e 20 73  * or more open s
46c0: 61 76 65 70 6f 69 6e 74 73 20 66 6f 72 20 77 68  avepoints for wh
46d0: 69 63 68 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54  ich:.**.**   * T
46e0: 68 65 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 69  he page-number i
46f0: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
4700: 71 75 61 6c 20 74 6f 20 50 61 67 65 72 53 61 76  qual to PagerSav
4710: 65 70 6f 69 6e 74 2e 6e 4f 72 69 67 2c 20 61 6e  epoint.nOrig, an
4720: 64 0a 2a 2a 20 20 20 2a 20 54 68 65 20 62 69 74  d.**   * The bit
4730: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 74   corresponding t
4740: 6f 20 74 68 65 20 70 61 67 65 2d 6e 75 6d 62 65  o the page-numbe
4750: 72 20 69 73 20 6e 6f 74 20 73 65 74 20 69 6e 0a  r is not set in.
4760: 2a 2a 20 20 20 20 20 50 61 67 65 72 53 61 76 65  **     PagerSave
4770: 70 6f 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69  point.pInSavepoi
4780: 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
4790: 74 20 73 75 62 6a 52 65 71 75 69 72 65 73 50 61  t subjRequiresPa
47a0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
47b0: 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d 20 70 50    Pgno pgno = pP
47c0: 67 2d 3e 70 67 6e 6f 3b 0a 20 20 50 61 67 65 72  g->pgno;.  Pager
47d0: 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
47e0: 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 69 3b  pPager;.  int i;
47f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50  .  for(i=0; i<pP
4800: 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
4810: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 50 61 67 65  ; i++){.    Page
4820: 72 53 61 76 65 70 6f 69 6e 74 20 2a 70 20 3d 20  rSavepoint *p = 
4830: 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
4840: 69 6e 74 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  int[i];.    if( 
4850: 70 2d 3e 6e 4f 72 69 67 3e 3d 70 67 6e 6f 20 26  p->nOrig>=pgno &
4860: 26 20 30 3d 3d 73 71 6c 69 74 65 33 42 69 74 76  & 0==sqlite3Bitv
4870: 65 63 54 65 73 74 28 70 2d 3e 70 49 6e 53 61 76  ecTest(p->pInSav
4880: 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 20 29 7b  epoint, pgno) ){
4890: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
48a0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
48b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
48c0: 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 74  Return true if t
48d0: 68 65 20 70 61 67 65 20 69 73 20 61 6c 72 65 61  he page is alrea
48e0: 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  dy in the journa
48f0: 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  l file..*/.stati
4900: 63 20 69 6e 74 20 70 61 67 65 49 6e 4a 6f 75 72  c int pageInJour
4910: 6e 61 6c 28 50 67 48 64 72 20 2a 70 50 67 29 7b  nal(PgHdr *pPg){
4920: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4930: 33 42 69 74 76 65 63 54 65 73 74 28 70 50 67 2d  3BitvecTest(pPg-
4940: 3e 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  >pPager->pInJour
4950: 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  nal, pPg->pgno);
4960: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
4970: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4980: 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e 20 66  from the given f
4990: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
49a0: 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74 65 67   Store the integ
49b0: 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20 72 65  er.** that is re
49c0: 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20 52 65  ad in *pRes.  Re
49d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
49e0: 66 20 65 76 65 72 79 74 68 69 6e 67 20 77 6f 72  f everything wor
49f0: 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72  ked, or an.** er
4a00: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
4a10: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
4a20: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75  ..**.** All valu
4a30: 65 73 20 61 72 65 20 73 74 6f 72 65 64 20 6f 6e  es are stored on
4a40: 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65 6e 64   disk as big-end
4a50: 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ian..*/.static i
4a60: 6e 74 20 72 65 61 64 33 32 62 69 74 73 28 73 71  nt read32bits(sq
4a70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
4a80: 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32 20  i64 offset, u32 
4a90: 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67 6e  *pRes){.  unsign
4aa0: 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20  ed char ac[4];. 
4ab0: 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
4ac0: 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c 20  3OsRead(fd, ac, 
4ad0: 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66 66 73  sizeof(ac), offs
4ae0: 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  et);.  if( rc==S
4af0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4b00: 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65 33 47  *pRes = sqlite3G
4b10: 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20 20 7d  et4byte(ac);.  }
4b20: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
4b30: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61 20 33  ./*.** Write a 3
4b40: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20 69 6e  2-bit integer in
4b50: 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75 66 66  to a string buff
4b60: 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69 61 6e  er in big-endian
4b70: 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a 2f 0a   byte order..*/.
4b80: 23 64 65 66 69 6e 65 20 70 75 74 33 32 62 69 74  #define put32bit
4b90: 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65 33 50  s(A,B)  sqlite3P
4ba0: 75 74 34 62 79 74 65 28 28 75 38 2a 29 41 2c 42  ut4byte((u8*)A,B
4bb0: 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  )../*.** Write a
4bc0: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
4bd0: 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20 66  into the given f
4be0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e 20  ile descriptor. 
4bf0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
4c00: 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73 20  K.** on success 
4c10: 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  or an error code
4c20: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f   is something go
4c30: 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
4c40: 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32 62  tic int write32b
4c50: 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c 65  its(sqlite3_file
4c60: 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65 74   *fd, i64 offset
4c70: 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 63 68  , u32 val){.  ch
4c80: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75 74 33  ar ac[4];.  put3
4c90: 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29 3b 0a  2bits(ac, val);.
4ca0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4cb0: 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20  OsWrite(fd, ac, 
4cc0: 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a 0a 2f  4, offset);.}../
4cd0: 2a 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e  *.** The argumen
4ce0: 74 20 74 6f 20 74 68 69 73 20 6d 61 63 72 6f 20  t to this macro 
4cf0: 69 73 20 61 20 66 69 6c 65 20 64 65 73 63 72 69  is a file descri
4d00: 70 74 6f 72 20 28 74 79 70 65 20 73 71 6c 69 74  ptor (type sqlit
4d10: 65 33 5f 66 69 6c 65 2a 29 2e 0a 2a 2a 20 52 65  e3_file*)..** Re
4d20: 74 75 72 6e 20 30 20 69 66 20 69 74 20 69 73 20  turn 0 if it is 
4d30: 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 6e 6f 6e  not open, or non
4d40: 2d 7a 65 72 6f 20 28 62 75 74 20 6e 6f 74 20 31  -zero (but not 1
4d50: 29 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a  ) if it is..**.*
4d60: 2a 20 54 68 69 73 20 69 73 20 73 6f 20 74 68 61  * This is so tha
4d70: 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 63 61  t expressions ca
4d80: 6e 20 62 65 20 77 72 69 74 74 65 6e 20 61 73 3a  n be written as:
4d90: 0a 2a 2a 0a 2a 2a 20 20 20 69 66 28 20 69 73 4f  .**.**   if( isO
4da0: 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
4db0: 20 29 7b 20 2e 2e 2e 0a 2a 2a 0a 2a 2a 20 69 6e   ){ ....**.** in
4dc0: 73 74 65 61 64 20 6f 66 0a 2a 2a 0a 2a 2a 20 20  stead of.**.**  
4dd0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 66 64   if( pPager->jfd
4de0: 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 20 2e 2e  ->pMethods ){ ..
4df0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 4f  ..*/.#define isO
4e00: 70 65 6e 28 70 46 64 29 20 28 28 70 46 64 29 2d  pen(pFd) ((pFd)-
4e10: 3e 70 4d 65 74 68 6f 64 73 29 0a 0a 2f 2a 0a 2a  >pMethods)../*.*
4e20: 2a 20 49 66 20 66 69 6c 65 20 70 46 64 20 69 73  * If file pFd is
4e30: 20 6f 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69   open, call sqli
4e40: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e  te3OsUnlock() on
4e50: 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   it..*/.static i
4e60: 6e 74 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69  nt osUnlock(sqli
4e70: 74 65 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69  te3_file *pFd, i
4e80: 6e 74 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28  nt eLock){.  if(
4e90: 20 21 69 73 4f 70 65 6e 28 70 46 64 29 20 29 7b   !isOpen(pFd) ){
4ea0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
4eb0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
4ec0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
4ed0: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
4ee0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
4ef0: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
4f00: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
4f10: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
4f20: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
4f30: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
4f40: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
4f50: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
4f60: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
4f70: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
4f80: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
4f90: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
4fa0: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
4fb0: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
4fc0: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
4fd0: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
4fe0: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
4ff0: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
5000: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
5010: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
5020: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
5030: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
5040: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
5050: 2a 0a 2a 2a 20 54 68 65 20 6f 70 74 69 6d 69 7a  *.** The optimiz
5060: 61 74 69 6f 6e 20 69 73 20 61 6c 73 6f 20 61 6c  ation is also al
5070: 77 61 79 73 20 65 6e 61 62 6c 65 64 20 66 6f 72  ways enabled for
5080: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73   temporary files
5090: 2e 20 49 74 20 69 73 0a 2a 2a 20 61 6e 20 65 72  . It is.** an er
50a0: 72 6f 72 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  ror to call this
50b0: 20 66 75 6e 63 74 69 6f 6e 20 69 66 20 70 50 61   function if pPa
50c0: 67 65 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e  ger is opened on
50d0: 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a 2a   an in-memory.**
50e0: 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a   database..**.**
50f0: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
5100: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
5110: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
5120: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
5130: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
5140: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
5150: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
5160: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
5170: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
5180: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
5190: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
51a0: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
51b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
51c0: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
51d0: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
51e0: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
51f0: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
5200: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
5210: 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  f( !pPager->temp
5220: 46 69 6c 65 20 29 7b 0a 20 20 20 20 69 6e 74 20  File ){.    int 
5230: 64 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  dc;             
5240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
5250: 20 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65   Device characte
5260: 72 69 73 74 69 63 73 20 2a 2f 0a 20 20 20 20 69  ristics */.    i
5270: 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20 20  nt nSector;     
5280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5290: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
52a0: 2a 2f 0a 20 20 20 20 69 6e 74 20 73 7a 50 61 67  */.    int szPag
52b0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
52c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
52d0: 20 73 69 7a 65 20 2a 2f 0a 0a 20 20 20 20 61 73   size */..    as
52e0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
52f0: 67 65 72 2d 3e 66 64 29 20 29 3b 0a 20 20 20 20  ger->fd) );.    
5300: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
5310: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
5320: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ics(pPager->fd);
5330: 0a 20 20 20 20 6e 53 65 63 74 6f 72 20 3d 20 70  .    nSector = p
5340: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
5350: 65 3b 0a 20 20 20 20 73 7a 50 61 67 65 20 3d 20  e;.    szPage = 
5360: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
5370: 3b 0a 0a 20 20 20 20 61 73 73 65 72 74 28 53 51  ;..    assert(SQ
5380: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
5390: 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b  C512==(512>>8));
53a0: 0a 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49  .    assert(SQLI
53b0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
53c0: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
53d0: 0a 20 20 20 20 69 66 28 20 30 3d 3d 28 64 63 26  .    if( 0==(dc&
53e0: 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54  (SQLITE_IOCAP_AT
53f0: 4f 4d 49 43 7c 28 73 7a 50 61 67 65 3e 3e 38 29  OMIC|(szPage>>8)
5400: 29 20 7c 7c 20 6e 53 65 63 74 6f 72 3e 73 7a 50  ) || nSector>szP
5410: 61 67 65 29 20 29 7b 0a 20 20 20 20 20 20 72 65  age) ){.      re
5420: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
5430: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 4a 4f 55 52  }..  return JOUR
5440: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5450: 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f  r) + JOURNAL_PG_
5460: 53 5a 28 70 50 61 67 65 72 29 3b 0a 7d 0a 23 65  SZ(pPager);.}.#e
5470: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  ndif../*.** If S
5480: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5490: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
54a0: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
54b0: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
54c0: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
54d0: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
54e0: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
54f0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
5500: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
5510: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
5520: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
5530: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
5540: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
5550: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
5560: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
5570: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
5580: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
5590: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
55a0: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
55b0: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
55c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
55d0: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
55e0: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
55f0: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
5600: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
5610: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
5620: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
5630: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
5640: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
5650: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
5660: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 28 75 6e  r->pageSize, (un
5670: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 29 70 50  signed char *)pP
5680: 61 67 65 2d 3e 70 44 61 74 61 29 3b 0a 7d 0a 73  age->pData);.}.s
5690: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
56a0: 5f 73 65 74 5f 70 61 67 65 68 61 73 68 28 50 67  _set_pagehash(Pg
56b0: 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 70  Hdr *pPage){.  p
56c0: 50 61 67 65 2d 3e 70 61 67 65 48 61 73 68 20 3d  Page->pageHash =
56d0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
56e0: 70 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pPage);.}../*.**
56f0: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
5700: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
5710: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
5720: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
5730: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
5740: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
5750: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
5760: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
5770: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
5780: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
5790: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
57a0: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
57b0: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
57c0: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
57d0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
57e0: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
57f0: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
5800: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
5810: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
5820: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
5830: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
5840: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
5850: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
5860: 65 0a 20 20 20 20 20 20 7c 7c 20 28 70 50 67 2d  e.      || (pPg-
5870: 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
5880: 54 59 29 20 7c 7c 20 70 50 67 2d 3e 70 61 67 65  TY) || pPg->page
5890: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
58a0: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
58b0: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70 61  #else.#define pa
58c0: 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c 59  ger_datahash(X,Y
58d0: 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61 67  )  0.#define pag
58e0: 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20 20  er_pagehash(X)  
58f0: 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  0.#define CHECK_
5900: 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 20 20  PAGE(x).#endif  
5910: 2f 2a 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  /* SQLITE_CHECK_
5920: 50 41 47 45 53 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  PAGES */../*.** 
5930: 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  When this is cal
5940: 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  led the journal 
5950: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20 70  file for pager p
5960: 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f 70  Pager must be op
5970: 65 6e 2e 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  en..** This func
5980: 74 69 6f 6e 20 61 74 74 65 6d 70 74 73 20 74 6f  tion attempts to
5990: 20 72 65 61 64 20 61 20 6d 61 73 74 65 72 20 6a   read a master j
59a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
59b0: 20 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 65 6e   from the .** en
59c0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e  d of the file an
59d0: 64 2c 20 69 66 20 73 75 63 63 65 73 73 66 75 6c  d, if successful
59e0: 2c 20 63 6f 70 69 65 73 20 69 74 20 69 6e 74 6f  , copies it into
59f0: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
5a00: 20 0a 2a 2a 20 62 79 20 74 68 65 20 63 61 6c 6c   .** by the call
5a10: 65 72 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  er. See comments
5a20: 20 61 62 6f 76 65 20 77 72 69 74 65 4d 61 73 74   above writeMast
5a30: 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20  erJournal() for 
5a40: 74 68 65 20 66 6f 72 6d 61 74 0a 2a 2a 20 75 73  the format.** us
5a50: 65 64 20 74 6f 20 73 74 6f 72 65 20 61 20 6d 61  ed to store a ma
5a60: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
5a70: 65 20 6e 61 6d 65 20 61 74 20 74 68 65 20 65 6e  e name at the en
5a80: 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  d of a journal f
5a90: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  ile..**.** zMast
5aa0: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
5ab0: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
5ac0: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
5ad0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
5ae0: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
5af0: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
5b00: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
5b10: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
5b20: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
5b30: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
5b40: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
5b50: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
5b60: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
5b70: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
5b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
5b90: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
5ba0: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
5bb0: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
5bc0: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
5bd0: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
5be0: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
5bf0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
5c00: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
5c10: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
5c20: 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
5c30: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5c40: 69 73 20 70 72 65 73 65 6e 74 20 61 74 20 74 68  is present at th
5c50: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75  e end of the jou
5c60: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2c 20 74 68  rnal.** file, th
5c70: 65 6e 20 69 74 20 69 73 20 63 6f 70 69 65 64 20  en it is copied 
5c80: 69 6e 74 6f 20 74 68 65 20 62 75 66 66 65 72 20  into the buffer 
5c90: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d  pointed to by zM
5ca0: 61 73 74 65 72 2e 20 41 0a 2a 2a 20 6e 75 6c 2d  aster. A.** nul-
5cb0: 74 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20  terminator byte 
5cc0: 69 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20 74  is appended to t
5cd0: 68 65 20 62 75 66 66 65 72 20 66 6f 6c 6c 6f 77  he buffer follow
5ce0: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 0a 2a  ing the master.*
5cf0: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  * journal file n
5d00: 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 74  ame..**.** If it
5d10: 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64 20 74   is determined t
5d20: 68 61 74 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  hat no master jo
5d30: 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
5d40: 69 73 20 70 72 65 73 65 6e 74 20 0a 2a 2a 20 7a  is present .** z
5d50: 4d 61 73 74 65 72 5b 30 5d 20 69 73 20 73 65 74  Master[0] is set
5d60: 20 74 6f 20 30 20 61 6e 64 20 53 51 4c 49 54 45   to 0 and SQLITE
5d70: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a  _OK returned..**
5d80: 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20  .** If an error 
5d90: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 72 65 61  occurs while rea
5da0: 64 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ding from the jo
5db0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 61 6e 20 53  urnal file, an S
5dc0: 51 4c 69 74 65 0a 2a 2a 20 65 72 72 6f 72 20 63  QLite.** error c
5dd0: 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
5de0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5df0: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
5e00: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
5e10: 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73  Jrnl, char *zMas
5e20: 74 65 72 2c 20 75 33 32 20 6e 4d 61 73 74 65 72  ter, u32 nMaster
5e30: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  ){.  int rc;    
5e40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5e50: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
5e60: 2f 0a 20 20 75 33 32 20 6c 65 6e 3b 20 20 20 20  /.  u32 len;    
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
5e80: 2a 20 4c 65 6e 67 74 68 20 69 6e 20 62 79 74 65  * Length in byte
5e90: 73 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  s of master jour
5ea0: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 36  nal name */.  i6
5eb0: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
5ec0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61           /* Tota
5ed0: 6c 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20  l size in bytes 
5ee0: 6f 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  of journal file 
5ef0: 70 4a 72 6e 6c 20 2a 2f 0a 20 20 75 33 32 20 63  pJrnl */.  u32 c
5f00: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
5f10: 20 20 20 20 20 20 2f 2a 20 4d 4a 20 63 68 65 63        /* MJ chec
5f20: 6b 73 75 6d 20 76 61 6c 75 65 20 72 65 61 64 20  ksum value read 
5f30: 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  from journal */.
5f40: 20 20 75 33 32 20 75 3b 20 20 20 20 20 20 20 20    u32 u;        
5f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
5f60: 55 6e 73 69 67 6e 65 64 20 6c 6f 6f 70 20 63 6f  Unsigned loop co
5f70: 75 6e 74 65 72 20 2a 2f 0a 20 20 75 6e 73 69 67  unter */.  unsig
5f80: 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b  ned char aMagic[
5f90: 38 5d 3b 20 20 20 2f 2a 20 41 20 62 75 66 66 65  8];   /* A buffe
5fa0: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
5fb0: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
5fc0: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
5fd0: 27 3b 0a 0a 20 20 69 66 28 20 53 51 4c 49 54 45  ';..  if( SQLITE
5fe0: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
5ff0: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72  e3OsFileSize(pJr
6000: 6e 6c 2c 20 26 73 7a 4a 29 29 0a 20 20 20 7c 7c  nl, &szJ)).   ||
6010: 20 73 7a 4a 3c 31 36 0a 20 20 20 7c 7c 20 53 51   szJ<16.   || SQ
6020: 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20 3d 20 72  LITE_OK!=(rc = r
6030: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
6040: 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29 29 0a   szJ-16, &len)).
6050: 20 20 20 7c 7c 20 6c 65 6e 3e 3d 6e 4d 61 73 74     || len>=nMast
6060: 65 72 20 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45  er .   || SQLITE
6070: 5f 4f 4b 21 3d 28 72 63 20 3d 20 72 65 61 64 33  _OK!=(rc = read3
6080: 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a  2bits(pJrnl, szJ
6090: 2d 31 32 2c 20 26 63 6b 73 75 6d 29 29 0a 20 20  -12, &cksum)).  
60a0: 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28   || SQLITE_OK!=(
60b0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
60c0: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
60d0: 2c 20 38 2c 20 73 7a 4a 2d 38 29 29 0a 20 20 20  , 8, szJ-8)).   
60e0: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
60f0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6100: 20 38 29 0a 20 20 20 7c 7c 20 53 51 4c 49 54 45   8).   || SQLITE
6110: 5f 4f 4b 21 3d 28 72 63 20 3d 20 73 71 6c 69 74  _OK!=(rc = sqlit
6120: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
6130: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 73 7a  zMaster, len, sz
6140: 4a 2d 31 36 2d 6c 65 6e 29 29 0a 20 20 29 7b 0a  J-16-len)).  ){.
6150: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
6160: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
6170: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
6180: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
6190: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
61a0: 20 20 66 6f 72 28 75 3d 30 3b 20 75 3c 6c 65 6e    for(u=0; u<len
61b0: 3b 20 75 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; u++){.    cksu
61c0: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 75 5d 3b  m -= zMaster[u];
61d0: 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d  .  }.  if( cksum
61e0: 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68   ){.    /* If th
61f0: 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e  e checksum doesn
6200: 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20  't add up, then 
6210: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74  one or more of t
6220: 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a  he disk sectors.
6230: 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e      ** containin
6240: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
6250: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73  rnal filename is
6260: 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73   corrupted. This
6270: 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65   means.    ** de
6280: 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61  finitely roll ba
6290: 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75  ck, so just retu
62a0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64  rn SQLITE_OK and
62b0: 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a   report a (nul).
62c0: 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f      ** master-jo
62d0: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a  urnal filename..
62e0: 20 20 20 20 2a 2f 0a 20 20 20 20 6c 65 6e 20 3d      */.    len =
62f0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65   0;.  }.  zMaste
6300: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  r[len] = '\0';. 
6310: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
6320: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
6330: 52 65 74 75 72 6e 20 74 68 65 20 6f 66 66 73 65  Return the offse
6340: 74 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  t of the sector 
6350: 62 6f 75 6e 64 61 72 79 20 61 74 20 6f 72 20 69  boundary at or i
6360: 6d 6d 65 64 69 61 74 65 6c 79 20 0a 2a 2a 20 66  mmediately .** f
6370: 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 76 61 6c  ollowing the val
6380: 75 65 20 69 6e 20 70 50 61 67 65 72 2d 3e 6a 6f  ue in pPager->jo
6390: 75 72 6e 61 6c 4f 66 66 2c 20 61 73 73 75 6d 69  urnalOff, assumi
63a0: 6e 67 20 61 20 73 65 63 74 6f 72 20 0a 2a 2a 20  ng a sector .** 
63b0: 73 69 7a 65 20 6f 66 20 70 50 61 67 65 72 2d 3e  size of pPager->
63c0: 73 65 63 74 6f 72 53 69 7a 65 20 62 79 74 65 73  sectorSize bytes
63d0: 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20  ..**.** i.e for 
63e0: 61 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66  a sector size of
63f0: 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 61   512:.**.**   Pa
6400: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 20  ger.journalOff  
6410: 20 20 20 20 20 20 20 20 52 65 74 75 72 6e 20 76          Return v
6420: 61 6c 75 65 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d  alue.**   ------
6430: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6440: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6450: 2d 0a 2a 2a 20 20 20 30 20 20 20 20 20 20 20 20  -.**   0        
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 20 30 0a 2a 2a 20 20 20 35 31 32 20 20 20 20 20   0.**   512     
6480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6490: 20 20 35 31 32 0a 2a 2a 20 20 20 31 30 30 20 20    512.**   100  
64a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64b0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 20 20 32 30       512.**   20
64c0: 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20  00              
64d0: 20 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20          2048.** 
64e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 36 34 20 6a  .*/.static i64 j
64f0: 6f 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28  ournalHdrOffset(
6500: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6510: 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30    i64 offset = 0
6520: 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50 61 67  ;.  i64 c = pPag
6530: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
6540: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f    if( c ){.    o
6550: 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a  ffset = ((c-1)/J
6560: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
6570: 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55  ager) + 1) * JOU
6580: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
6590: 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  er);.  }.  asser
65a0: 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41  t( offset%JOURNA
65b0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
65c0: 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ==0 );.  assert(
65d0: 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20   offset>=c );.  
65e0: 61 73 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d  assert( (offset-
65f0: 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  c)<JOURNAL_HDR_S
6600: 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 72  Z(pPager) );.  r
6610: 65 74 75 72 6e 20 6f 66 66 73 65 74 3b 0a 7d 0a  eturn offset;.}.
6620: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
6630: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
6640: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 66  open when this f
6650: 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
6660: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75  d..**.** This fu
6670: 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
6680: 70 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  p if the journal
6690: 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62 65   file has not be
66a0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 0a 2a 2a  en written to.**
66b0: 20 77 69 74 68 69 6e 20 74 68 65 20 63 75 72 72   within the curr
66c0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
66d0: 28 69 2e 65 2e 20 69 66 20 50 61 67 65 72 2e 6a  (i.e. if Pager.j
66e0: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 29 2e 0a 2a  ournalOff==0)..*
66f0: 2a 0a 2a 2a 20 49 66 20 64 6f 54 72 75 6e 63 61  *.** If doTrunca
6700: 74 65 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 20 6f  te is non-zero o
6710: 72 20 74 68 65 20 50 61 67 65 72 2e 6a 6f 75 72  r the Pager.jour
6720: 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 76 61 72  nalSizeLimit var
6730: 69 61 62 6c 65 20 69 73 0a 2a 2a 20 73 65 74 20  iable is.** set 
6740: 74 6f 20 30 2c 20 74 68 65 6e 20 74 72 75 6e 63  to 0, then trunc
6750: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
6760: 66 69 6c 65 20 74 6f 20 7a 65 72 6f 20 62 79 74  file to zero byt
6770: 65 73 20 69 6e 20 73 69 7a 65 2e 20 4f 74 68 65  es in size. Othe
6780: 72 77 69 73 65 2c 0a 2a 2a 20 7a 65 72 6f 20 74  rwise,.** zero t
6790: 68 65 20 32 38 2d 62 79 74 65 20 68 65 61 64 65  he 28-byte heade
67a0: 72 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  r at the start o
67b0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
67c0: 6c 65 2e 20 49 6e 20 65 69 74 68 65 72 20 63 61  le. In either ca
67d0: 73 65 2c 20 0a 2a 2a 20 69 66 20 74 68 65 20 70  se, .** if the p
67e0: 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 6e  ager is not in n
67f0: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 73 79 6e  o-sync mode, syn
6800: 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
6810: 6c 65 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 0a  le immediately .
6820: 2a 2a 20 61 66 74 65 72 20 77 72 69 74 69 6e 67  ** after writing
6830: 20 6f 72 20 74 72 75 6e 63 61 74 69 6e 67 20 69   or truncating i
6840: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 50 61 67 65  t..**.** If Page
6850: 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  r.journalSizeLim
6860: 69 74 20 69 73 20 73 65 74 20 74 6f 20 61 20 70  it is set to a p
6870: 6f 73 69 74 69 76 65 2c 20 6e 6f 6e 2d 7a 65 72  ositive, non-zer
6880: 6f 20 76 61 6c 75 65 2c 20 61 6e 64 0a 2a 2a 20  o value, and.** 
6890: 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 65 20 74 72  following the tr
68a0: 75 6e 63 61 74 69 6f 6e 20 6f 72 20 7a 65 72 6f  uncation or zero
68b0: 69 6e 67 20 64 65 73 63 72 69 62 65 64 20 61 62  ing described ab
68c0: 6f 76 65 20 74 68 65 20 73 69 7a 65 20 6f 66 20  ove the size of 
68d0: 74 68 65 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  the .** journal 
68e0: 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20 69 73  file in bytes is
68f0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 69   larger than thi
6900: 73 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 72  s value, then tr
6910: 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20 6a 6f  uncate the.** jo
6920: 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 50 61  urnal file to Pa
6930: 67 65 72 2e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c  ger.journalSizeL
6940: 69 6d 69 74 20 62 79 74 65 73 2e 20 54 68 65 20  imit bytes. The 
6950: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
6960: 73 0a 2a 2a 20 6e 6f 74 20 6e 65 65 64 20 74 6f  s.** not need to
6970: 20 62 65 20 73 79 6e 63 65 64 20 66 6f 6c 6c 6f   be synced follo
6980: 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61 74  wing this operat
6990: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  ion..**.** If an
69a0: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
69b0: 2c 20 61 62 61 6e 64 6f 6e 20 70 72 6f 63 65 73  , abandon proces
69c0: 73 69 6e 67 20 61 6e 64 20 72 65 74 75 72 6e 20  sing and return 
69d0: 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f 64  the IO error cod
69e0: 65 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  e..** Otherwise,
69f0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6a00: 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  K..*/.static int
6a10: 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28   zeroJournalHdr(
6a20: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
6a30: 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b 0a  nt doTruncate){.
6a40: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
6a50: 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a70: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
6a80: 64 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  de */.  assert( 
6a90: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
6aa0: 66 64 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61  fd) );.  if( pPa
6ab0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
6ac0: 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 69 36 34  ){.    const i64
6ad0: 20 69 4c 69 6d 69 74 20 3d 20 70 50 61 67 65 72   iLimit = pPager
6ae0: 2d 3e 6a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d  ->journalSizeLim
6af0: 69 74 3b 20 20 20 20 2f 2a 20 4c 6f 63 61 6c 20  it;    /* Local 
6b00: 63 61 63 68 65 20 6f 66 20 6a 73 6c 20 2a 2f 0a  cache of jsl */.
6b10: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
6b20: 5a 45 52 4f 48 44 52 20 25 70 5c 6e 22 2c 20 70  ZEROHDR %p\n", p
6b30: 50 61 67 65 72 29 29 0a 20 20 20 20 69 66 28 20  Pager)).    if( 
6b40: 64 6f 54 72 75 6e 63 61 74 65 20 7c 7c 20 69 4c  doTruncate || iL
6b50: 69 6d 69 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  imit==0 ){.     
6b60: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54   rc = sqlite3OsT
6b70: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
6b80: 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c  jfd, 0);.    }el
6b90: 73 65 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  se{.      static
6ba0: 20 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f   const char zero
6bb0: 48 64 72 5b 32 38 5d 20 3d 20 7b 30 7d 3b 0a 20  Hdr[28] = {0};. 
6bc0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
6bd0: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
6be0: 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72 2c 20 73  >jfd, zeroHdr, s
6bf0: 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72 29 2c 20  izeof(zeroHdr), 
6c00: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  0);.    }.    if
6c10: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
6c20: 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  && !pPager->noSy
6c30: 6e 63 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  nc ){.      rc =
6c40: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
6c50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
6c60: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
6c70: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
6c80: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ags);.    }..   
6c90: 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
6ca0: 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
6cb0: 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64 20 62  n is committed b
6cc0: 75 74 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  ut the write loc
6cd0: 6b 20 0a 20 20 20 20 2a 2a 20 69 73 20 73 74 69  k .    ** is sti
6ce0: 6c 6c 20 68 65 6c 64 20 6f 6e 20 74 68 65 20 66  ll held on the f
6cf0: 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
6d00: 20 61 20 73 69 7a 65 20 6c 69 6d 69 74 20 63 6f   a size limit co
6d10: 6e 66 69 67 75 72 65 64 20 66 6f 72 20 0a 20 20  nfigured for .  
6d20: 20 20 2a 2a 20 74 68 65 20 70 65 72 73 69 73 74    ** the persist
6d30: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
6d40: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6d50: 20 63 75 72 72 65 6e 74 6c 79 20 63 6f 6e 73 75   currently consu
6d60: 6d 65 73 20 6d 6f 72 65 0a 20 20 20 20 2a 2a 20  mes more.    ** 
6d70: 73 70 61 63 65 20 74 68 61 6e 20 74 68 61 74 20  space than that 
6d80: 6c 69 6d 69 74 20 61 6c 6c 6f 77 73 20 66 6f 72  limit allows for
6d90: 2c 20 74 72 75 6e 63 61 74 65 20 69 74 20 6e 6f  , truncate it no
6da0: 77 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  w. There is no n
6db0: 65 65 64 0a 20 20 20 20 2a 2a 20 74 6f 20 73 79  eed.    ** to sy
6dc0: 6e 63 20 74 68 65 20 66 69 6c 65 20 66 6f 6c 6c  nc the file foll
6dd0: 6f 77 69 6e 67 20 74 68 69 73 20 6f 70 65 72 61  owing this opera
6de0: 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
6df0: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
6e00: 4f 4b 20 26 26 20 69 4c 69 6d 69 74 3e 30 20 29  OK && iLimit>0 )
6e10: 7b 0a 20 20 20 20 20 20 69 36 34 20 73 7a 3b 0a  {.      i64 sz;.
6e20: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
6e30: 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
6e40: 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 29 3b 0a  ger->jfd, &sz);.
6e50: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
6e60: 4c 49 54 45 5f 4f 4b 20 26 26 20 73 7a 3e 69 4c  LITE_OK && sz>iL
6e70: 69 6d 69 74 20 29 7b 0a 20 20 20 20 20 20 20 20  imit ){.        
6e80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
6e90: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a  uncate(pPager->j
6ea0: 66 64 2c 20 69 4c 69 6d 69 74 29 3b 0a 20 20 20  fd, iLimit);.   
6eb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
6ec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
6ed0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
6ee0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
6ef0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
6f00: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
6f10: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
6f20: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
6f30: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
6f40: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
6f50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
6f60: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
6f70: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
6f80: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
6f90: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
6fa0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
6fb0: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
6fc0: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
6fd0: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
6fe0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
6ff0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
7000: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
7010: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
7020: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
7030: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
7040: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
7050: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
7060: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
7070: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
7080: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
7090: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
70a0: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
70b0: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
70c0: 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62 79  urnal..** - 4 by
70d0: 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70 61  tes: Database pa
70e0: 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a 20  ge size..** .** 
70f0: 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55  Followed by (JOU
7100: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 38  RNAL_HDR_SZ - 28
7110: 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65  ) bytes of unuse
7120: 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74  d space..*/.stat
7130: 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72  ic int writeJour
7140: 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50  nalHdr(Pager *pP
7150: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
7160: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
7170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7180: 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
7190: 20 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d   char *zHeader =
71a0: 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
71b0: 63 65 3b 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72  ce;  /* Temporar
71c0: 79 20 73 70 61 63 65 20 75 73 65 64 20 74 6f 20  y space used to 
71d0: 62 75 69 6c 64 20 68 65 61 64 65 72 20 2a 2f 0a  build header */.
71e0: 20 20 75 33 32 20 6e 48 65 61 64 65 72 20 3d 20    u32 nHeader = 
71f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7200: 3b 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66  ;     /* Size of
7210: 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65 64 20   buffer pointed 
7220: 74 6f 20 62 79 20 7a 48 65 61 64 65 72 20 2a 2f  to by zHeader */
7230: 0a 20 20 75 33 32 20 6e 57 72 69 74 65 3b 20 20  .  u32 nWrite;  
7240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7250: 20 20 20 20 20 20 20 2f 2a 20 42 79 74 65 73 20         /* Bytes 
7260: 6f 66 20 68 65 61 64 65 72 20 73 65 63 74 6f 72  of header sector
7270: 20 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 69 6e   written */.  in
7280: 74 20 69 69 3b 20 20 20 20 20 20 20 20 20 20 20  t ii;           
7290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
72a0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
72b0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
72c0: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
72d0: 66 64 29 20 29 3b 20 20 20 20 20 20 2f 2a 20 4a  fd) );      /* J
72e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74  ournal file must
72f0: 20 62 65 20 6f 70 65 6e 2e 20 2a 2f 0a 0a 20 20   be open. */..  
7300: 69 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52  if( nHeader>JOUR
7310: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
7320: 72 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65  r) ){.    nHeade
7330: 72 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  r = JOURNAL_HDR_
7340: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  SZ(pPager);.  }.
7350: 0a 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61  .  /* If there a
7360: 72 65 20 61 63 74 69 76 65 20 73 61 76 65 70 6f  re active savepo
7370: 69 6e 74 73 20 61 6e 64 20 61 6e 79 20 6f 66 20  ints and any of 
7380: 74 68 65 6d 20 77 65 72 65 20 63 72 65 61 74 65  them were create
7390: 64 20 0a 20 20 2a 2a 20 73 69 6e 63 65 20 74 68  d .  ** since th
73a0: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 6a 6f  e most recent jo
73b0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 61 73  urnal header was
73c0: 20 77 72 69 74 74 65 6e 2c 20 75 70 64 61 74 65   written, update
73d0: 20 74 68 65 20 0a 20 20 2a 2a 20 50 61 67 65 72   the .  ** Pager
73e0: 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72 4f 66  Savepoint.iHdrOf
73f0: 66 73 65 74 20 66 69 65 6c 64 73 20 6e 6f 77 2e  fset fields now.
7400: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 69 3d 30  .  */.  for(ii=0
7410: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
7420: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
7430: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
7440: 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69  aSavepoint[ii].i
7450: 48 64 72 4f 66 66 73 65 74 3d 3d 30 20 29 7b 0a  HdrOffset==0 ){.
7460: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 53        pPager->aS
7470: 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 69 48 64  avepoint[ii].iHd
7480: 72 4f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72  rOffset = pPager
7490: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
74a0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65    }.  }..  pPage
74b0: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
74c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
74d0: 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72 4f  ff = journalHdrO
74e0: 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  ffset(pPager);. 
74f0: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
7500: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
7510: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
7520: 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20  agic));..  /* . 
7530: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
7540: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
7550: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
7560: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
7570: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
7580: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
7590: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
75a0: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
75b0: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
75c0: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
75d0: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
75e0: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
75f0: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
7600: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
7610: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
7620: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
7630: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
7640: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
7650: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
7660: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
7670: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
7680: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
7690: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
76a0: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
76b0: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
76c0: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
76d0: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
76e0: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
76f0: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
7700: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
7710: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
7720: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
7730: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
7740: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
7750: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
7760: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
7770: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  a failure occure
7780: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
7790: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
77a0: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
77b0: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
77c0: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
77d0: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
77e0: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
77f0: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
7800: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
7810: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
7820: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
7830: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
7840: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
7850: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
7860: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
7870: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
7880: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
7890: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
78a0: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
78b0: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
78c0: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
78d0: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
78e0: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
78f0: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
7900: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
7910: 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
7920: 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20 7c  en(pPager->fd) |
7930: 7c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  | pPager->noSync
7940: 20 29 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65   );.  if( (pPage
7950: 72 2d 3e 6e 6f 53 79 6e 63 29 20 7c 7c 20 28 70  r->noSync) || (p
7960: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
7970: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
7980: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 29 0a 20 20  LMODE_MEMORY).  
7990: 20 7c 7c 20 28 73 71 6c 69 74 65 33 4f 73 44 65   || (sqlite3OsDe
79a0: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
79b0: 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
79c0: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
79d0: 45 5f 41 50 50 45 4e 44 29 20 0a 20 20 29 7b 0a  E_APPEND) .  ){.
79e0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
79f0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7a00: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
7a10: 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 7d 65  xffffffff);.  }e
7a20: 6c 73 65 7b 0a 20 20 20 20 70 75 74 33 32 62 69  lse{.    put32bi
7a30: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7a40: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7a50: 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f  )], 0);.  }..  /
7a60: 2a 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65  * The random che
7a70: 63 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69  ck-hash initiali
7a80: 73 65 72 20 2a 2f 20 0a 20 20 73 71 6c 69 74 65  ser */ .  sqlite
7a90: 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
7aa0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
7ab0: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
7ac0: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 70  >cksumInit);.  p
7ad0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
7ae0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
7af0: 6c 4d 61 67 69 63 29 2b 34 5d 2c 20 70 50 61 67  lMagic)+4], pPag
7b00: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a  er->cksumInit);.
7b10: 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c    /* The initial
7b20: 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a   database size *
7b30: 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  /.  put32bits(&z
7b40: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
7b50: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 38 5d 2c  ournalMagic)+8],
7b60: 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69 67 53   pPager->dbOrigS
7b70: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
7b80: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
7b90: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
7ba0: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
7bb0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
7bc0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7bd0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
7be0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 0a 20 20 2f  ectorSize);..  /
7bf0: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
7c00: 2a 2f 0a 20 20 70 75 74 33 32 62 69 74 73 28 26  */.  put32bits(&
7c10: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
7c20: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36  JournalMagic)+16
7c30: 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ], pPager->pageS
7c40: 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74  ize);..  /* Init
7c50: 69 61 6c 69 7a 69 6e 67 20 74 68 65 20 74 61 69  ializing the tai
7c60: 6c 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20  l of the buffer 
7c70: 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  is not necessary
7c80: 2e 20 20 45 76 65 72 79 74 68 69 6e 67 0a 20 20  .  Everything.  
7c90: 2a 2a 20 77 6f 72 6b 73 20 66 69 6e 64 20 69 66  ** works find if
7ca0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
7cb0: 65 6d 73 65 74 28 29 20 69 73 20 6f 6d 69 74 74  emset() is omitt
7cc0: 65 64 2e 20 20 42 75 74 20 69 6e 69 74 69 61 6c  ed.  But initial
7cd0: 69 7a 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  izing.  ** the m
7ce0: 65 6d 6f 72 79 20 70 72 65 76 65 6e 74 73 20 76  emory prevents v
7cf0: 61 6c 67 72 69 6e 64 20 66 72 6f 6d 20 63 6f 6d  algrind from com
7d00: 70 6c 61 69 6e 69 6e 67 2c 20 73 6f 20 77 65 20  plaining, so we 
7d10: 61 72 65 20 77 69 6c 6c 69 6e 67 20 74 6f 0a 20  are willing to. 
7d20: 20 2a 2a 20 74 61 6b 65 20 74 68 65 20 70 65 72   ** take the per
7d30: 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 0a 20 20  formance hit..  
7d40: 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 7a 48 65  */.  memset(&zHe
7d50: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7d60: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 5d 2c 20  rnalMagic)+20], 
7d70: 30 2c 0a 20 20 20 20 20 20 20 20 20 6e 48 65 61  0,.         nHea
7d80: 64 65 72 2d 28 73 69 7a 65 6f 66 28 61 4a 6f 75  der-(sizeof(aJou
7d90: 72 6e 61 6c 4d 61 67 69 63 29 2b 32 30 29 29 3b  rnalMagic)+20));
7da0: 0a 0a 20 20 2f 2a 20 49 6e 20 74 68 65 6f 72 79  ..  /* In theory
7db0: 2c 20 69 74 20 69 73 20 6f 6e 6c 79 20 6e 65 63  , it is only nec
7dc0: 65 73 73 61 72 79 20 74 6f 20 77 72 69 74 65 20  essary to write 
7dd0: 74 68 65 20 32 38 20 62 79 74 65 73 20 74 68 61  the 28 bytes tha
7de0: 74 20 74 68 65 20 0a 20 20 2a 2a 20 6a 6f 75 72  t the .  ** jour
7df0: 6e 61 6c 20 68 65 61 64 65 72 20 63 6f 6e 73 75  nal header consu
7e00: 6d 65 73 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  mes to the journ
7e10: 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 20 54 68  al file here. Th
7e20: 65 6e 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  en increment the
7e30: 20 0a 20 20 2a 2a 20 50 61 67 65 72 2e 6a 6f 75   .  ** Pager.jou
7e40: 72 6e 61 6c 4f 66 66 20 76 61 72 69 61 62 6c 65  rnalOff variable
7e50: 20 62 79 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   by JOURNAL_HDR_
7e60: 53 5a 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e  SZ so that the n
7e70: 65 78 74 20 0a 20 20 2a 2a 20 72 65 63 6f 72 64  ext .  ** record
7e80: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74   is written to t
7e90: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 65 63  he following sec
7ea0: 74 6f 72 20 28 6c 65 61 76 69 6e 67 20 61 20 67  tor (leaving a g
7eb0: 61 70 20 69 6e 20 74 68 65 20 66 69 6c 65 0a 20  ap in the file. 
7ec0: 20 2a 2a 20 74 68 61 74 20 77 69 6c 6c 20 62 65   ** that will be
7ed0: 20 69 6d 70 6c 69 63 69 74 6c 79 20 66 69 6c 6c   implicitly fill
7ee0: 65 64 20 69 6e 20 62 79 20 74 68 65 20 4f 53 29  ed in by the OS)
7ef0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 48 6f 77 65  ..  **.  ** Howe
7f00: 76 65 72 20 69 74 20 68 61 73 20 62 65 65 6e 20  ver it has been 
7f10: 64 69 73 63 6f 76 65 72 65 64 20 74 68 61 74 20  discovered that 
7f20: 6f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 20  on some systems 
7f30: 74 68 69 73 20 70 61 74 74 65 72 6e 20 63 61 6e  this pattern can
7f40: 20 0a 20 20 2a 2a 20 62 65 20 73 69 67 6e 69 66   .  ** be signif
7f50: 69 63 61 6e 74 6c 79 20 73 6c 6f 77 65 72 20 74  icantly slower t
7f60: 68 61 6e 20 63 6f 6e 74 69 67 75 6f 75 73 6c 79  han contiguously
7f70: 20 77 72 69 74 69 6e 67 20 64 61 74 61 20 74 6f   writing data to
7f80: 20 74 68 65 20 66 69 6c 65 2c 0a 20 20 2a 2a 20   the file,.  ** 
7f90: 65 76 65 6e 20 69 66 20 74 68 61 74 20 6d 65 61  even if that mea
7fa0: 6e 73 20 65 78 70 6c 69 63 69 74 6c 79 20 77 72  ns explicitly wr
7fb0: 69 74 69 6e 67 20 64 61 74 61 20 74 6f 20 74 68  iting data to th
7fc0: 65 20 62 6c 6f 63 6b 20 6f 66 20 0a 20 20 2a 2a  e block of .  **
7fd0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
7fe0: 20 2d 20 32 38 29 20 62 79 74 65 73 20 74 68 61   - 28) bytes tha
7ff0: 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 75 73  t will not be us
8000: 65 64 2e 20 53 6f 20 74 68 61 74 20 69 73 20 77  ed. So that is w
8010: 68 61 74 0a 20 20 2a 2a 20 69 73 20 64 6f 6e 65  hat.  ** is done
8020: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 68 65  . .  **.  ** The
8030: 20 6c 6f 6f 70 20 69 73 20 72 65 71 75 69 72 65   loop is require
8040: 64 20 68 65 72 65 20 69 6e 20 63 61 73 65 20 74  d here in case t
8050: 68 65 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  he sector-size i
8060: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68  s larger than th
8070: 65 20 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  e .  ** database
8080: 20 70 61 67 65 20 73 69 7a 65 2e 20 53 69 6e 63   page size. Sinc
8090: 65 20 74 68 65 20 7a 48 65 61 64 65 72 20 62 75  e the zHeader bu
80a0: 66 66 65 72 20 69 73 20 6f 6e 6c 79 20 50 61 67  ffer is only Pag
80b0: 65 72 2e 70 61 67 65 53 69 7a 65 0a 20 20 2a 2a  er.pageSize.  **
80c0: 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c 20   bytes in size, 
80d0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 63 61  more than one ca
80e0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 57  ll to sqlite3OsW
80f0: 72 69 74 65 28 29 20 6d 61 79 20 62 65 20 72 65  rite() may be re
8100: 71 75 69 72 65 64 0a 20 20 2a 2a 20 74 6f 20 70  quired.  ** to p
8110: 6f 70 75 6c 61 74 65 20 74 68 65 20 65 6e 74 69  opulate the enti
8120: 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  re journal heade
8130: 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 20 0a  r sector..  */ .
8140: 20 20 66 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20    for(nWrite=0; 
8150: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e  rc==SQLITE_OK&&n
8160: 57 72 69 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44  Write<JOURNAL_HD
8170: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 20 6e 57  R_SZ(pPager); nW
8180: 72 69 74 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a  rite+=nHeader){.
8190: 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48      IOTRACE(("JH
81a0: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
81b0: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
81c0: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48  ->journalHdr, nH
81d0: 65 61 64 65 72 29 29 0a 20 20 20 20 72 63 20 3d  eader)).    rc =
81e0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
81f0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65  pPager->jfd, zHe
8200: 61 64 65 72 2c 20 6e 48 65 61 64 65 72 2c 20 70  ader, nHeader, p
8210: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8220: 66 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  f);.    pPager->
8230: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48  journalOff += nH
8240: 65 61 64 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65  eader;.  }..  re
8250: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
8260: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
8270: 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20  le must be open 
8280: 77 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c  when this is cal
8290: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68  led. A journal h
82a0: 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a  eader file.** (J
82b0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
82c0: 74 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f  tes) is read fro
82d0: 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  m the current lo
82e0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f  cation in the jo
82f0: 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 54  urnal.** file. T
8300: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
8310: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
8320: 61 6c 20 66 69 6c 65 20 69 73 20 67 69 76 65 6e  al file is given
8330: 20 62 79 0a 2a 2a 20 70 50 61 67 65 72 2d 3e 6a   by.** pPager->j
8340: 6f 75 72 6e 61 6c 4f 66 66 2e 20 53 65 65 20 63  ournalOff. See c
8350: 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75  omments above fu
8360: 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72  nction writeJour
8370: 6e 61 6c 48 64 72 28 29 20 66 6f 72 0a 2a 2a 20  nalHdr() for.** 
8380: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
8390: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
83a0: 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a  der format..**.*
83b0: 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72 20  * If the header 
83c0: 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73 66  is read successf
83d0: 75 6c 6c 79 2c 20 2a 70 4e 52 65 63 20 69 73 20  ully, *pNRec is 
83e0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
83f0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
8400: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
8410: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
8420: 70 44 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  pDbSize is set t
8430: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
8440: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
8450: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
8460: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
8470: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
8480: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
8490: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
84a0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
84b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
84c0: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
84d0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
84e0: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
84f0: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
8500: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
8510: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
8520: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
8530: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
8540: 6e 64 20 2a 70 4e 52 65 63 20 61 6e 64 20 2a 50  nd *pNRec and *P
8550: 44 62 53 69 7a 65 20 61 72 65 20 75 6e 64 65 66  DbSize are undef
8560: 69 6e 65 64 2e 20 20 49 66 20 4a 4f 55 52 4e 41  ined.  If JOURNA
8570: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
8580: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
8590: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
85a0: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
85b0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
85c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
85d0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
85e0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
85f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
8600: 2a 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 2a  * Pager object *
8610: 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53  /.  i64 journalS
8620: 69 7a 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ize,            
8630: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
8640: 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
8650: 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20  e in bytes */.  
8660: 75 33 32 20 2a 70 4e 52 65 63 2c 20 20 20 20 20  u32 *pNRec,     
8670: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8680: 4f 55 54 3a 20 56 61 6c 75 65 20 72 65 61 64 20  OUT: Value read 
8690: 66 72 6f 6d 20 74 68 65 20 6e 52 65 63 20 66 69  from the nRec fi
86a0: 65 6c 64 20 2a 2f 0a 20 20 75 33 32 20 2a 70 44  eld */.  u32 *pD
86b0: 62 53 69 7a 65 20 20 20 20 20 20 20 20 20 20 20  bSize           
86c0: 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a 20 56 61        /* OUT: Va
86d0: 6c 75 65 20 6f 66 20 6f 72 69 67 69 6e 61 6c 20  lue of original 
86e0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 66 69  database size fi
86f0: 65 6c 64 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  eld */.){.  int 
8700: 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
8710: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75           /* Retu
8720: 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 75 6e 73  rn code */.  uns
8730: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
8740: 63 5b 38 5d 3b 20 20 20 20 20 2f 2a 20 41 20 62  c[8];     /* A b
8750: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
8760: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
8770: 2f 0a 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b  /.  i64 iHdrOff;
8780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8790: 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20 6a 6f   /* Offset of jo
87a0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 62 65 69  urnal header bei
87b0: 6e 67 20 72 65 61 64 20 2a 2f 0a 0a 20 20 61 73  ng read */..  as
87c0: 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50 61  sert( isOpen(pPa
87d0: 67 65 72 2d 3e 6a 66 64 29 20 29 3b 20 20 20 20  ger->jfd) );    
87e0: 20 20 2f 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c    /* Journal fil
87f0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 20  e must be open. 
8800: 2a 2f 0a 0a 20 20 2f 2a 20 41 64 76 61 6e 63 65  */..  /* Advance
8810: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
8820: 66 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f  f to the start o
8830: 66 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  f the next secto
8840: 72 2e 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 6a  r. If the.  ** j
8850: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 74  ournal file is t
8860: 6f 6f 20 73 6d 61 6c 6c 20 66 6f 72 20 74 68 65  oo small for the
8870: 72 65 20 74 6f 20 62 65 20 61 20 68 65 61 64 65  re to be a heade
8880: 72 20 73 74 6f 72 65 64 20 61 74 20 74 68 69 73  r stored at this
8890: 0a 20 20 2a 2a 20 70 6f 69 6e 74 2c 20 72 65 74  .  ** point, ret
88a0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 2e  urn SQLITE_DONE.
88b0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
88c0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6a 6f 75  journalOff = jou
88d0: 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70 50  rnalHdrOffset(pP
88e0: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
88f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b  ger->journalOff+
8900: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
8910: 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c  Pager) > journal
8920: 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75  Size ){.    retu
8930: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
8940: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
8950: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8960: 66 66 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 69  ff;..  /* Read i
8970: 6e 20 74 68 65 20 66 69 72 73 74 20 38 20 62 79  n the first 8 by
8980: 74 65 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  tes of the journ
8990: 61 6c 20 68 65 61 64 65 72 2e 20 49 66 20 74 68  al header. If th
89a0: 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 0a  ey do not match.
89b0: 20 20 2a 2a 20 74 68 65 20 20 6d 61 67 69 63 20    ** the  magic 
89c0: 73 74 72 69 6e 67 20 66 6f 75 6e 64 20 61 74 20  string found at 
89d0: 74 68 65 20 73 74 61 72 74 20 6f 66 20 65 61 63  the start of eac
89e0: 68 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  h journal header
89f0: 2c 20 72 65 74 75 72 6e 0a 20 20 2a 2a 20 53 51  , return.  ** SQ
8a00: 4c 49 54 45 5f 44 4f 4e 45 2e 20 49 66 20 61 6e  LITE_DONE. If an
8a10: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
8a20: 2c 20 72 65 74 75 72 6e 20 61 6e 20 65 72 72 6f  , return an erro
8a30: 72 20 63 6f 64 65 2e 20 4f 74 68 65 72 77 69 73  r code. Otherwis
8a40: 65 2c 0a 20 20 2a 2a 20 70 72 6f 63 65 65 64 2e  e,.  ** proceed.
8a50: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
8a60: 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65  ite3OsRead(pPage
8a70: 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20  r->jfd, aMagic, 
8a80: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c 20  sizeof(aMagic), 
8a90: 69 48 64 72 4f 66 66 29 3b 0a 20 20 69 66 28 20  iHdrOff);.  if( 
8aa0: 72 63 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  rc ){.    return
8ab0: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d   rc;.  }.  if( m
8ac0: 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a  emcmp(aMagic, aJ
8ad0: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
8ae0: 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20  eof(aMagic))!=0 
8af0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8b00: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
8b10: 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 66 69    /* Read the fi
8b20: 72 73 74 20 74 68 72 65 65 20 33 32 2d 62 69 74  rst three 32-bit
8b30: 20 66 69 65 6c 64 73 20 6f 66 20 74 68 65 20 6a   fields of the j
8b40: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 3a 20 54  ournal header: T
8b50: 68 65 20 6e 52 65 63 0a 20 20 2a 2a 20 66 69 65  he nRec.  ** fie
8b60: 6c 64 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ld, the checksum
8b70: 2d 69 6e 69 74 69 61 6c 69 7a 65 72 20 61 6e 64  -initializer and
8b80: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
8b90: 7a 65 20 61 74 20 74 68 65 20 73 74 61 72 74 0a  ze at the start.
8ba0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 74 72 61 6e    ** of the tran
8bb0: 73 61 63 74 69 6f 6e 2e 20 52 65 74 75 72 6e 20  saction. Return 
8bc0: 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
8bd0: 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
8be0: 72 6f 6e 67 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rong..  */.  if(
8bf0: 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72 63 20   SQLITE_OK!=(rc 
8c00: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
8c10: 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66  ger->jfd, iHdrOf
8c20: 66 2b 38 2c 20 70 4e 52 65 63 29 29 0a 20 20 20  f+8, pNRec)).   
8c30: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8c40: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8c50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8c60: 4f 66 66 2b 31 32 2c 20 26 70 50 61 67 65 72 2d  Off+12, &pPager-
8c70: 3e 63 6b 73 75 6d 49 6e 69 74 29 29 0a 20 20 20  >cksumInit)).   
8c80: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8c90: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8ca0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8cb0: 4f 66 66 2b 31 36 2c 20 70 44 62 53 69 7a 65 29  Off+16, pDbSize)
8cc0: 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
8cd0: 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  n rc;.  }..  if(
8ce0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
8cf0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 75 33  Off==0 ){.    u3
8d00: 32 20 69 50 61 67 65 53 69 7a 65 3b 20 20 20 20  2 iPageSize;    
8d10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
8d20: 67 65 2d 73 69 7a 65 20 66 69 65 6c 64 20 6f 66  ge-size field of
8d30: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
8d40: 2a 2f 0a 20 20 20 20 75 33 32 20 69 53 65 63 74  */.    u32 iSect
8d50: 6f 72 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  orSize;         
8d60: 20 20 20 20 2f 2a 20 53 65 63 74 6f 72 2d 73 69      /* Sector-si
8d70: 7a 65 20 66 69 65 6c 64 20 6f 66 20 6a 6f 75 72  ze field of jour
8d80: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
8d90: 20 20 75 31 36 20 69 50 61 67 65 53 69 7a 65 31    u16 iPageSize1
8da0: 36 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  6;             /
8db0: 2a 20 43 6f 70 79 20 6f 66 20 69 50 61 67 65 53  * Copy of iPageS
8dc0: 69 7a 65 20 69 6e 20 31 36 2d 62 69 74 20 76 61  ize in 16-bit va
8dd0: 72 69 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 2f  riable */..    /
8de0: 2a 20 52 65 61 64 20 74 68 65 20 70 61 67 65 2d  * Read the page-
8df0: 73 69 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d  size and sector-
8e00: 73 69 7a 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  size journal hea
8e10: 64 65 72 20 66 69 65 6c 64 73 2e 20 2a 2f 0a 20  der fields. */. 
8e20: 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 4f 4b     if( SQLITE_OK
8e30: 21 3d 28 72 63 20 3d 20 72 65 61 64 33 32 62 69  !=(rc = read32bi
8e40: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
8e50: 69 48 64 72 4f 66 66 2b 32 30 2c 20 26 69 53 65  iHdrOff+20, &iSe
8e60: 63 74 6f 72 53 69 7a 65 29 29 0a 20 20 20 20 20  ctorSize)).     
8e70: 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 28 72  || SQLITE_OK!=(r
8e80: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
8e90: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72  Pager->jfd, iHdr
8ea0: 4f 66 66 2b 32 34 2c 20 26 69 50 61 67 65 53 69  Off+24, &iPageSi
8eb0: 7a 65 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  ze)).    ){.    
8ec0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
8ed0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   }..    /* Check
8ee0: 20 74 68 61 74 20 74 68 65 20 76 61 6c 75 65 73   that the values
8ef0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
8f00: 61 67 65 2d 73 69 7a 65 20 61 6e 64 20 73 65 63  age-size and sec
8f10: 74 6f 72 2d 73 69 7a 65 20 66 69 65 6c 64 73 0a  tor-size fields.
8f20: 20 20 20 20 2a 2a 20 61 72 65 20 77 69 74 68 69      ** are withi
8f30: 6e 20 72 61 6e 67 65 2e 20 54 6f 20 62 65 20 27  n range. To be '
8f40: 69 6e 20 72 61 6e 67 65 27 2c 20 62 6f 74 68 20  in range', both 
8f50: 76 61 6c 75 65 73 20 6e 65 65 64 20 74 6f 20 62  values need to b
8f60: 65 20 61 20 70 6f 77 65 72 0a 20 20 20 20 2a 2a  e a power.    **
8f70: 20 6f 66 20 74 77 6f 20 67 72 65 61 74 65 72 20   of two greater 
8f80: 74 68 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f  than or equal to
8f90: 20 35 31 32 2c 20 61 6e 64 20 6e 6f 74 20 67 72   512, and not gr
8fa0: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 69 72  eater than their
8fb0: 20 0a 20 20 20 20 2a 2a 20 72 65 73 70 65 63 74   .    ** respect
8fc0: 69 76 65 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65  ive compile time
8fd0: 20 6d 61 78 69 6d 75 6d 20 6c 69 6d 69 74 73 2e   maximum limits.
8fe0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
8ff0: 69 50 61 67 65 53 69 7a 65 3c 35 31 32 20 20 20  iPageSize<512   
9000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c                 |
9010: 7c 20 69 53 65 63 74 6f 72 53 69 7a 65 3c 35 31  | iSectorSize<51
9020: 32 0a 20 20 20 20 20 7c 7c 20 69 50 61 67 65 53  2.     || iPageS
9030: 69 7a 65 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ize>SQLITE_MAX_P
9040: 41 47 45 5f 53 49 5a 45 20 7c 7c 20 69 53 65 63  AGE_SIZE || iSec
9050: 74 6f 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54  torSize>MAX_SECT
9060: 4f 52 5f 53 49 5a 45 0a 20 20 20 20 20 7c 7c 20  OR_SIZE.     || 
9070: 28 28 69 50 61 67 65 53 69 7a 65 2d 31 29 26 69  ((iPageSize-1)&i
9080: 50 61 67 65 53 69 7a 65 29 21 3d 30 20 20 20 7c  PageSize)!=0   |
9090: 7c 20 28 28 69 53 65 63 74 6f 72 53 69 7a 65 2d  | ((iSectorSize-
90a0: 31 29 26 69 53 65 63 74 6f 72 53 69 7a 65 29 21  1)&iSectorSize)!
90b0: 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  =0 .    ){.     
90c0: 20 2f 2a 20 49 66 20 74 68 65 20 65 69 74 68 65   /* If the eithe
90d0: 72 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20  r the page-size 
90e0: 6f 72 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 69  or sector-size i
90f0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 68 65  n the journal-he
9100: 61 64 65 72 20 69 73 20 0a 20 20 20 20 20 20 2a  ader is .      *
9110: 2a 20 69 6e 76 61 6c 69 64 2c 20 74 68 65 6e 20  * invalid, then 
9120: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9130: 20 77 72 6f 74 65 20 74 68 65 20 6a 6f 75 72 6e   wrote the journ
9140: 61 6c 2d 68 65 61 64 65 72 20 6d 75 73 74 20 68  al-header must h
9150: 61 76 65 20 0a 20 20 20 20 20 20 2a 2a 20 63 72  ave .      ** cr
9160: 61 73 68 65 64 20 62 65 66 6f 72 65 20 74 68 65  ashed before the
9170: 20 68 65 61 64 65 72 20 77 61 73 20 73 79 6e 63   header was sync
9180: 65 64 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  ed. In this case
9190: 20 73 74 6f 70 20 72 65 61 64 69 6e 67 20 0a 20   stop reading . 
91a0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72       ** the jour
91b0: 6e 61 6c 20 66 69 6c 65 20 68 65 72 65 2e 0a 20  nal file here.. 
91c0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65       */.      re
91d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
91e0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
91f0: 55 70 64 61 74 65 20 74 68 65 20 70 61 67 65 2d  Update the page-
9200: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
9210: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9220: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 0a  m the journal. .
9230: 20 20 20 20 2a 2a 20 55 73 65 20 61 20 74 65 73      ** Use a tes
9240: 74 63 61 73 65 28 29 20 6d 61 63 72 6f 20 74 6f  tcase() macro to
9250: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
9260: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 77  malloc failure w
9270: 69 74 68 69 6e 20 0a 20 20 20 20 2a 2a 20 50 61  ithin .    ** Pa
9280: 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 29  gerSetPagesize()
9290: 20 69 73 20 74 65 73 74 65 64 2e 0a 20 20 20 20   is tested..    
92a0: 2a 2f 0a 20 20 20 20 69 50 61 67 65 53 69 7a 65  */.    iPageSize
92b0: 31 36 20 3d 20 28 75 31 36 29 69 50 61 67 65 53  16 = (u16)iPageS
92c0: 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ize;.    rc = sq
92d0: 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61 67  lite3PagerSetPag
92e0: 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26 69  esize(pPager, &i
92f0: 50 61 67 65 53 69 7a 65 31 36 29 3b 0a 20 20 20  PageSize16);.   
9300: 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d 53   testcase( rc!=S
9310: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 20 20  QLITE_OK );.    
9320: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
9330: 54 45 5f 4f 4b 20 7c 7c 20 69 50 61 67 65 53 69  TE_OK || iPageSi
9340: 7a 65 31 36 3d 3d 28 75 31 36 29 69 50 61 67 65  ze16==(u16)iPage
9350: 53 69 7a 65 20 29 3b 0a 0a 20 20 20 20 2f 2a 20  Size );..    /* 
9360: 55 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d  Update the assum
9370: 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74  ed sector-size t
9380: 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75  o match the valu
9390: 65 20 75 73 65 64 20 62 79 20 0a 20 20 20 20 2a  e used by .    *
93a0: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
93b0: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
93c0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
93d0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 20   journal was.   
93e0: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
93f0: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
9400: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
9410: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
9420: 20 20 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20      ** is being 
9430: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
9440: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
9450: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
9460: 61 6c 75 65 0a 20 20 20 20 2a 2a 20 6f 66 20 50  alue.    ** of P
9470: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
9480: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
9490: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
94a0: 6f 75 74 69 6e 65 2e 0a 20 20 20 20 2a 2f 0a 20  outine..    */. 
94b0: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
94c0: 72 53 69 7a 65 20 3d 20 69 53 65 63 74 6f 72 53  rSize = iSectorS
94d0: 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20 70 50 61 67  ize;.  }..  pPag
94e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
94f0: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
9500: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
9510: 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  rn rc;.}.../*.**
9520: 20 57 72 69 74 65 20 74 68 65 20 73 75 70 70 6c   Write the suppl
9530: 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ied master journ
9540: 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65  al name into the
9550: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
9560: 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61 67 65  r pager.** pPage
9570: 72 20 61 74 20 74 68 65 20 63 75 72 72 65 6e 74  r at the current
9580: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d   location. The m
9590: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
95a0: 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65 20 6c  me must be the l
95b0: 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69  ast.** thing wri
95c0: 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61  tten to a journa
95d0: 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70  l file. If the p
95e0: 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d  ager is in full-
95f0: 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a  sync mode, the.*
9600: 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  * journal file d
9610: 65 73 63 72 69 70 74 6f 72 20 69 73 20 61 64 76  escriptor is adv
9620: 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e 65 78  anced to the nex
9630: 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72  t sector boundar
9640: 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74  y before.** anyt
9650: 68 69 6e 67 20 69 73 20 77 72 69 74 74 65 6e 2e  hing is written.
9660: 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a   The format is:.
9670: 2a 2a 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  **.**   + 4 byte
9680: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
9690: 2e 0a 2a 2a 20 20 20 2b 20 4e 20 62 79 74 65 73  ..**   + N bytes
96a0: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
96b0: 20 66 69 6c 65 6e 61 6d 65 20 69 6e 20 75 74 66   filename in utf
96c0: 2d 38 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74  -8..**   + 4 byt
96d0: 65 73 3a 20 4e 20 28 6c 65 6e 67 74 68 20 6f 66  es: N (length of
96e0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
96f0: 6e 61 6d 65 20 69 6e 20 62 79 74 65 73 2c 20 6e  name in bytes, n
9700: 6f 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  o nul-terminator
9710: 29 2e 0a 2a 2a 20 20 20 2b 20 34 20 62 79 74 65  )..**   + 4 byte
9720: 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61  s: Master journa
9730: 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e  l name checksum.
9740: 0a 2a 2a 20 20 20 2b 20 38 20 62 79 74 65 73 3a  .**   + 8 bytes:
9750: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
9760: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
9770: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
9780: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
9790: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
97a0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
97b0: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2c 20  * journal name, 
97c0: 77 68 65 72 65 20 65 61 63 68 20 62 79 74 65 20  where each byte 
97d0: 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20 61  is interpreted a
97e0: 73 20 61 20 73 69 67 6e 65 64 20 38 2d 62 69 74  s a signed 8-bit
97f0: 20 69 6e 74 65 67 65 72 2e 0a 2a 2a 0a 2a 2a 20   integer..**.** 
9800: 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20  If zMaster is a 
9810: 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63  NULL pointer (oc
9820: 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c  curs for a singl
9830: 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
9840: 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69  action), .** thi
9850: 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
9860: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
9870: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
9880: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
9890: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
98a0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
98b0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
98c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
98d0: 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
98e0: 69 6e 74 20 6e 4d 61 73 74 65 72 3b 20 20 20 20  int nMaster;    
98f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9900: 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66 20 73 74   /* Length of st
9910: 72 69 6e 67 20 7a 4d 61 73 74 65 72 20 2a 2f 0a  ring zMaster */.
9920: 20 20 69 36 34 20 69 48 64 72 4f 66 66 3b 20 20    i64 iHdrOff;  
9930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9940: 20 20 20 2f 2a 20 4f 66 66 73 65 74 20 6f 66 20     /* Offset of 
9950: 68 65 61 64 65 72 20 69 6e 20 6a 6f 75 72 6e 61  header in journa
9960: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
9970: 6a 72 6e 6c 53 69 7a 65 3b 20 20 20 20 20 20 20  jrnlSize;       
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9990: 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  Size of journal 
99a0: 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 2a 2f 0a  file on disk */.
99b0: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
99c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
99d0: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 6f     /* Checksum o
99e0: 66 20 73 74 72 69 6e 67 20 7a 4d 61 73 74 65 72  f string zMaster
99f0: 20 2a 2f 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73   */..  if( !zMas
9a00: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
9a10: 65 74 4d 61 73 74 65 72 0a 20 20 20 7c 7c 20 70  etMaster.   || p
9a20: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
9a30: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
9a40: 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 0a 20 20  LMODE_MEMORY .  
9a50: 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
9a60: 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  nalMode==PAGER_J
9a70: 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
9a80: 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20    ){.    return 
9a90: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
9aa0: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9ab0: 65 72 20 3d 20 31 3b 0a 20 20 61 73 73 65 72 74  er = 1;.  assert
9ac0: 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d  ( isOpen(pPager-
9ad0: 3e 6a 66 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 43  >jfd) );..  /* C
9ae0: 61 6c 63 75 6c 61 74 65 20 74 68 65 20 6c 65 6e  alculate the len
9af0: 67 74 68 20 69 6e 20 62 79 74 65 73 20 61 6e 64  gth in bytes and
9b00: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6f 66   the checksum of
9b10: 20 7a 4d 61 73 74 65 72 20 2a 2f 0a 20 20 66 6f   zMaster */.  fo
9b20: 72 28 6e 4d 61 73 74 65 72 3d 30 3b 20 7a 4d 61  r(nMaster=0; zMa
9b30: 73 74 65 72 5b 6e 4d 61 73 74 65 72 5d 3b 20 6e  ster[nMaster]; n
9b40: 4d 61 73 74 65 72 2b 2b 29 7b 0a 20 20 20 20 63  Master++){.    c
9b50: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
9b60: 6e 4d 61 73 74 65 72 5d 3b 0a 20 20 7d 0a 0a 20  nMaster];.  }.. 
9b70: 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73   /* If in full-s
9b80: 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63  ync mode, advanc
9b90: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 64 69  e to the next di
9ba0: 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f 72 65  sk sector before
9bb0: 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68   writing.  ** th
9bc0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9bd0: 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73 20 69   name. This is i
9be0: 6e 20 63 61 73 65 20 74 68 65 20 70 72 65 76 69  n case the previ
9bf0: 6f 75 73 20 70 61 67 65 20 77 72 69 74 74 65 6e  ous page written
9c00: 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   to.  ** the jou
9c10: 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61 64 79  rnal has already
9c20: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20   been synced..  
9c30: 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
9c40: 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
9c50: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
9c60: 4f 66 66 20 3d 20 6a 6f 75 72 6e 61 6c 48 64 72  Off = journalHdr
9c70: 4f 66 66 73 65 74 28 70 50 61 67 65 72 29 3b 0a  Offset(pPager);.
9c80: 20 20 7d 0a 20 20 69 48 64 72 4f 66 66 20 3d 20    }.  iHdrOff = 
9c90: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9ca0: 66 66 3b 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20  ff;..  /* Write 
9cb0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9cc0: 61 6c 20 64 61 74 61 20 74 6f 20 74 68 65 20 65  al data to the e
9cd0: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
9ce0: 6c 20 66 69 6c 65 2e 20 49 66 0a 20 20 2a 2a 20  l file. If.  ** 
9cf0: 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c  an error occurs,
9d00: 20 72 65 74 75 72 6e 20 74 68 65 20 65 72 72 6f   return the erro
9d10: 72 20 63 6f 64 65 20 74 6f 20 74 68 65 20 63 61  r code to the ca
9d20: 6c 6c 65 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ller..  */.  if(
9d30: 20 28 30 20 21 3d 20 28 72 63 20 3d 20 77 72 69   (0 != (rc = wri
9d40: 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
9d50: 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66 2c 20 50  >jfd, iHdrOff, P
9d60: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
9d70: 67 65 72 29 29 29 29 0a 20 20 20 7c 7c 20 28 30  ger)))).   || (0
9d80: 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65   != (rc = sqlite
9d90: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
9da0: 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  >jfd, zMaster, n
9db0: 4d 61 73 74 65 72 2c 20 69 48 64 72 4f 66 66 2b  Master, iHdrOff+
9dc0: 34 29 29 29 0a 20 20 20 7c 7c 20 28 30 20 21 3d  4))).   || (0 !=
9dd0: 20 28 72 63 20 3d 20 77 72 69 74 65 33 32 62 69   (rc = write32bi
9de0: 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
9df0: 69 48 64 72 4f 66 66 2b 34 2b 6e 4d 61 73 74 65  iHdrOff+4+nMaste
9e00: 72 2c 20 6e 4d 61 73 74 65 72 29 29 29 0a 20 20  r, nMaster))).  
9e10: 20 7c 7c 20 28 30 20 21 3d 20 28 72 63 20 3d 20   || (0 != (rc = 
9e20: 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
9e30: 65 72 2d 3e 6a 66 64 2c 20 69 48 64 72 4f 66 66  er->jfd, iHdrOff
9e40: 2b 34 2b 6e 4d 61 73 74 65 72 2b 34 2c 20 63 6b  +4+nMaster+4, ck
9e50: 73 75 6d 29 29 29 0a 20 20 20 7c 7c 20 28 30 20  sum))).   || (0 
9e60: 21 3d 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  != (rc = sqlite3
9e70: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
9e80: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
9e90: 69 63 2c 20 38 2c 20 69 48 64 72 4f 66 66 2b 34  ic, 8, iHdrOff+4
9ea0: 2b 6e 4d 61 73 74 65 72 2b 38 29 29 29 0a 20 20  +nMaster+8))).  
9eb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
9ec0: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
9ed0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6e  journalOff += (n
9ee0: 4d 61 73 74 65 72 2b 32 30 29 3b 0a 20 20 70 50  Master+20);.  pP
9ef0: 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
9f00: 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
9f10: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
9f20: 61 67 65 72 20 69 73 20 69 6e 20 70 65 72 69 73  ager is in peris
9f30: 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20 6d 6f 64  tent-journal mod
9f40: 65 2c 20 74 68 65 6e 20 74 68 65 20 70 68 79 73  e, then the phys
9f50: 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f 75 72 6e  ical .  ** journ
9f60: 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65 78 74 65  al-file may exte
9f70: 6e 64 20 70 61 73 74 20 74 68 65 20 65 6e 64 20  nd past the end 
9f80: 6f 66 20 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f  of the master-jo
9f90: 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20 2a 2a 20  urnal name.  ** 
9fa0: 61 6e 64 20 38 20 62 79 74 65 73 20 6f 66 20 6d  and 8 bytes of m
9fb0: 61 67 69 63 20 64 61 74 61 20 6a 75 73 74 20 77  agic data just w
9fc0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 66 69  ritten to the fi
9fd0: 6c 65 2e 20 54 68 69 73 20 69 73 20 0a 20 20 2a  le. This is .  *
9fe0: 2a 20 64 61 6e 67 65 72 6f 75 73 20 62 65 63 61  * dangerous beca
9ff0: 75 73 65 20 74 68 65 20 63 6f 64 65 20 74 6f 20  use the code to 
a000: 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f 74 2d 6a  rollback a hot-j
a010: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20 20 2a 2a  ournal file.  **
a020: 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 61 62 6c   will not be abl
a030: 65 20 74 6f 20 66 69 6e 64 20 74 68 65 20 6d 61  e to find the ma
a040: 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster-journal nam
a050: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 0a  e to determine .
a060: 20 20 2a 2a 20 77 68 65 74 68 65 72 20 6f 72 20    ** whether or 
a070: 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  not the journal 
a080: 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a 0a 20 20  is hot. .  **.  
a090: 2a 2a 20 45 61 73 69 65 73 74 20 74 68 69 6e 67  ** Easiest thing
a0a0: 20 74 6f 20 64 6f 20 69 6e 20 74 68 69 73 20 73   to do in this s
a0b0: 63 65 6e 61 72 69 6f 20 69 73 20 74 6f 20 74 72  cenario is to tr
a0c0: 75 6e 63 61 74 65 20 74 68 65 20 6a 6f 75 72 6e  uncate the journ
a0d0: 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65 20 74 6f  al .  ** file to
a0e0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 73 69   the required si
a0f0: 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69 66 28 20  ze..  */ .  if( 
a100: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d  SQLITE_OK==(rc =
a110: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
a120: 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
a130: 26 6a 72 6e 6c 53 69 7a 65 29 29 0a 20 20 20 26  &jrnlSize)).   &
a140: 26 20 6a 72 6e 6c 53 69 7a 65 3e 70 50 61 67 65  & jrnlSize>pPage
a150: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a 20 20  r->journalOff.  
a160: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
a170: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
a180: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
a190: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
a1a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
a1b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
a1c0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
a1d0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
a1e0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 52  s page number. R
a1f0: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
a200: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
a210: 72 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 72 65  r NULL if the re
a220: 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
a230: 6e 6f 74 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20  not .** already 
a240: 69 6e 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  in memory..*/.st
a250: 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
a260: 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  r_lookup(Pager *
a270: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
a280: 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 3b 20  o){.  PgHdr *p; 
a290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a2a0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
a2b0: 6e 20 76 61 6c 75 65 20 2a 2f 0a 0a 20 20 2f 2a  n value */..  /*
a2c0: 20 49 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   It is not possi
a2d0: 62 6c 65 20 66 6f 72 20 61 20 63 61 6c 6c 20 74  ble for a call t
a2e0: 6f 20 50 63 61 63 68 65 46 65 74 63 68 28 29 20  o PcacheFetch() 
a2f0: 77 69 74 68 20 63 72 65 61 74 65 46 6c 61 67 3d  with createFlag=
a300: 3d 30 20 74 6f 0a 20 20 2a 2a 20 66 61 69 6c 2c  =0 to.  ** fail,
a310: 20 73 69 6e 63 65 20 6e 6f 20 61 74 74 65 6d 70   since no attemp
a320: 74 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 64 79  t to allocate dy
a330: 6e 61 6d 69 63 20 6d 65 6d 6f 72 79 20 77 69 6c  namic memory wil
a340: 6c 20 62 65 20 6d 61 64 65 2e 0a 20 20 2a 2f 0a  l be made..  */.
a350: 20 20 28 76 6f 69 64 29 73 71 6c 69 74 65 33 50    (void)sqlite3P
a360: 63 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65  cacheFetch(pPage
a370: 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f  r->pPCache, pgno
a380: 2c 20 30 2c 20 26 70 29 3b 0a 20 20 72 65 74 75  , 0, &p);.  retu
a390: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
a3a0: 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
a3b0: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
a3c0: 65 2c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69  e, discard all i
a3d0: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2e 20  n-memory pages. 
a3e0: 49 66 0a 2a 2a 20 74 68 65 20 70 61 67 65 72 20  If.** the pager 
a3f0: 69 73 20 69 6e 20 65 72 72 6f 72 2d 73 74 61 74  is in error-stat
a400: 65 2c 20 74 68 65 6e 20 74 68 69 73 20 63 61 6c  e, then this cal
a410: 6c 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a  l is a no-op..**
a420: 0a 2a 2a 20 54 4f 44 4f 3a 20 57 68 79 20 63 61  .** TODO: Why ca
a430: 6e 20 77 65 20 6e 6f 74 20 72 65 73 65 74 20 74  n we not reset t
a440: 68 65 20 70 61 67 65 72 20 77 68 69 6c 65 20 69  he pager while i
a450: 6e 20 65 72 72 6f 72 20 73 74 61 74 65 3f 0a 2a  n error state?.*
a460: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
a470: 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20  ger_reset(Pager 
a480: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20  *pPager){.  if( 
a490: 53 51 4c 49 54 45 5f 4f 4b 3d 3d 70 50 61 67 65  SQLITE_OK==pPage
a4a0: 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
a4b0: 20 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70 52    sqlite3BackupR
a4c0: 65 73 74 61 72 74 28 70 50 61 67 65 72 2d 3e 70  estart(pPager->p
a4d0: 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 73 71 6c  Backup);.    sql
a4e0: 69 74 65 33 50 63 61 63 68 65 43 6c 65 61 72 28  ite3PcacheClear(
a4f0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
a500: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46  ;.  }.}../*.** F
a510: 72 65 65 20 61 6c 6c 20 73 74 72 75 63 74 75 72  ree all structur
a520: 65 73 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e  es in the Pager.
a530: 61 53 61 76 65 70 6f 69 6e 74 5b 5d 20 61 72 72  aSavepoint[] arr
a540: 61 79 20 61 6e 64 20 73 65 74 20 62 6f 74 68 0a  ay and set both.
a550: 2a 2a 20 50 61 67 65 72 2e 61 53 61 76 65 70 6f  ** Pager.aSavepo
a560: 69 6e 74 20 61 6e 64 20 50 61 67 65 72 2e 6e 53  int and Pager.nS
a570: 61 76 65 70 6f 69 6e 74 20 74 6f 20 7a 65 72 6f  avepoint to zero
a580: 2e 20 43 6c 6f 73 65 20 74 68 65 20 73 75 62 2d  . Close the sub-
a590: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 66 20 69 74  journal.** if it
a5a0: 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65   is open and the
a5b0: 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 69 6e   pager is not in
a5c0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
a5d0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
a5e0: 72 65 6c 65 61 73 65 41 6c 6c 53 61 76 65 70 6f  releaseAllSavepo
a5f0: 69 6e 74 73 28 50 61 67 65 72 20 2a 70 50 61 67  ints(Pager *pPag
a600: 65 72 29 7b 0a 20 20 69 6e 74 20 69 69 3b 20 20  er){.  int ii;  
a610: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a620: 49 74 65 72 61 74 6f 72 20 66 6f 72 20 6c 6f 6f  Iterator for loo
a630: 70 69 6e 67 20 74 68 72 6f 75 67 68 20 50 61 67  ping through Pag
a640: 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 2a 2f  er.aSavepoint */
a650: 0a 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c  .  for(ii=0; ii<
a660: 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69  pPager->nSavepoi
a670: 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 73  nt; ii++){.    s
a680: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
a690: 72 6f 79 28 70 50 61 67 65 72 2d 3e 61 53 61 76  roy(pPager->aSav
a6a0: 65 70 6f 69 6e 74 5b 69 69 5d 2e 70 49 6e 53 61  epoint[ii].pInSa
a6b0: 76 65 70 6f 69 6e 74 29 3b 0a 20 20 7d 0a 20 20  vepoint);.  }.  
a6c0: 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63  if( !pPager->exc
a6d0: 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20  lusiveMode ){.  
a6e0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
a6f0: 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 3b 0a  (pPager->sjfd);.
a700: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
a710: 65 65 28 70 50 61 67 65 72 2d 3e 61 53 61 76 65  ee(pPager->aSave
a720: 70 6f 69 6e 74 29 3b 0a 20 20 70 50 61 67 65 72  point);.  pPager
a730: 2d 3e 61 53 61 76 65 70 6f 69 6e 74 20 3d 20 30  ->aSavepoint = 0
a740: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 53 61 76  ;.  pPager->nSav
a750: 65 70 6f 69 6e 74 20 3d 20 30 3b 0a 20 20 70 50  epoint = 0;.  pP
a760: 61 67 65 72 2d 3e 6e 53 75 62 52 65 63 20 3d 20  ager->nSubRec = 
a770: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  0;.}../*.** Set 
a780: 74 68 65 20 62 69 74 20 6e 75 6d 62 65 72 20 70  the bit number p
a790: 67 6e 6f 20 69 6e 20 74 68 65 20 50 61 67 65 72  gno in the Pager
a7a0: 53 61 76 65 70 6f 69 6e 74 2e 70 49 6e 53 61 76  Savepoint.pInSav
a7b0: 65 70 6f 69 6e 74 20 0a 2a 2a 20 62 69 74 76 65  epoint .** bitve
a7c0: 63 73 20 6f 66 20 61 6c 6c 20 6f 70 65 6e 20 73  cs of all open s
a7d0: 61 76 65 70 6f 69 6e 74 73 2e 20 52 65 74 75 72  avepoints. Retur
a7e0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 73  n SQLITE_OK if s
a7f0: 75 63 63 65 73 73 66 75 6c 0a 2a 2a 20 6f 72 20  uccessful.** or 
a800: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 66 20  SQLITE_NOMEM if 
a810: 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65  a malloc failure
a820: 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74   occurs..*/.stat
a830: 69 63 20 69 6e 74 20 61 64 64 54 6f 53 61 76 65  ic int addToSave
a840: 70 6f 69 6e 74 42 69 74 76 65 63 73 28 50 61 67  pointBitvecs(Pag
a850: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
a860: 20 70 67 6e 6f 29 7b 0a 20 20 69 6e 74 20 69 69   pgno){.  int ii
a870: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a880: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
a890: 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20  ter */.  int rc 
a8a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
a8b0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64     /* Result cod
a8c0: 65 20 2a 2f 0a 0a 20 20 66 6f 72 28 69 69 3d 30  e */..  for(ii=0
a8d0: 3b 20 69 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61  ; ii<pPager->nSa
a8e0: 76 65 70 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a  vepoint; ii++){.
a8f0: 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f 69      PagerSavepoi
a900: 6e 74 20 2a 70 20 3d 20 26 70 50 61 67 65 72 2d  nt *p = &pPager-
a910: 3e 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 3b  >aSavepoint[ii];
a920: 0a 20 20 20 20 69 66 28 20 70 67 6e 6f 3c 3d 70  .    if( pgno<=p
a930: 2d 3e 6e 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->nOrig ){.     
a940: 20 72 63 20 7c 3d 20 73 71 6c 69 74 65 33 42 69   rc |= sqlite3Bi
a950: 74 76 65 63 53 65 74 28 70 2d 3e 70 49 6e 53 61  tvecSet(p->pInSa
a960: 76 65 70 6f 69 6e 74 2c 20 70 67 6e 6f 29 3b 0a  vepoint, pgno);.
a970: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a980: 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
a990: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a9a0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
a9b0: 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f  || rc==SQLITE_NO
a9c0: 4d 45 4d 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  MEM );.    }.  }
a9d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
a9e0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68  ./*.** Unlock th
a9f0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
aa00: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
aa10: 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 74 68 65  s a no-op if the
aa20: 20 70 61 67 65 72 0a 2a 2a 20 69 73 20 69 6e 20   pager.** is in 
aa30: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e 0a  exclusive mode..
aa40: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  **.** If the pag
aa50: 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
aa60: 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20  in error state, 
aa70: 64 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e 74  discard the cont
aa80: 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20  ents of .** the 
aa90: 63 61 63 68 65 20 61 6e 64 20 72 65 73 65 74 20  cache and reset 
aaa0: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
aab0: 75 72 65 20 69 6e 74 65 72 6e 61 6c 20 73 74 61  ure internal sta
aac0: 74 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 0a  te. If there is.
aad0: 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e  ** an open journ
aae0: 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e 20 74 68  al-file, then th
aaf0: 65 20 6e 65 78 74 20 74 69 6d 65 20 61 20 73 68  e next time a sh
ab00: 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74  ared-lock is obt
ab10: 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20  ained.** on the 
ab20: 70 61 67 65 72 20 66 69 6c 65 20 28 62 79 20 74  pager file (by t
ab30: 68 69 73 20 6f 72 20 61 6e 79 20 6f 74 68 65 72  his or any other
ab40: 20 70 72 6f 63 65 73 73 29 2c 20 69 74 20 77 69   process), it wi
ab50: 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61 74 65 64  ll be.** treated
ab60: 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61   as a hot-journa
ab70: 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63  l and rolled bac
ab80: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  k..*/.static voi
ab90: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
aba0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
abb0: 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65 78   if( !pPager->ex
abc0: 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20  clusiveMode ){. 
abd0: 20 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20     int rc;      
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
ac00: 2f 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  /..    /* Always
ac10: 20 63 6c 6f 73 65 20 74 68 65 20 6a 6f 75 72 6e   close the journ
ac20: 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 64 72 6f  al file when dro
ac30: 70 70 69 6e 67 20 74 68 65 20 64 61 74 61 62 61  pping the databa
ac40: 73 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2a 2a 20  se lock..    ** 
ac50: 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68  Otherwise, anoth
ac60: 65 72 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69  er connection wi
ac70: 74 68 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d  th journal_mode=
ac80: 64 65 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20  delete might.   
ac90: 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66   ** delete the f
aca0: 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ile out from und
acb0: 65 72 20 75 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  er us..    */.  
acc0: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
acd0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  (pPager->jfd);. 
ace0: 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
acf0: 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
ad00: 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
ad10: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
ad20: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 72 65 6c  nal = 0;.    rel
ad30: 65 61 73 65 41 6c 6c 53 61 76 65 70 6f 69 6e 74  easeAllSavepoint
ad40: 73 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  s(pPager);..    
ad50: 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 69  /* If the file i
ad60: 73 20 75 6e 6c 6f 63 6b 65 64 2c 20 73 6f 6d 65  s unlocked, some
ad70: 62 6f 64 79 20 65 6c 73 65 20 6d 69 67 68 74 20  body else might 
ad80: 63 68 61 6e 67 65 20 69 74 2e 20 54 68 65 0a 20  change it. The. 
ad90: 20 20 20 2a 2a 20 76 61 6c 75 65 73 20 73 74 6f     ** values sto
ada0: 72 65 64 20 69 6e 20 50 61 67 65 72 2e 64 62 53  red in Pager.dbS
adb0: 69 7a 65 20 65 74 63 2e 20 6d 69 67 68 74 20 62  ize etc. might b
adc0: 65 63 6f 6d 65 20 69 6e 76 61 6c 69 64 20 69 66  ecome invalid if
add0: 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 68 61 70  .    ** this hap
ade0: 70 65 6e 73 2e 20 54 4f 44 4f 3a 20 52 65 61 6c  pens. TODO: Real
adf0: 6c 79 2c 20 74 68 69 73 20 64 6f 65 73 6e 27 74  ly, this doesn't
ae00: 20 6e 65 65 64 20 74 6f 20 62 65 20 63 6c 65 61   need to be clea
ae10: 72 65 64 0a 20 20 20 20 2a 2a 20 75 6e 74 69 6c  red.    ** until
ae20: 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e   the change-coun
ae30: 74 65 72 20 63 68 65 63 6b 20 66 61 69 6c 73 20  ter check fails 
ae40: 69 6e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f  in pagerSharedLo
ae50: 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ck()..    */.   
ae60: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
ae70: 61 6c 69 64 20 3d 20 30 3b 0a 0a 20 20 20 20 72  alid = 0;..    r
ae80: 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  c = osUnlock(pPa
ae90: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
aea0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b  );.    if( rc ){
aeb0: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65  .      pPager->e
aec0: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
aed0: 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
aee0: 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70  "UNLOCK %p\n", p
aef0: 50 61 67 65 72 29 29 0a 0a 20 20 20 20 2f 2a 20  Pager))..    /* 
af00: 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  If Pager.errCode
af10: 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f 6e   is set, the con
af20: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
af30: 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74 20  er cache cannot 
af40: 62 65 0a 20 20 20 20 2a 2a 20 74 72 75 73 74 65  be.    ** truste
af50: 64 2e 20 4e 6f 77 20 74 68 61 74 20 74 68 65 20  d. Now that the 
af60: 70 61 67 65 72 20 66 69 6c 65 20 69 73 20 75 6e  pager file is un
af70: 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74  locked, the cont
af80: 65 6e 74 73 20 6f 66 20 74 68 65 0a 20 20 20 20  ents of the.    
af90: 2a 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  ** cache can be 
afa0: 64 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68  discarded and th
afb0: 65 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66  e error code saf
afc0: 65 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20  ely cleared..   
afd0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
afe0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
aff0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
b000: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
b010: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
b020: 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  e = SQLITE_OK;. 
b030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
b040: 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
b050: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 61  ;.    }..    pPa
b060: 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
b070: 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Done = 0;.    pP
b080: 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
b090: 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 7d 0a  GER_UNLOCK;.  }.
b0a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
b0b0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
b0c0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
b0d0: 49 4f 45 52 52 2c 20 43 4f 52 52 55 50 54 20 6f  IOERR, CORRUPT o
b0e0: 72 20 46 55 4c 4c 20 65 72 72 6f 72 0a 2a 2a 20  r FULL error.** 
b0f0: 6d 61 79 20 68 61 76 65 20 6f 63 63 75 72 65 64  may have occured
b100: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
b110: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
b120: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 0a  r to the pager .
b130: 2a 2a 20 73 74 72 75 63 74 75 72 65 2c 20 74 68  ** structure, th
b140: 65 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72  e second the err
b150: 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
b160: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
b170: 61 20 70 61 67 65 72 20 0a 2a 2a 20 41 50 49 20  a pager .** API 
b180: 66 75 6e 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  function. The va
b190: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
b1a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
b1b0: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 0a 2a  cond argument .*
b1c0: 2a 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  * to this functi
b1d0: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
b1e0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
b1f0: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
b200: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
b210: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
b220: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
b230: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
b240: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
b250: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
b260: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
b270: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
b280: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
b290: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
b2a0: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
b2b0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
b2c0: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
b2d0: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
b2e0: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
b2f0: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
b300: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
b310: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
b320: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
b330: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
b340: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
b350: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
b360: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
b370: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
b380: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
b390: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
b3a0: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
b3b0: 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74 68  occured, then th
b3c0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
b3d0: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
b3e0: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 20 74 6f  o be replayed to
b3f0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 63 6f 6e   restore the con
b400: 74 65 6e 74 73 20 6f 66 20 74 68 65 20 64 61 74  tents of the dat
b410: 61 62 61 73 65 20 66 69 6c 65 20 28 61 73 20 69  abase file (as i
b420: 66 0a 2a 2a 20 69 74 20 77 65 72 65 20 61 20 68  f.** it were a h
b430: 6f 74 2d 6a 6f 75 72 6e 61 6c 29 2e 0a 2a 2f 0a  ot-journal)..*/.
b440: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
b450: 5f 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50  _error(Pager *pP
b460: 61 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20  ager, int rc){. 
b470: 20 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20   int rc2 = rc & 
b480: 30 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a  0xff;.  assert(.
b490: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
b4a0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
b4b0: 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50  ULL ||.       pP
b4c0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
b4d0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20  QLITE_OK ||.    
b4e0: 20 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43     (pPager->errC
b4f0: 6f 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c  ode & 0xff)==SQL
b500: 49 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20  ITE_IOERR.  );. 
b510: 20 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51   if(.    rc2==SQ
b520: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
b530: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45   rc2==SQLITE_IOE
b540: 52 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53  RR ||.    rc2==S
b550: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20  QLITE_CORRUPT.  
b560: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
b570: 72 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20  rrCode = rc;.   
b580: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
b590: 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
b5a0: 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74 65   .     && sqlite
b5b0: 33 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28  3PcacheRefCount(
b5c0: 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29  pPager->pPCache)
b5d0: 3d 3d 30 20 0a 20 20 20 20 29 7b 0a 20 20 20 20  ==0 .    ){.    
b5e0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
b5f0: 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e 6c  r is already unl
b600: 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67 65  ocked, call page
b610: 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20 74  r_unlock() now t
b620: 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61 72  o.      ** clear
b630: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b640: 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61 74   and ensure that
b650: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
b660: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f   is .      ** co
b670: 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e 0a  mpletely empty..
b680: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
b690: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
b6a0: 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
b6b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b6c0: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
b6d0: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
b6e0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
b6f0: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
b700: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
b710: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
b720: 68 65 20 70 61 67 65 72 20 68 61 73 20 61 6c 72  he pager has alr
b730: 65 61 64 79 20 65 6e 74 65 72 65 64 20 74 68 65  eady entered the
b740: 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
b750: 20 6e 6f 74 20 61 74 74 65 6d 70 74 20 0a 2a 2a   not attempt .**
b760: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 61 74   the rollback at
b770: 20 74 68 69 73 20 74 69 6d 65 2e 20 49 6e 73 74   this time. Inst
b780: 65 61 64 2c 20 70 61 67 65 72 5f 75 6e 6c 6f 63  ead, pager_unloc
b790: 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 20 54  k() is called. T
b7a0: 68 65 0a 2a 2a 20 63 61 6c 6c 20 74 6f 20 70 61  he.** call to pa
b7b0: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 77 69 6c  ger_unlock() wil
b7c0: 6c 20 64 69 73 63 61 72 64 20 61 6c 6c 20 69 6e  l discard all in
b7d0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 2c 20 75  -memory pages, u
b7e0: 6e 6c 6f 63 6b 0a 2a 2a 20 74 68 65 20 64 61 74  nlock.** the dat
b7f0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 63  abase file and c
b800: 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20 73  lear the error s
b810: 74 61 74 65 2e 20 49 66 20 74 68 69 73 20 6d 65  tate. If this me
b820: 61 6e 73 20 74 68 61 74 0a 2a 2a 20 74 68 65 72  ans that.** ther
b830: 65 20 69 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  e is a hot-journ
b840: 61 6c 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66  al left in the f
b850: 69 6c 65 2d 73 79 73 74 65 6d 2c 20 74 68 65 20  ile-system, the 
b860: 6e 65 78 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a  next connection.
b870: 2a 2a 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 73  ** to obtain a s
b880: 68 61 72 65 64 20 6c 6f 63 6b 20 6f 6e 20 74 68  hared lock on th
b890: 65 20 70 61 67 65 72 20 28 77 68 69 63 68 20 6d  e pager (which m
b8a0: 61 79 20 62 65 20 74 68 69 73 20 6f 6e 65 29 20  ay be this one) 
b8b0: 77 69 6c 6c 0a 2a 2a 20 72 6f 6c 6c 20 69 74 20  will.** roll it 
b8c0: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
b8d0: 68 65 20 70 61 67 65 72 20 68 61 73 20 6e 6f 74  he pager has not
b8e0: 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64   already entered
b8f0: 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65   the error state
b900: 2c 20 62 75 74 20 61 6e 20 49 4f 20 6f 72 0a 2a  , but an IO or.*
b910: 2a 20 6d 61 6c 6c 6f 63 20 65 72 72 6f 72 20 6f  * malloc error o
b920: 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 72  ccurs during a r
b930: 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 74 68  ollback, then th
b940: 69 73 20 77 69 6c 6c 20 69 74 73 65 6c 66 20 63  is will itself c
b950: 61 75 73 65 20 0a 2a 2a 20 74 68 65 20 70 61 67  ause .** the pag
b960: 65 72 20 74 6f 20 65 6e 74 65 72 20 74 68 65 20  er to enter the 
b970: 65 72 72 6f 72 20 73 74 61 74 65 2e 20 57 68 69  error state. Whi
b980: 63 68 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72  ch will be clear
b990: 65 64 20 62 79 20 74 68 65 0a 2a 2a 20 63 61 6c  ed by the.** cal
b9a0: 6c 20 74 6f 20 70 61 67 65 72 5f 75 6e 6c 6f 63  l to pager_unloc
b9b0: 6b 28 29 2c 20 61 73 20 64 65 73 63 72 69 62 65  k(), as describe
b9c0: 64 20 61 62 6f 76 65 2e 0a 2a 2f 0a 73 74 61 74  d above..*/.stat
b9d0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
b9e0: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
b9f0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
ba00: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
ba10: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
ba20: 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  && pPager->state
ba30: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
ba40: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   ){.    sqlite3B
ba50: 65 67 69 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  eginBenignMalloc
ba60: 28 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  ();.    sqlite3P
ba70: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 50 61  agerRollback(pPa
ba80: 67 65 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ger);.    sqlite
ba90: 33 45 6e 64 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63  3EndBenignMalloc
baa0: 28 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f  ();.  }.  pager_
bab0: 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  unlock(pPager);.
bac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bad0: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
bae0: 6e 73 61 63 74 69 6f 6e 2e 20 41 20 74 72 61 6e  nsaction. A tran
baf0: 73 61 63 74 69 6f 6e 20 69 73 20 75 73 75 61 6c  saction is usual
bb00: 6c 79 20 65 6e 64 65 64 20 62 79 20 0a 2a 2a 20  ly ended by .** 
bb10: 65 69 74 68 65 72 20 61 20 43 4f 4d 4d 49 54 20  either a COMMIT 
bb20: 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 20 6f 70  or a ROLLBACK op
bb30: 65 72 61 74 69 6f 6e 2e 20 54 68 69 73 20 72 6f  eration. This ro
bb40: 75 74 69 6e 65 20 6d 61 79 20 62 65 20 63 61 6c  utine may be cal
bb50: 6c 65 64 20 0a 2a 2a 20 61 66 74 65 72 20 72 6f  led .** after ro
bb60: 6c 6c 62 61 63 6b 20 6f 66 20 61 20 68 6f 74 2d  llback of a hot-
bb70: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 69 66 20 61  journal, or if a
bb80: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77  n error occurs w
bb90: 68 69 6c 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20  hile opening.** 
bba0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
bbb0: 20 6f 72 20 77 72 69 74 69 6e 67 20 74 68 65 20   or writing the 
bbc0: 76 65 72 79 20 66 69 72 73 74 20 6a 6f 75 72 6e  very first journ
bbd0: 61 6c 2d 68 65 61 64 65 72 20 6f 66 20 61 0a 2a  al-header of a.*
bbe0: 2a 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  * database trans
bbf0: 61 63 74 69 6f 6e 2e 0a 2a 2a 20 0a 2a 2a 20 49  action..** .** I
bc00: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
bc10: 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6f  n PAGER_SHARED o
bc20: 72 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 73  r PAGER_UNLOCK s
bc30: 74 61 74 65 20 77 68 65 6e 20 74 68 69 73 0a 2a  tate when this.*
bc40: 2a 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  * routine is cal
bc50: 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d  led, it is a no-
bc60: 6f 70 20 28 72 65 74 75 72 6e 73 20 53 51 4c 49  op (returns SQLI
bc70: 54 45 5f 4f 4b 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  TE_OK)..**.** Ot
bc80: 68 65 72 77 69 73 65 2c 20 61 6e 79 20 61 63 74  herwise, any act
bc90: 69 76 65 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ive savepoints a
bca0: 72 65 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  re released..**.
bcb0: 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
bcc0: 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 2c 20  l file is open, 
bcd0: 74 68 65 6e 20 69 74 20 69 73 20 22 66 69 6e 61  then it is "fina
bce0: 6c 69 7a 65 64 22 2e 20 4f 6e 63 65 20 61 20 6a  lized". Once a j
bcf0: 6f 75 72 6e 61 6c 20 0a 2a 2a 20 66 69 6c 65 20  ournal .** file 
bd00: 68 61 73 20 62 65 65 6e 20 66 69 6e 61 6c 69 7a  has been finaliz
bd10: 65 64 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  ed it is not pos
bd20: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 69 74 20  sible to use it 
bd30: 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20 61 20 0a  to roll back a .
bd40: 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  ** transaction. 
bd50: 4e 6f 72 20 77 69 6c 6c 20 69 74 20 62 65 20 63  Nor will it be c
bd60: 6f 6e 73 69 64 65 72 65 64 20 74 6f 20 62 65 20  onsidered to be 
bd70: 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 79  a hot-journal by
bd80: 20 74 68 69 73 0a 2a 2a 20 6f 72 20 61 6e 79 20   this.** or any 
bd90: 6f 74 68 65 72 20 64 61 74 61 62 61 73 65 20 63  other database c
bda0: 6f 6e 6e 65 63 74 69 6f 6e 2e 20 45 78 61 63 74  onnection. Exact
bdb0: 6c 79 20 68 6f 77 20 61 20 6a 6f 75 72 6e 61 6c  ly how a journal
bdc0: 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a 2a 2a   is finalized.**
bdd0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74   depends on whet
bde0: 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 70  her or not the p
bdf0: 61 67 65 72 20 69 73 20 72 75 6e 6e 69 6e 67 20  ager is running 
be00: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64  in exclusive mod
be10: 65 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 75 72  e and.** the cur
be20: 72 65 6e 74 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  rent journal-mod
be30: 65 20 28 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  e (Pager.journal
be40: 4d 6f 64 65 20 76 61 6c 75 65 29 2c 20 61 73 20  Mode value), as 
be50: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20  follows:.**.**  
be60: 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 4d 45   journalMode==ME
be70: 4d 4f 52 59 0a 2a 2a 20 20 20 20 20 4a 6f 75 72  MORY.**     Jour
be80: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
be90: 74 6f 72 20 69 73 20 73 69 6d 70 6c 79 20 63 6c  tor is simply cl
bea0: 6f 73 65 64 2e 20 54 68 69 73 20 64 65 73 74 72  osed. This destr
beb0: 6f 79 73 20 61 6e 20 0a 2a 2a 20 20 20 20 20 69  oys an .**     i
bec0: 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e 61 6c  n-memory journal
bed0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f 75 72 6e 61  ..**.**   journa
bee0: 6c 4d 6f 64 65 3d 3d 54 52 55 4e 43 41 54 45 0a  lMode==TRUNCATE.
bef0: 2a 2a 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66  **     Journal f
bf00: 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
bf10: 20 74 6f 20 7a 65 72 6f 20 62 79 74 65 73 20 69   to zero bytes i
bf20: 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 20 20  n size..**.**   
bf30: 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50 45 52  journalMode==PER
bf40: 53 49 53 54 0a 2a 2a 20 20 20 20 20 54 68 65 20  SIST.**     The 
bf50: 66 69 72 73 74 20 32 38 20 62 79 74 65 73 20 6f  first 28 bytes o
bf60: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
bf70: 6c 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 20 54  le are zeroed. T
bf80: 68 69 73 20 69 6e 76 61 6c 69 64 61 74 65 73 0a  his invalidates.
bf90: 2a 2a 20 20 20 20 20 74 68 65 20 66 69 72 73 74  **     the first
bfa0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
bfb0: 69 6e 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  in the file, and
bfc0: 20 68 65 6e 63 65 20 74 68 65 20 65 6e 74 69 72   hence the entir
bfd0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
bfe0: 20 66 69 6c 65 2e 20 41 6e 20 69 6e 76 61 6c 69   file. An invali
bff0: 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63  d journal file c
c000: 61 6e 6e 6f 74 20 62 65 20 72 6f 6c 6c 65 64 20  annot be rolled 
c010: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 6a 6f  back..**.**   jo
c020: 75 72 6e 61 6c 4d 6f 64 65 3d 3d 44 45 4c 45 54  urnalMode==DELET
c030: 45 0a 2a 2a 20 20 20 20 20 54 68 65 20 6a 6f 75  E.**     The jou
c040: 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 6c 6f  rnal file is clo
c050: 73 65 64 20 61 6e 64 20 64 65 6c 65 74 65 64 20  sed and deleted 
c060: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f 73 44  using sqlite3OsD
c070: 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 20  elete()..**.**  
c080: 20 20 20 49 66 20 74 68 65 20 70 61 67 65 72 20     If the pager 
c090: 69 73 20 72 75 6e 6e 69 6e 67 20 69 6e 20 65 78  is running in ex
c0a0: 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74 68  clusive mode, th
c0b0: 69 73 20 6d 65 74 68 6f 64 20 6f 66 20 66 69 6e  is method of fin
c0c0: 61 6c 69 7a 69 6e 67 0a 2a 2a 20 20 20 20 20 74  alizing.**     t
c0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c0e0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 2e 20 49  is never used. I
c0f0: 6e 73 74 65 61 64 2c 20 69 66 20 74 68 65 20 6a  nstead, if the j
c100: 6f 75 72 6e 61 6c 4d 6f 64 65 20 69 73 0a 2a 2a  ournalMode is.**
c110: 20 20 20 20 20 44 45 4c 45 54 45 20 61 6e 64 20       DELETE and 
c120: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
c130: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c140: 74 68 65 20 6d 65 74 68 6f 64 20 64 65 73 63 72  the method descr
c150: 69 62 65 64 20 75 6e 64 65 72 0a 2a 2a 20 20 20  ibed under.**   
c160: 20 20 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d 50    journalMode==P
c170: 45 52 53 49 53 54 20 69 73 20 75 73 65 64 20 69  ERSIST is used i
c180: 6e 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 41 66  nstead..**.** Af
c190: 74 65 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ter the journal 
c1a0: 69 73 20 66 69 6e 61 6c 69 7a 65 64 2c 20 69 66  is finalized, if
c1b0: 20 72 75 6e 6e 69 6e 67 20 69 6e 20 6e 6f 6e 2d   running in non-
c1c0: 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20  exclusive mode, 
c1d0: 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 6d 6f 76  the.** pager mov
c1e0: 65 73 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  es to PAGER_SHAR
c1f0: 45 44 20 73 74 61 74 65 20 28 61 6e 64 20 64 6f  ED state (and do
c200: 77 6e 67 72 61 64 65 73 20 74 68 65 20 6c 6f 63  wngrades the loc
c210: 6b 20 6f 6e 20 74 68 65 0a 2a 2a 20 64 61 74 61  k on the.** data
c220: 62 61 73 65 20 66 69 6c 65 20 61 63 63 6f 72 64  base file accord
c230: 69 6e 67 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  ingly)..**.** If
c240: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75   the pager is ru
c250: 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69  nning in exclusi
c260: 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 73 20 69  ve mode and is i
c270: 6e 20 50 41 47 45 52 5f 53 59 4e 43 45 44 20 73  n PAGER_SYNCED s
c280: 74 61 74 65 2c 0a 2a 2a 20 69 74 20 6d 6f 76 65  tate,.** it move
c290: 73 20 74 6f 20 50 41 47 45 52 5f 45 58 43 4c 55  s to PAGER_EXCLU
c2a0: 53 49 56 45 2e 20 4e 6f 20 6c 6f 63 6b 73 20 61  SIVE. No locks a
c2b0: 72 65 20 64 6f 77 6e 67 72 61 64 65 64 20 77 68  re downgraded wh
c2c0: 65 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 0a 2a 2a  en running in.**
c2d0: 20 65 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2e   exclusive mode.
c2e0: 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  .**.** SQLITE_OK
c2f0: 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
c300: 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e  no error occurs.
c310: 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
c320: 75 72 73 20 64 75 72 69 6e 67 0a 2a 2a 20 61 6e  urs during.** an
c330: 79 20 6f 66 20 74 68 65 20 49 4f 20 6f 70 65 72  y of the IO oper
c340: 61 74 69 6f 6e 73 20 74 6f 20 66 69 6e 61 6c 69  ations to finali
c350: 7a 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ze the journal f
c360: 69 6c 65 20 6f 72 20 75 6e 6c 6f 63 6b 20 74 68  ile or unlock th
c370: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 74 68  e.** database th
c380: 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20  en the IO error 
c390: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
c3a0: 20 74 6f 20 74 68 65 20 75 73 65 72 2e 20 49 66   to the user. If
c3b0: 20 74 68 65 20 0a 2a 2a 20 6f 70 65 72 61 74 69   the .** operati
c3c0: 6f 6e 20 74 6f 20 66 69 6e 61 6c 69 7a 65 20 74  on to finalize t
c3d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c3e0: 66 61 69 6c 73 2c 20 74 68 65 6e 20 74 68 65 20  fails, then the 
c3f0: 63 6f 64 65 20 73 74 69 6c 6c 0a 2a 2a 20 74 72  code still.** tr
c400: 69 65 73 20 74 6f 20 75 6e 6c 6f 63 6b 20 74 68  ies to unlock th
c410: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c420: 69 66 20 6e 6f 74 20 69 6e 20 65 78 63 6c 75 73  if not in exclus
c430: 69 76 65 20 6d 6f 64 65 2e 20 49 66 20 74 68 65  ive mode. If the
c440: 0a 2a 2a 20 75 6e 6c 6f 63 6b 20 6f 70 65 72 61  .** unlock opera
c450: 74 69 6f 6e 20 66 61 69 6c 73 20 61 73 20 77 65  tion fails as we
c460: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  ll, then the fir
c470: 73 74 20 65 72 72 6f 72 20 63 6f 64 65 20 72 65  st error code re
c480: 6c 61 74 65 64 0a 2a 2a 20 74 6f 20 74 68 65 20  lated.** to the 
c490: 66 69 72 73 74 20 65 72 72 6f 72 20 65 6e 63 6f  first error enco
c4a0: 75 6e 74 65 72 65 64 20 28 74 68 65 20 6a 6f 75  untered (the jou
c4b0: 72 6e 61 6c 20 66 69 6e 61 6c 69 7a 61 74 69 6f  rnal finalizatio
c4c0: 6e 20 6f 6e 65 29 20 69 73 0a 2a 2a 20 72 65 74  n one) is.** ret
c4d0: 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  urned..*/.static
c4e0: 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64 5f 74   int pager_end_t
c4f0: 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67 65 72  ransaction(Pager
c500: 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 68 61   *pPager, int ha
c510: 73 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  sMaster){.  int 
c520: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20  rc = SQLITE_OK; 
c530: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c540: 64 65 20 66 72 6f 6d 20 6a 6f 75 72 6e 61 6c 20  de from journal 
c550: 66 69 6e 61 6c 69 7a 61 74 69 6f 6e 20 6f 70 65  finalization ope
c560: 72 61 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20  ration */.  int 
c570: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
c580: 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f       /* Error co
c590: 64 65 20 66 72 6f 6d 20 64 62 20 66 69 6c 65 20  de from db file 
c5a0: 75 6e 6c 6f 63 6b 20 6f 70 65 72 61 74 69 6f 6e  unlock operation
c5b0: 20 2a 2f 0a 0a 20 20 69 66 28 20 70 50 61 67 65   */..  if( pPage
c5c0: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
c5d0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
c5e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
c5f0: 0a 20 20 7d 0a 20 20 72 65 6c 65 61 73 65 41 6c  .  }.  releaseAl
c600: 6c 53 61 76 65 70 6f 69 6e 74 73 28 70 50 61 67  lSavepoints(pPag
c610: 65 72 29 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  er);..  assert( 
c620: 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
c630: 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  fd) || pPager->p
c640: 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
c650: 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
c660: 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 0a 20 20  ger->jfd) ){..  
c670: 20 20 2f 2a 20 54 4f 44 4f 3a 20 54 68 65 72 65    /* TODO: There
c680: 27 73 20 61 20 70 72 6f 62 6c 65 6d 20 68 65 72  's a problem her
c690: 65 20 69 66 20 61 20 6a 6f 75 72 6e 61 6c 2d 66  e if a journal-f
c6a0: 69 6c 65 20 77 61 73 20 6f 70 65 6e 65 64 20 69  ile was opened i
c6b0: 6e 20 4d 45 4d 4f 52 59 0a 20 20 20 20 2a 2a 20  n MEMORY.    ** 
c6c0: 6d 6f 64 65 20 61 6e 64 20 74 68 65 6e 20 74 68  mode and then th
c6d0: 65 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69  e journal-mode i
c6e0: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 52 55  s changed to TRU
c6f0: 4e 43 41 54 45 20 6f 72 20 50 45 52 53 49 53 54  NCATE or PERSIST
c700: 0a 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74  .    ** during t
c710: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20  he transaction. 
c720: 54 68 69 73 20 63 6f 64 65 20 73 68 6f 75 6c 64  This code should
c730: 20 62 65 20 63 68 61 6e 67 65 64 20 74 6f 20 61   be changed to a
c740: 73 73 75 6d 65 0a 20 20 20 20 2a 2a 20 74 68 61  ssume.    ** tha
c750: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 6f  t the journal mo
c760: 64 65 20 68 61 73 20 6e 6f 74 20 63 68 61 6e 67  de has not chang
c770: 65 64 20 73 69 6e 63 65 20 74 68 65 20 74 72 61  ed since the tra
c780: 6e 73 61 63 74 69 6f 6e 20 77 61 73 0a 20 20 20  nsaction was.   
c790: 20 2a 2a 20 73 74 61 72 74 65 64 2e 20 41 6e 64   ** started. And
c7a0: 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67 65   the sqlite3Page
c7b0: 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 29 20 66  rJournalMode() f
c7c0: 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62  unction should b
c7d0: 65 0a 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 64  e.    ** changed
c7e0: 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68   to make sure th
c7f0: 61 74 20 74 68 69 73 20 69 73 20 74 68 65 20 63  at this is the c
c800: 61 73 65 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  ase too..    */.
c810: 0a 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65  .    /* Finalize
c820: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
c830: 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50  e. */.    if( pP
c840: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
c850: 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
c860: 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
c870: 20 20 20 20 20 69 6e 74 20 69 73 4d 65 6d 6f 72       int isMemor
c880: 79 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74  yJournal = sqlit
c890: 65 33 49 73 4d 65 6d 4a 6f 75 72 6e 61 6c 28 70  e3IsMemJournal(p
c8a0: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
c8b0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
c8c0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
c8d0: 20 20 20 20 20 20 69 66 28 20 21 69 73 4d 65 6d        if( !isMem
c8e0: 6f 72 79 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  oryJournal ){.  
c8f0: 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
c900: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
c910: 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
c920: 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
c930: 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
c940: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
c950: 72 6e 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  rnalMode==PAGER_
c960: 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e  JOURNALMODE_TRUN
c970: 43 41 54 45 20 29 7b 0a 20 20 20 20 20 20 72 63  CATE ){.      rc
c980: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
c990: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
c9a0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
c9b0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c9c0: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
c9d0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
c9e0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 0;.    }else 
c9f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  if( pPager->excl
ca00: 75 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 20 20  usiveMode .     
ca10: 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
ca20: 61 6c 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f  alMode==PAGER_JO
ca30: 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
ca40: 54 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  T.    ){.      r
ca50: 63 20 3d 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48  c = zeroJournalH
ca60: 64 72 28 70 50 61 67 65 72 2c 20 68 61 73 4d 61  dr(pPager, hasMa
ca70: 73 74 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67  ster);.      pag
ca80: 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
ca90: 20 72 63 29 3b 0a 20 20 20 20 20 20 70 50 61 67   rc);.      pPag
caa0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
cab0: 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   0;.      pPager
cac0: 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
cad0: 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
cae0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
caf0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
cb00: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
cb10: 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 20  LMODE_DELETE || 
cb20: 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  rc );.      sqli
cb30: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
cb40: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 69  r->jfd);.      i
cb50: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
cb60: 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
cb70: 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
cb80: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44   rc = sqlite3OsD
cb90: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56  elete(pPager->pV
cba0: 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
cbb0: 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
cbc0: 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  }.    }..#ifdef 
cbd0: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
cbe0: 45 53 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63  ES.    sqlite3Pc
cbf0: 61 63 68 65 49 74 65 72 61 74 65 44 69 72 74 79  acheIterateDirty
cc00: 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
cc10: 2c 20 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  , pager_set_page
cc20: 68 61 73 68 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  hash);.#endif.. 
cc30: 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65     sqlite3Pcache
cc40: 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72 2d  CleanAll(pPager-
cc50: 3e 70 50 43 61 63 68 65 29 3b 0a 20 20 20 20 73  >pPCache);.    s
cc60: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
cc70: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
cc80: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61  ournal);.    pPa
cc90: 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
cca0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
ccb0: 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 0a  >nRec = 0;.  }..
ccc0: 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 65    if( !pPager->e
ccd0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 7b 0a  xclusiveMode ){.
cce0: 20 20 20 20 72 63 32 20 3d 20 6f 73 55 6e 6c 6f      rc2 = osUnlo
ccf0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  ck(pPager->fd, S
cd00: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  HARED_LOCK);.   
cd10: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
cd20: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
cd30: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
cd40: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
cd50: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61 67    }else if( pPag
cd60: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
cd70: 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20 70  _SYNCED ){.    p
cd80: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
cd90: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
cda0: 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 65    }.  pPager->se
cdb0: 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70  tMaster = 0;.  p
cdc0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
cdd0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64  = 0;.  pPager->d
cde0: 62 4d 6f 64 69 66 69 65 64 20 3d 20 30 3b 0a 0a  bModified = 0;..
cdf0: 20 20 2f 2a 20 54 4f 44 4f 3a 20 49 73 20 74 68    /* TODO: Is th
ce00: 69 73 20 6f 70 74 69 6d 61 6c 3f 20 57 68 79 20  is optimal? Why 
ce10: 69 73 20 74 68 65 20 64 62 20 73 69 7a 65 20 69  is the db size i
ce20: 6e 76 61 6c 69 64 61 74 65 64 20 68 65 72 65 20  nvalidated here 
ce30: 0a 20 20 2a 2a 20 77 68 65 6e 20 74 68 65 20 64  .  ** when the d
ce40: 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
ce50: 6e 6f 74 20 75 6e 6c 6f 63 6b 65 64 3f 20 2a 2f  not unlocked? */
ce60: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  .  pPager->dbOri
ce70: 67 53 69 7a 65 20 3d 20 30 3b 0a 20 20 73 71 6c  gSize = 0;.  sql
ce80: 69 74 65 33 50 63 61 63 68 65 54 72 75 6e 63 61  ite3PcacheTrunca
ce90: 74 65 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63  te(pPager->pPCac
cea0: 68 65 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  he, pPager->dbSi
ceb0: 7a 65 29 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  ze);.  if( !MEMD
cec0: 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
ced0: 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30  >dbSizeValid = 0
cee0: 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
cef0: 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72  (rc==SQLITE_OK?r
cf00: 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  c2:rc);.}../*.**
cf10: 20 50 61 72 61 6d 65 74 65 72 20 61 44 61 74 61   Parameter aData
cf20: 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61   must point to a
cf30: 20 62 75 66 66 65 72 20 6f 66 20 70 50 61 67 65   buffer of pPage
cf40: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
cf50: 73 0a 2a 2a 20 6f 66 20 64 61 74 61 2e 20 43 6f  s.** of data. Co
cf60: 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e  mpute and return
cf70: 20 61 20 63 68 65 63 6b 73 75 6d 20 62 61 73 65   a checksum base
cf80: 64 20 6f 6e 74 20 74 68 65 20 63 6f 6e 74 65 6e  d ont the conten
cf90: 74 73 20 6f 66 20 74 68 65 20 0a 2a 2a 20 70 61  ts of the .** pa
cfa0: 67 65 20 6f 66 20 64 61 74 61 20 61 6e 64 20 74  ge of data and t
cfb0: 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65  he current value
cfc0: 20 6f 66 20 70 50 61 67 65 72 2d 3e 63 6b 73 75   of pPager->cksu
cfd0: 6d 49 6e 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mInit..**.** Thi
cfe0: 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20  s is not a real 
cff0: 63 68 65 63 6b 73 75 6d 2e 20 49 74 20 69 73 20  checksum. It is 
d000: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
d010: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
d020: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
d030: 6c 75 65 20 28 70 50 61 67 65 72 2d 3e 63 6b 73  lue (pPager->cks
d040: 75 6d 49 6e 69 74 29 20 61 6e 64 20 65 76 65 72  umInit) and ever
d050: 79 20 32 30 30 74 68 20 62 79 74 65 0a 2a 2a 20  y 200th byte.** 
d060: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
d070: 2c 20 73 74 61 72 74 69 6e 67 20 77 69 74 68 20  , starting with 
d080: 62 79 74 65 20 6f 66 66 73 65 74 20 28 70 50 61  byte offset (pPa
d090: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 25 32 30  ger->pageSize%20
d0a0: 30 29 2e 0a 2a 2a 20 45 61 63 68 20 62 79 74 65  0)..** Each byte
d0b0: 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
d0c0: 61 73 20 61 6e 20 38 2d 62 69 74 20 75 6e 73 69  as an 8-bit unsi
d0d0: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2a  gned integer..**
d0e0: 0a 2a 2a 20 43 68 61 6e 67 69 6e 67 20 74 68 65  .** Changing the
d0f0: 20 66 6f 72 6d 75 6c 61 20 75 73 65 64 20 74 6f   formula used to
d100: 20 63 6f 6d 70 75 74 65 20 74 68 69 73 20 63 68   compute this ch
d110: 65 63 6b 73 75 6d 20 72 65 73 75 6c 74 73 20 69  ecksum results i
d120: 6e 20 61 6e 0a 2a 2a 20 69 6e 63 6f 6d 70 61 74  n an.** incompat
d130: 69 62 6c 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ible journal fil
d140: 65 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  e format..**.** 
d150: 49 66 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75  If journal corru
d160: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
d170: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
d180: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
d190: 6b 65 6c 79 20 0a 2a 2a 20 73 63 65 6e 61 72 69  kely .** scenari
d1a0: 6f 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e  o is that one en
d1b0: 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f  d or the other o
d1c0: 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c  f the record wil
d1d0: 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 0a 2a  l be changed. .*
d1e0: 2a 20 49 74 20 69 73 20 6d 75 63 68 20 6c 65 73  * It is much les
d1f0: 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68  s likely that th
d200: 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68  e two ends of th
d210: 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64  e journal record
d220: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72   will be.** corr
d230: 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64  ect and the midd
d240: 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20  le be corrupt.  
d250: 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63  Thus, this "chec
d260: 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a  ksum" scheme,.**
d270: 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64   though fast and
d280: 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73   simple, catches
d290: 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65   the mostly like
d2a0: 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75  ly kind of corru
d2b0: 70 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ption..*/.static
d2c0: 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d   u32 pager_cksum
d2d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
d2e0: 63 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29  const u8 *aData)
d2f0: 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20  {.  u32 cksum = 
d300: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
d310: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  t;         /* Ch
d320: 65 63 6b 73 75 6d 20 76 61 6c 75 65 20 74 6f 20  ecksum value to 
d330: 72 65 74 75 72 6e 20 2a 2f 0a 20 20 69 6e 74 20  return */.  int 
d340: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
d350: 53 69 7a 65 2d 32 30 30 3b 20 20 20 20 20 20 20  Size-200;       
d360: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
d370: 65 72 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 69  er */.  while( i
d380: 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  >0 ){.    cksum 
d390: 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20  += aData[i];.   
d3a0: 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20   i -= 200;.  }. 
d3b0: 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d   return cksum;.}
d3c0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73  ../*.** Read a s
d3d0: 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20  ingle page from 
d3e0: 65 69 74 68 65 72 20 74 68 65 20 6a 6f 75 72 6e  either the journ
d3f0: 61 6c 20 66 69 6c 65 20 28 69 66 20 69 73 4d 61  al file (if isMa
d400: 69 6e 4a 72 6e 6c 3d 3d 31 29 20 6f 72 0a 2a 2a  inJrnl==1) or.**
d410: 20 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f   from the sub-jo
d420: 75 72 6e 61 6c 20 28 69 66 20 69 73 4d 61 69 6e  urnal (if isMain
d430: 4a 72 6e 6c 3d 3d 30 29 20 61 6e 64 20 70 6c 61  Jrnl==0) and pla
d440: 79 62 61 63 6b 20 74 68 61 74 20 70 61 67 65 2e  yback that page.
d450: 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 62 65 67  .** The page beg
d460: 69 6e 73 20 61 74 20 6f 66 66 73 65 74 20 2a 70  ins at offset *p
d470: 4f 66 66 73 65 74 20 69 6e 74 6f 20 74 68 65 20  Offset into the 
d480: 66 69 6c 65 2e 20 54 68 65 20 2a 70 4f 66 66 73  file. The *pOffs
d490: 65 74 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 69  et.** value is i
d4a0: 6e 63 72 65 61 73 65 64 20 74 6f 20 74 68 65 20  ncreased to the 
d4b0: 73 74 61 72 74 20 6f 66 20 74 68 65 20 6e 65 78  start of the nex
d4c0: 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  t page in the jo
d4d0: 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  urnal..**.** The
d4e0: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 66 6c 61 67   isMainJrnl flag
d4f0: 20 69 73 20 74 72 75 65 20 69 66 20 74 68 69 73   is true if this
d500: 20 69 73 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c   is the main rol
d510: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 61 6e  lback journal an
d520: 64 0a 2a 2a 20 66 61 6c 73 65 20 66 6f 72 20 74  d.** false for t
d530: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
d540: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 69 6e 20  rnal.  The main 
d550: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
d560: 20 75 73 65 73 0a 2a 2a 20 63 68 65 63 6b 73 75   uses.** checksu
d570: 6d 73 20 2d 20 74 68 65 20 73 74 61 74 65 6d 65  ms - the stateme
d580: 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
d590: 6e 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  not..**.** If th
d5a0: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66  e page number of
d5b0: 20 74 68 65 20 70 61 67 65 20 72 65 63 6f 72 64   the page record
d5c0: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 28   read from the (
d5d0: 73 75 62 2d 29 6a 6f 75 72 6e 61 6c 20 66 69 6c  sub-)journal fil
d5e0: 65 0a 2a 2a 20 69 73 20 67 72 65 61 74 65 72 20  e.** is greater 
d5f0: 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e 74  than the current
d600: 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65 72 2e   value of Pager.
d610: 64 62 53 69 7a 65 2c 20 74 68 65 6e 20 70 6c 61  dbSize, then pla
d620: 79 62 61 63 6b 20 69 73 0a 2a 2a 20 73 6b 69 70  yback is.** skip
d630: 70 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ped and SQLITE_O
d640: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  K is returned..*
d650: 2a 0a 2a 2a 20 49 66 20 70 44 6f 6e 65 20 69 73  *.** If pDone is
d660: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 6e 20   not NULL, then 
d670: 69 74 20 69 73 20 61 20 72 65 63 6f 72 64 20 6f  it is a record o
d680: 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
d690: 65 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  e already.** bee
d6a0: 6e 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 20 20  n played back.  
d6b0: 49 66 20 74 68 65 20 70 61 67 65 20 61 74 20 2a  If the page at *
d6c0: 70 4f 66 66 73 65 74 20 68 61 73 20 61 6c 72 65  pOffset has alre
d6d0: 61 64 79 20 62 65 65 6e 20 70 6c 61 79 65 64 20  ady been played 
d6e0: 62 61 63 6b 0a 2a 2a 20 28 69 66 20 74 68 65 20  back.** (if the 
d6f0: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 70 44  corresponding pD
d700: 6f 6e 65 20 62 69 74 20 69 73 20 73 65 74 29 20  one bit is set) 
d710: 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 70 6c  then skip the pl
d720: 61 79 62 61 63 6b 2e 0a 2a 2a 20 4d 61 6b 65 20  ayback..** Make 
d730: 73 75 72 65 20 74 68 65 20 70 44 6f 6e 65 20 62  sure the pDone b
d740: 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
d750: 20 74 6f 20 74 68 65 20 2a 70 4f 66 66 73 65 74   to the *pOffset
d760: 20 70 61 67 65 20 69 73 20 73 65 74 0a 2a 2a 20   page is set.** 
d770: 70 72 69 6f 72 20 74 6f 20 72 65 74 75 72 6e 69  prior to returni
d780: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ng..**.** If the
d790: 20 70 61 67 65 20 72 65 63 6f 72 64 20 69 73 20   page record is 
d7a0: 73 75 63 63 65 73 73 66 75 6c 6c 79 20 72 65 61  successfully rea
d7b0: 64 20 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d  d from the (sub-
d7c0: 29 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a  )journal file.**
d7d0: 20 61 6e 64 20 70 6c 61 79 65 64 20 62 61 63 6b   and played back
d7e0: 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f 4b  , then SQLITE_OK
d7f0: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
d800: 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
d810: 75 72 73 0a 2a 2a 20 77 68 69 6c 65 20 72 65 61  urs.** while rea
d820: 64 69 6e 67 20 74 68 65 20 72 65 63 6f 72 64 20  ding the record 
d830: 66 72 6f 6d 20 74 68 65 20 28 73 75 62 2d 29 6a  from the (sub-)j
d840: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72 20 77  ournal file or w
d850: 68 69 6c 65 20 77 72 69 74 69 6e 67 0a 2a 2a 20  hile writing.** 
d860: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
d870: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 49  file, then the I
d880: 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  O error code is 
d890: 72 65 74 75 72 6e 65 64 2e 20 49 66 20 64 61 74  returned. If dat
d8a0: 61 0a 2a 2a 20 69 73 20 73 75 63 63 65 73 73 66  a.** is successf
d8b0: 75 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 74  ully read from t
d8c0: 68 65 20 28 73 75 62 2d 29 6a 6f 75 72 6e 61 6c  he (sub-)journal
d8d0: 20 66 69 6c 65 20 62 75 74 20 61 70 70 65 61 72   file but appear
d8e0: 73 20 74 6f 20 62 65 0a 2a 2a 20 63 6f 72 72 75  s to be.** corru
d8f0: 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e  pted, SQLITE_DON
d900: 45 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 44  E is returned. D
d910: 61 74 61 20 69 73 20 63 6f 6e 73 69 64 65 72 65  ata is considere
d920: 64 20 63 6f 72 72 75 70 74 65 64 20 69 6e 0a 2a  d corrupted in.*
d930: 2a 20 74 77 6f 20 63 69 72 63 75 6d 73 74 61 6e  * two circumstan
d940: 63 65 73 3a 0a 2a 2a 20 0a 2a 2a 20 20 20 2a 20  ces:.** .**   * 
d950: 49 66 20 74 68 65 20 72 65 63 6f 72 64 20 70 61  If the record pa
d960: 67 65 2d 6e 75 6d 62 65 72 20 69 73 20 69 6c 6c  ge-number is ill
d970: 65 67 61 6c 20 28 30 20 6f 72 20 50 41 47 45 52  egal (0 or PAGER
d980: 5f 4d 4a 5f 50 47 4e 4f 29 2c 20 6f 72 0a 2a 2a  _MJ_PGNO), or.**
d990: 20 20 20 2a 20 49 66 20 74 68 65 20 72 65 63 6f     * If the reco
d9a0: 72 64 20 69 73 20 62 65 69 6e 67 20 72 6f 6c 6c  rd is being roll
d9b0: 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  ed back from the
d9c0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
d9d0: 6c 65 0a 2a 2a 20 20 20 20 20 61 6e 64 20 74 68  le.**     and th
d9e0: 65 20 63 68 65 63 6b 73 75 6d 20 66 69 65 6c 64  e checksum field
d9f0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
da00: 74 68 65 20 72 65 63 6f 72 64 20 63 6f 6e 74 65  the record conte
da10: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 4e 65 69 74 68 65  nt..**.** Neithe
da20: 72 20 6f 66 20 74 68 65 73 65 20 74 77 6f 20 73  r of these two s
da30: 63 65 6e 61 72 69 6f 73 20 61 72 65 20 70 6f 73  cenarios are pos
da40: 73 69 62 6c 65 20 64 75 72 69 6e 67 20 61 20 73  sible during a s
da50: 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61 63  avepoint rollbac
da60: 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69 73  k..**.** If this
da70: 20 69 73 20 61 20 73 61 76 65 70 6f 69 6e 74 20   is a savepoint 
da80: 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 20 6d  rollback, then m
da90: 65 6d 6f 72 79 20 6d 61 79 20 68 61 76 65 20 74  emory may have t
daa0: 6f 20 62 65 20 64 79 6e 61 6d 69 63 61 6c 6c 79  o be dynamically
dab0: 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  .** allocated by
dac0: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
dad0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 63  If this is the c
dae0: 61 73 65 20 61 6e 64 20 61 6e 20 61 6c 6c 6f 63  ase and an alloc
daf0: 61 74 69 6f 6e 20 66 61 69 6c 73 2c 0a 2a 2a 20  ation fails,.** 
db00: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 69 73 20  SQLITE_NOMEM is 
db10: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
db20: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
db30: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
db40: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
db50: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
db60: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 62 65   /* The pager be
db70: 69 6e 67 20 70 6c 61 79 65 64 20 62 61 63 6b 20  ing played back 
db80: 2a 2f 0a 20 20 69 6e 74 20 69 73 4d 61 69 6e 4a  */.  int isMainJ
db90: 72 6e 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  rnl,            
dba0: 20 20 20 2f 2a 20 31 20 2d 3e 20 6d 61 69 6e 20     /* 1 -> main 
dbb0: 6a 6f 75 72 6e 61 6c 2e 20 30 20 2d 3e 20 73 75  journal. 0 -> su
dbc0: 62 2d 6a 6f 75 72 6e 61 6c 2e 20 2a 2f 0a 20 20  b-journal. */.  
dbd0: 69 6e 74 20 69 73 55 6e 73 79 6e 63 2c 20 20 20  int isUnsync,   
dbe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dbf0: 20 54 72 75 65 20 69 66 20 72 65 61 64 69 6e 67   True if reading
dc00: 20 66 72 6f 6d 20 75 6e 73 79 6e 63 65 64 20 6d   from unsynced m
dc10: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ain journal */. 
dc20: 20 69 36 34 20 2a 70 4f 66 66 73 65 74 2c 20 20   i64 *pOffset,  
dc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
dc40: 2a 20 4f 66 66 73 65 74 20 6f 66 20 72 65 63 6f  * Offset of reco
dc50: 72 64 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 2a  rd to playback *
dc60: 2f 0a 20 20 69 6e 74 20 69 73 53 61 76 65 70 6e  /.  int isSavepn
dc70: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t,              
dc80: 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20    /* True for a 
dc90: 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
dca0: 63 6b 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  ck */.  Bitvec *
dcb0: 70 44 6f 6e 65 20 20 20 20 20 20 20 20 20 20 20  pDone           
dcc0: 20 20 20 20 20 20 2f 2a 20 42 69 74 76 65 63 20        /* Bitvec 
dcd0: 6f 66 20 70 61 67 65 73 20 61 6c 72 65 61 64 79  of pages already
dce0: 20 70 6c 61 79 65 64 20 62 61 63 6b 20 2a 2f 0a   played back */.
dcf0: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50  ){.  int rc;.  P
dd00: 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20  gHdr *pPg;      
dd10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
dd20: 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65  An existing page
dd30: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f   in the cache */
dd40: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
dd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
dd60: 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d   /* The page num
dd70: 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e  ber of a page in
dd80: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33   journal */.  u3
dd90: 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20  2 cksum;        
dda0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
ddb0: 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72  hecksum used for
ddc0: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
ddd0: 20 2a 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 3b   */.  u8 *aData;
dde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ddf0: 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
de00: 20 73 74 6f 72 61 67 65 20 66 6f 72 20 74 68 65   storage for the
de10: 20 70 61 67 65 20 2a 2f 0a 20 20 73 71 6c 69 74   page */.  sqlit
de20: 65 33 5f 66 69 6c 65 20 2a 6a 66 64 3b 20 20 20  e3_file *jfd;   
de30: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
de40: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
de50: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
de60: 66 69 6c 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  file */..  asser
de70: 74 28 20 28 69 73 4d 61 69 6e 4a 72 6e 6c 26 7e  t( (isMainJrnl&~
de80: 31 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 2f 2a  1)==0 );      /*
de90: 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 69 73 20 30   isMainJrnl is 0
dea0: 20 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72   or 1 */.  asser
deb0: 74 28 20 28 69 73 53 61 76 65 70 6e 74 26 7e 31  t( (isSavepnt&~1
dec0: 29 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 2f 2a  )==0 );       /*
ded0: 20 69 73 53 61 76 65 70 6e 74 20 69 73 20 30 20   isSavepnt is 0 
dee0: 6f 72 20 31 20 2a 2f 0a 20 20 61 73 73 65 72 74  or 1 */.  assert
def0: 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 7c 7c 20  ( isMainJrnl || 
df00: 70 44 6f 6e 65 20 29 3b 20 20 20 20 20 2f 2a 20  pDone );     /* 
df10: 70 44 6f 6e 65 20 61 6c 77 61 79 73 20 75 73 65  pDone always use
df20: 64 20 6f 6e 20 73 75 62 2d 6a 6f 75 72 6e 61 6c  d on sub-journal
df30: 73 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 69  s */.  assert( i
df40: 73 53 61 76 65 70 6e 74 20 7c 7c 20 70 44 6f 6e  sSavepnt || pDon
df50: 65 3d 3d 30 20 29 3b 20 20 20 2f 2a 20 70 44 6f  e==0 );   /* pDo
df60: 6e 65 20 6e 65 76 65 72 20 75 73 65 64 20 6f 6e  ne never used on
df70: 20 6e 6f 6e 2d 73 61 76 65 70 6f 69 6e 74 20 2a   non-savepoint *
df80: 2f 0a 0a 20 20 61 44 61 74 61 20 3d 20 28 75 38  /..  aData = (u8
df90: 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  *)pPager->pTmpSp
dfa0: 61 63 65 3b 0a 20 20 61 73 73 65 72 74 28 20 61  ace;.  assert( a
dfb0: 44 61 74 61 20 29 3b 20 20 20 20 20 20 20 20 20  Data );         
dfc0: 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20  /* Temp storage 
dfd0: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
dfe0: 79 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  y been allocated
dff0: 20 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74   */..  /* Read t
e000: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61  he page number a
e010: 6e 64 20 70 61 67 65 20 64 61 74 61 20 66 72 6f  nd page data fro
e020: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6f 72  m the journal or
e030: 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 20 20 2a   sub-journal.  *
e040: 2a 20 66 69 6c 65 2e 20 52 65 74 75 72 6e 20 61  * file. Return a
e050: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 74 6f 20  n error code to 
e060: 74 68 65 20 63 61 6c 6c 65 72 20 69 66 20 61 6e  the caller if an
e070: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
e080: 2e 0a 20 20 2a 2f 0a 20 20 6a 66 64 20 3d 20 69  ..  */.  jfd = i
e090: 73 4d 61 69 6e 4a 72 6e 6c 20 3f 20 70 50 61 67  sMainJrnl ? pPag
e0a0: 65 72 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72  er->jfd : pPager
e0b0: 2d 3e 73 6a 66 64 3b 0a 20 20 72 63 20 3d 20 72  ->sjfd;.  rc = r
e0c0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 2a  ead32bits(jfd, *
e0d0: 70 4f 66 66 73 65 74 2c 20 26 70 67 6e 6f 29 3b  pOffset, &pgno);
e0e0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e0f0: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
e100: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
e110: 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44 61 74  OsRead(jfd, aDat
e120: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
e130: 69 7a 65 2c 20 28 2a 70 4f 66 66 73 65 74 29 2b  ize, (*pOffset)+
e140: 34 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  4);.  if( rc!=SQ
e150: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
e160: 20 72 63 3b 0a 20 20 2a 70 4f 66 66 73 65 74 20   rc;.  *pOffset 
e170: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
e180: 69 7a 65 20 2b 20 34 20 2b 20 69 73 4d 61 69 6e  ize + 4 + isMain
e190: 4a 72 6e 6c 2a 34 3b 0a 0a 20 20 2f 2a 20 53 61  Jrnl*4;..  /* Sa
e1a0: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e  nity checking on
e1b0: 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69 73   the page.  This
e1c0: 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61   is more importa
e1d0: 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e  nt that I origin
e1e0: 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68  ally.  ** though
e1f0: 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20 66  t.  If a power f
e200: 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68  ailure occurs wh
e210: 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ile the journal 
e220: 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  is being written
e230: 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20  ,.  ** it could 
e240: 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61  cause invalid da
e250: 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ta to be written
e260: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
e270: 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20  l.  We need to. 
e280: 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73 20   ** detect this 
e290: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77 69  invalid data (wi
e2a0: 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c  th high probabil
e2b0: 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20  ity) and ignore 
e2c0: 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  it..  */.  if( p
e2d0: 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d  gno==0 || pgno==
e2e0: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
e2f0: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 61 73 73  ager) ){.    ass
e300: 65 72 74 28 20 21 69 73 53 61 76 65 70 6e 74 20  ert( !isSavepnt 
e310: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
e320: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
e330: 20 69 66 28 20 70 67 6e 6f 3e 28 50 67 6e 6f 29   if( pgno>(Pgno)
e340: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 7c  pPager->dbSize |
e350: 7c 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54  | sqlite3BitvecT
e360: 65 73 74 28 70 44 6f 6e 65 2c 20 70 67 6e 6f 29  est(pDone, pgno)
e370: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
e380: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
e390: 69 66 28 20 69 73 4d 61 69 6e 4a 72 6e 6c 20 29  if( isMainJrnl )
e3a0: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
e3b0: 32 62 69 74 73 28 6a 66 64 2c 20 28 2a 70 4f 66  2bits(jfd, (*pOf
e3c0: 66 73 65 74 29 2d 34 2c 20 26 63 6b 73 75 6d 29  fset)-4, &cksum)
e3d0: 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  ;.    if( rc ) r
e3e0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 69 66  eturn rc;.    if
e3f0: 28 20 21 69 73 53 61 76 65 70 6e 74 20 26 26 20  ( !isSavepnt && 
e400: 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
e410: 65 72 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  er, aData)!=cksu
e420: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
e430: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
e440: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
e450: 70 44 6f 6e 65 20 26 26 20 28 72 63 20 3d 20 73  pDone && (rc = s
e460: 71 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28  qlite3BitvecSet(
e470: 70 44 6f 6e 65 2c 20 70 67 6e 6f 29 29 21 3d 53  pDone, pgno))!=S
e480: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
e490: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
e4a0: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e4b0: 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
e4c0: 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65  ESERVED || pPage
e4d0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
e4e0: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20  EXCLUSIVE );..  
e4f0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
e500: 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20 73  is in RESERVED s
e510: 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65  tate, then there
e520: 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79 20   must be a copy 
e530: 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67  of this.  ** pag
e540: 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20 63  e in the pager c
e550: 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61  ache. In this ca
e560: 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20 74  se just update t
e570: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a  he pager cache,.
e580: 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74    ** not the dat
e590: 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
e5a0: 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72  page is left mar
e5b0: 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68 69  ked dirty in thi
e5c0: 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a  s case..  **.  *
e5d0: 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74  * An exception t
e5e0: 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65  o the above rule
e5f0: 3a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  : If the databas
e600: 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  e is in no-sync 
e610: 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20  mode.  ** and a 
e620: 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75  page is moved du
e630: 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e  ring an incremen
e640: 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20  tal vacuum then 
e650: 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a  the page may.  *
e660: 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  * not be in the 
e670: 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74  pager cache. Lat
e680: 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28  er: if a malloc(
e690: 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63  ) or IO error oc
e6a0: 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67  curs.  ** during
e6b0: 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61   a Movepage() ca
e6c0: 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ll, then the pag
e6d0: 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20  e may not be in 
e6e0: 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65  the cache.  ** e
e6f0: 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f  ither. So the co
e700: 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65  ndition describe
e710: 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70  d in the above p
e720: 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a  aragraph is not.
e730: 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c    ** assert()abl
e740: 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20  e..  **.  ** If 
e750: 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61  in EXCLUSIVE sta
e760: 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61  te, then we upda
e770: 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63  te the pager cac
e780: 68 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a  he if it exists.
e790: 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69    ** and the mai
e7a0: 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65  n file. The page
e7b0: 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20   is then marked 
e7c0: 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a  not dirty..  **.
e7d0: 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37    ** Ticket #117
e7e0: 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e  1:  The statemen
e7f0: 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  t journal might 
e800: 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e  contain page con
e810: 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a  tent that is.  *
e820: 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  * different from
e830: 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
e840: 74 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f  t at the start o
e850: 66 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  f the transactio
e860: 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63  n..  ** This occ
e870: 75 72 73 20 77 68 65 6e 20 61 20 70 61 67 65 20  urs when a page 
e880: 69 73 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72  is changed prior
e890: 20 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66   to the start of
e8a0: 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a   a statement.  *
e8b0: 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61  * then changed a
e8c0: 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20  gain within the 
e8d0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e  statement.  When
e8e0: 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75   rolling back su
e8f0: 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d  ch a.  ** statem
e900: 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20  ent we must not 
e910: 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69  write to the ori
e920: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75  ginal database u
e930: 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20  nless we know.  
e940: 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74  ** for certain t
e950: 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  hat original pag
e960: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73  e contents are s
e970: 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d  ynced into the m
e980: 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a  ain rollback.  *
e990: 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65  * journal.  Othe
e9a0: 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c  rwise, a power l
e9b0: 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20  oss might leave 
e9c0: 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20 69 6e  modified data in
e9d0: 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
e9e0: 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20  se file without 
e9f0: 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  an entry in the 
ea00: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
ea10: 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72   that can.  ** r
ea20: 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62  estore the datab
ea30: 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ase to its origi
ea40: 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63  nal form.  Two c
ea50: 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
ea60: 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72  e.  ** met befor
ea70: 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  e writing to the
ea80: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e   database files.
ea90: 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
eaa0: 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c  e must be.  ** l
eab0: 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b  ocked.  (2) we k
eac0: 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f 72 69  now that the ori
ead0: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
eae0: 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63  nt is fully sync
eaf0: 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d  ed.  ** in the m
eb00: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68  ain journal eith
eb10: 65 72 20 62 65 63 61 75 73 65 20 74 68 65 20 70  er because the p
eb20: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
eb30: 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a  che or else.  **
eb40: 20 74 68 65 20 70 61 67 65 20 69 73 20 6d 61 72   the page is mar
eb50: 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d  ked as needSync=
eb60: 3d 30 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 32 30  =0..  **.  ** 20
eb70: 30 38 2d 30 34 2d 31 34 3a 20 20 57 68 65 6e 20  08-04-14:  When 
eb80: 61 74 74 65 6d 70 74 69 6e 67 20 74 6f 20 76 61  attempting to va
eb90: 63 75 75 6d 20 61 20 63 6f 72 72 75 70 74 20 64  cuum a corrupt d
eba0: 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 69 74  atabase file, it
ebb0: 0a 20 20 2a 2a 20 69 73 20 70 6f 73 73 69 62 6c  .  ** is possibl
ebc0: 65 20 74 6f 20 66 61 69 6c 20 61 20 73 74 61 74  e to fail a stat
ebd0: 65 6d 65 6e 74 20 6f 6e 20 61 20 64 61 74 61 62  ement on a datab
ebe0: 61 73 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f  ase that does no
ebf0: 74 20 79 65 74 20 65 78 69 73 74 2e 0a 20 20 2a  t yet exist..  *
ec00: 2a 20 44 6f 20 6e 6f 74 20 61 74 74 65 6d 70 74  * Do not attempt
ec10: 20 74 6f 20 77 72 69 74 65 20 69 66 20 64 61 74   to write if dat
ec20: 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e  abase file has n
ec30: 65 76 65 72 20 62 65 65 6e 20 6f 70 65 6e 65 64  ever been opened
ec40: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
ec50: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
ec60: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47  er, pgno);.  PAG
ec70: 45 52 54 52 41 43 45 28 28 22 50 4c 41 59 42 41  ERTRACE(("PLAYBA
ec80: 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
ec90: 73 68 28 25 30 38 78 29 20 25 73 5c 6e 22 2c 0a  sh(%08x) %s\n",.
eca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
ecb0: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
ecc0: 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74 61  pgno, pager_data
ecd0: 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61 67  hash(pPager->pag
ece0: 65 53 69 7a 65 2c 20 61 44 61 74 61 29 2c 0a 20  eSize, aData),. 
ecf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69                (i
ed00: 73 4d 61 69 6e 4a 72 6e 6c 3f 22 6d 61 69 6e 2d  sMainJrnl?"main-
ed10: 6a 6f 75 72 6e 61 6c 22 3a 22 73 75 62 2d 6a 6f  journal":"sub-jo
ed20: 75 72 6e 61 6c 22 29 0a 20 20 29 29 3b 0a 20 20  urnal").  ));.  
ed30: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  if( (pPager->sta
ed40: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
ed50: 49 56 45 29 0a 20 20 20 26 26 20 28 70 50 67 3d  IVE).   && (pPg=
ed60: 3d 30 20 7c 7c 20 30 3d 3d 28 70 50 67 2d 3e 66  =0 || 0==(pPg->f
ed70: 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f  lags&PGHDR_NEED_
ed80: 53 59 4e 43 29 29 0a 20 20 20 26 26 20 69 73 4f  SYNC)).   && isO
ed90: 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 0a  pen(pPager->fd).
eda0: 20 20 20 26 26 20 21 69 73 55 6e 73 79 6e 63 0a     && !isUnsync.
edb0: 20 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 73    ){.    i64 ofs
edc0: 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  t = (pgno-1)*(i6
edd0: 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
ede0: 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ze;.    rc = sql
edf0: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
ee00: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
ee10: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c  Pager->pageSize,
ee20: 20 6f 66 73 74 29 3b 0a 20 20 20 20 69 66 28 20   ofst);.    if( 
ee30: 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62 46  pgno>pPager->dbF
ee40: 69 6c 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  ileSize ){.     
ee50: 20 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 53   pPager->dbFileS
ee60: 69 7a 65 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20  ize = pgno;.    
ee70: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 42 61 63  }.    sqlite3Bac
ee80: 6b 75 70 55 70 64 61 74 65 28 70 50 61 67 65 72  kupUpdate(pPager
ee90: 2d 3e 70 42 61 63 6b 75 70 2c 20 70 67 6e 6f 2c  ->pBackup, pgno,
eea0: 20 61 44 61 74 61 29 3b 0a 20 20 7d 65 6c 73 65   aData);.  }else
eeb0: 20 69 66 28 20 21 69 73 4d 61 69 6e 4a 72 6e 6c   if( !isMainJrnl
eec0: 20 26 26 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20   && pPg==0 ){.  
eed0: 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
eee0: 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 61 20  a rollback of a 
eef0: 73 61 76 65 70 6f 69 6e 74 20 61 6e 64 20 64 61  savepoint and da
ef00: 74 61 20 77 61 73 20 6e 6f 74 20 77 72 69 74 74  ta was not writt
ef10: 65 6e 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  en to.    ** the
ef20: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 74 68   database and th
ef30: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
ef40: 2d 6d 65 6d 6f 72 79 2c 20 74 68 65 72 65 20 69  -memory, there i
ef50: 73 20 61 20 70 6f 74 65 6e 74 69 61 6c 0a 20 20  s a potential.  
ef60: 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 2e 20 57 68    ** problem. Wh
ef70: 65 6e 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  en the page is n
ef80: 65 78 74 20 66 65 74 63 68 65 64 20 62 79 20 74  ext fetched by t
ef90: 68 65 20 62 2d 74 72 65 65 20 6c 61 79 65 72 2c  he b-tree layer,
efa0: 20 69 74 20 0a 20 20 20 20 2a 2a 20 77 69 6c 6c   it .    ** will
efb0: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
efc0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  e database file,
efd0: 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61   which may or ma
efe0: 79 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 2a 2a  y not be .    **
eff0: 20 63 75 72 72 65 6e 74 2e 20 0a 20 20 20 20 2a   current. .    *
f000: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 72 65 20 61  *.    ** There a
f010: 72 65 20 61 20 63 6f 75 70 6c 65 20 6f 66 20 64  re a couple of d
f020: 69 66 66 65 72 65 6e 74 20 77 61 79 73 20 74 68  ifferent ways th
f030: 69 73 20 63 61 6e 20 68 61 70 70 65 6e 2e 20 41  is can happen. A
f040: 6c 6c 20 61 72 65 20 71 75 69 74 65 0a 20 20 20  ll are quite.   
f050: 20 2a 2a 20 6f 62 73 63 75 72 65 2e 20 57 68 65   ** obscure. Whe
f060: 6e 20 72 75 6e 6e 69 6e 67 20 69 6e 20 73 79 6e  n running in syn
f070: 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 74  chronous mode, t
f080: 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61 70  his can only hap
f090: 70 65 6e 20 0a 20 20 20 20 2a 2a 20 69 66 20 74  pen .    ** if t
f0a0: 68 65 20 70 61 67 65 20 69 73 20 6f 6e 20 74 68  he page is on th
f0b0: 65 20 66 72 65 65 2d 6c 69 73 74 20 61 74 20 74  e free-list at t
f0c0: 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
f0d0: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
f0e0: 6e 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  n.    ** populat
f0f0: 65 64 2c 20 74 68 65 6e 20 6d 6f 76 65 64 20 75  ed, then moved u
f100: 73 69 6e 67 20 73 71 6c 69 74 65 33 50 61 67 65  sing sqlite3Page
f110: 72 4d 6f 76 65 70 61 67 65 28 29 2e 0a 20 20 20  rMovepage()..   
f120: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
f130: 6f 6c 75 74 69 6f 6e 20 69 73 20 74 6f 20 61 64  olution is to ad
f140: 64 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  d an in-memory p
f150: 61 67 65 20 74 6f 20 74 68 65 20 63 61 63 68 65  age to the cache
f160: 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 20 20 20 20   containing.    
f170: 2a 2a 20 74 68 65 20 64 61 74 61 20 6a 75 73 74  ** the data just
f180: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 73   read from the s
f190: 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 4d 61 72 6b  ub-journal. Mark
f1a0: 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
f1b0: 74 79 20 0a 20 20 20 20 2a 2a 20 61 6e 64 20 69  ty .    ** and i
f1c0: 66 20 74 68 65 20 70 61 67 65 72 20 72 65 71 75  f the pager requ
f1d0: 69 72 65 73 20 61 20 6a 6f 75 72 6e 61 6c 2d 73  ires a journal-s
f1e0: 79 6e 63 2c 20 74 68 65 6e 20 6d 61 72 6b 20 74  ync, then mark t
f1f0: 68 65 20 70 61 67 65 20 61 73 20 0a 20 20 20 20  he page as .    
f200: 2a 2a 20 72 65 71 75 69 72 69 6e 67 20 61 20 6a  ** requiring a j
f210: 6f 75 72 6e 61 6c 2d 73 79 6e 63 20 62 65 66 6f  ournal-sync befo
f220: 72 65 20 69 74 20 69 73 20 77 72 69 74 74 65 6e  re it is written
f230: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
f240: 65 72 74 28 20 69 73 53 61 76 65 70 6e 74 20 29  ert( isSavepnt )
f250: 3b 0a 20 20 20 20 69 66 28 20 28 72 63 20 3d 20  ;.    if( (rc = 
f260: 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
f270: 69 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  ire(pPager, pgno
f280: 2c 20 26 70 50 67 2c 20 31 29 29 21 3d 53 51 4c  , &pPg, 1))!=SQL
f290: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
f2a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
f2b0: 0a 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20  .    pPg->flags 
f2c0: 26 3d 20 7e 50 47 48 44 52 5f 4e 45 45 44 5f 52  &= ~PGHDR_NEED_R
f2d0: 45 41 44 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  EAD;.    sqlite3
f2e0: 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
f2f0: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  pPg);.  }.  if( 
f300: 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f  pPg ){.    /* No
f310: 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65   page should eve
f320: 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20  r be explicitly 
f330: 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74  rolled back that
f340: 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65   is in use, exce
f350: 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61  pt.    ** for pa
f360: 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65  ge 1 which is he
f370: 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64  ld in use in ord
f380: 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c  er to keep the l
f390: 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
f3a0: 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76  * database activ
f3b0: 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20  e. However such 
f3c0: 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f  a page may be ro
f3d0: 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72  lled back as a r
f3e0: 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20  esult.    ** of 
f3f0: 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  an internal erro
f400: 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61  r resulting in a
f410: 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c  n automatic call
f420: 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74   to.    ** sqlit
f430: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
f440: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
f450: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 70  id *pData;.    p
f460: 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74  Data = pPg->pDat
f470: 61 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  a;.    memcpy(pD
f480: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
f490: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
f4a0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
f4b0: 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
f4c0: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
f4d0: 74 65 72 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ter(pPg);.    }.
f4e0: 20 20 20 20 69 66 28 20 69 73 4d 61 69 6e 4a 72      if( isMainJr
f4f0: 6e 6c 20 26 26 20 28 21 69 73 53 61 76 65 70 6e  nl && (!isSavepn
f500: 74 20 7c 7c 20 2a 70 4f 66 66 73 65 74 3c 3d 70  t || *pOffset<=p
f510: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
f520: 72 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  r) ){.      /* I
f530: 66 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  f the contents o
f540: 66 20 74 68 69 73 20 70 61 67 65 20 77 65 72 65  f this page were
f550: 20 6a 75 73 74 20 72 65 73 74 6f 72 65 64 20 66   just restored f
f560: 72 6f 6d 20 74 68 65 20 6d 61 69 6e 20 0a 20 20  rom the main .  
f570: 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
f580: 69 6c 65 2c 20 74 68 65 6e 20 69 74 73 20 63 6f  ile, then its co
f590: 6e 74 65 6e 74 20 6d 75 73 74 20 62 65 20 61 73  ntent must be as
f5a0: 20 74 68 65 79 20 77 65 72 65 20 77 68 65 6e 20   they were when 
f5b0: 74 68 65 20 0a 20 20 20 20 20 20 2a 2a 20 74 72  the .      ** tr
f5c0: 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 66 69  ansaction was fi
f5d0: 72 73 74 20 6f 70 65 6e 65 64 2e 20 49 6e 20 74  rst opened. In t
f5e0: 68 69 73 20 63 61 73 65 20 77 65 20 63 61 6e 20  his case we can 
f5f0: 6d 61 72 6b 20 74 68 65 20 70 61 67 65 0a 20 20  mark the page.  
f600: 20 20 20 20 2a 2a 20 61 73 20 63 6c 65 61 6e 2c      ** as clean,
f610: 20 73 69 6e 63 65 20 74 68 65 72 65 20 77 69 6c   since there wil
f620: 6c 20 62 65 20 6e 6f 20 6e 65 65 64 20 74 6f 20  l be no need to 
f630: 77 72 69 74 65 20 69 74 20 6f 75 74 20 74 6f 20  write it out to 
f640: 74 68 65 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20  the..      **.  
f650: 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69 73 20      ** There is 
f660: 6f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20 74 6f  one exception to
f670: 20 74 68 69 73 20 72 75 6c 65 2e 20 49 66 20 74   this rule. If t
f680: 68 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67  he page is being
f690: 20 72 6f 6c 6c 65 64 0a 20 20 20 20 20 20 2a 2a   rolled.      **
f6a0: 20 62 61 63 6b 20 61 73 20 70 61 72 74 20 6f 66   back as part of
f6b0: 20 61 20 73 61 76 65 70 6f 69 6e 74 20 28 6f 72   a savepoint (or
f6c0: 20 73 74 61 74 65 6d 65 6e 74 29 20 72 6f 6c 6c   statement) roll
f6d0: 62 61 63 6b 20 66 72 6f 6d 20 61 6e 20 0a 20 20  back from an .  
f6e0: 20 20 20 20 2a 2a 20 75 6e 73 79 6e 63 65 64 20      ** unsynced 
f6f0: 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68 65 20 6d  portion of the m
f700: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ain journal file
f710: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 6e 6f 74  , then it is not
f720: 20 73 61 66 65 0a 20 20 20 20 20 20 2a 2a 20 74   safe.      ** t
f730: 6f 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  o mark the page 
f740: 61 73 20 63 6c 65 61 6e 2e 20 54 68 69 73 20 69  as clean. This i
f750: 73 20 62 65 63 61 75 73 65 20 6d 61 72 6b 69 6e  s because markin
f760: 67 20 74 68 65 20 70 61 67 65 20 61 73 0a 20 20  g the page as.  
f770: 20 20 20 20 2a 2a 20 63 6c 65 61 6e 20 77 69 6c      ** clean wil
f780: 6c 20 63 6c 65 61 72 20 74 68 65 20 50 47 48 44  l clear the PGHD
f790: 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67  R_NEED_SYNC flag
f7a0: 2e 20 53 69 6e 63 65 20 74 68 65 20 70 61 67 65  . Since the page
f7b0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72   is.      ** alr
f7c0: 65 61 64 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  eady in the jour
f7d0: 6e 61 6c 20 66 69 6c 65 20 28 72 65 63 6f 72 64  nal file (record
f7e0: 65 64 20 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a  ed in Pager.pInJ
f7f0: 6f 75 72 6e 61 6c 29 20 61 6e 64 0a 20 20 20 20  ournal) and.    
f800: 20 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e    ** the PGHDR_N
f810: 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69 73  EED_SYNC flag is
f820: 20 63 6c 65 61 72 65 64 2c 20 69 66 20 74 68 65   cleared, if the
f830: 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65 6e   page is written
f840: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 61 67 61   to.      ** aga
f850: 69 6e 20 77 69 74 68 69 6e 20 74 68 69 73 20 74  in within this t
f860: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 77  ransaction, it w
f870: 69 6c 6c 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ill be marked as
f880: 20 64 69 72 74 79 20 62 75 74 0a 20 20 20 20 20   dirty but.     
f890: 20 2a 2a 20 74 68 65 20 50 47 48 44 52 5f 4e 45   ** the PGHDR_NE
f8a0: 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 77 69 6c  ED_SYNC flag wil
f8b0: 6c 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 49 74  l not be set. It
f8c0: 20 63 6f 75 6c 64 20 74 68 65 6e 20 70 6f 74 65   could then pote
f8d0: 6e 74 69 61 6c 6c 79 0a 20 20 20 20 20 20 2a 2a  ntially.      **
f8e0: 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20   be written out 
f8f0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
f900: 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 69 74  e file before it
f910: 73 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  s journal file. 
f920: 20 20 20 20 20 2a 2a 20 73 65 67 6d 65 6e 74 20       ** segment 
f930: 69 73 20 73 79 6e 63 65 64 2e 20 49 66 20 61 20  is synced. If a 
f940: 63 72 61 73 68 20 6f 63 63 75 72 73 20 64 75 72  crash occurs dur
f950: 69 6e 67 20 6f 72 20 66 6f 6c 6c 6f 77 69 6e 67  ing or following
f960: 20 74 68 69 73 2c 0a 20 20 20 20 20 20 2a 2a 20   this,.      ** 
f970: 64 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  database corrupt
f980: 69 6f 6e 20 6d 61 79 20 65 6e 73 75 65 2e 0a 20  ion may ensue.. 
f990: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
f9a0: 6c 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43  lite3PcacheMakeC
f9b0: 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 7d  lean(pPg);.    }
f9c0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43  .#ifdef SQLITE_C
f9d0: 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70  HECK_PAGES.    p
f9e0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
f9f0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
fa00: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 2f  g);.#endif.    /
fa10: 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70 61  * If this was pa
fa20: 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74 6f  ge 1, then resto
fa30: 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  re the value of 
fa40: 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72 73  Pager.dbFileVers
fa50: 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69 73  ..    ** Do this
fa60: 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63 6f   before any deco
fa70: 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66 28  ding. */.    if(
fa80: 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20   pgno==1 ){.    
fa90: 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
faa0: 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 28  ->dbFileVers, &(
fab0: 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d 2c  (u8*)pData)[24],
fac0: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64  sizeof(pPager->d
fad0: 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20  bFileVers));.   
fae0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f 64   }..    /* Decod
faf0: 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74 20  e the page just 
fb00: 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20 2a  read from disk *
fb10: 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50 61  /.    CODEC1(pPa
fb20: 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
fb30: 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 73  >pgno, 3);.    s
fb40: 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 6c 65  qlite3PcacheRele
fb50: 61 73 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ase(pPg);.  }.  
fb60: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
fb70: 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
fb80: 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
fb90: 4c 49 54 45 5f 43 4f 56 45 52 41 47 45 5f 54 45  LITE_COVERAGE_TE
fba0: 53 54 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  ST)./*.** This r
fbb0: 6f 75 74 69 6e 65 20 6c 6f 6f 6b 73 20 61 68 65  outine looks ahe
fbc0: 61 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69 6e  ad into the main
fbd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e   journal file an
fbe0: 64 20 64 65 74 65 72 6d 69 6e 65 73 0a 2a 2a 20  d determines.** 
fbf0: 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74  whether or not t
fc00: 68 65 20 6e 65 78 74 20 72 65 63 6f 72 64 20 28  he next record (
fc10: 74 68 65 20 72 65 63 6f 72 64 20 74 68 61 74 20  the record that 
fc20: 62 65 67 69 6e 73 20 61 74 20 66 69 6c 65 0a 2a  begins at file.*
fc30: 2a 20 6f 66 66 73 65 74 20 70 50 61 67 65 72 2d  * offset pPager-
fc40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 69 73 20  >journalOff) is 
fc50: 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 20 70 61  a well-formed pa
fc60: 67 65 20 72 65 63 6f 72 64 20 63 6f 6e 73 69 73  ge record consis
fc70: 74 69 6e 67 0a 2a 2a 20 6f 66 20 61 20 76 61 6c  ting.** of a val
fc80: 69 64 20 70 61 67 65 20 6e 75 6d 62 65 72 2c 20  id page number, 
fc90: 70 50 61 67 65 2d 3e 70 61 67 65 53 69 7a 65 20  pPage->pageSize 
fca0: 62 79 74 65 73 20 6f 66 20 63 6f 6e 74 65 6e 74  bytes of content
fcb0: 2c 20 66 6f 6c 6c 6f 77 65 64 0a 2a 2a 20 62 79  , followed.** by
fcc0: 20 61 20 76 61 6c 69 64 20 63 68 65 63 6b 73 75   a valid checksu
fcd0: 6d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  m..**.** The pag
fce0: 65 72 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  er never needs t
fcf0: 6f 20 6b 6e 6f 77 20 74 68 69 73 20 69 6e 20 6f  o know this in o
fd00: 72 64 65 72 20 74 6f 20 64 6f 20 69 74 73 20 6a  rder to do its j
fd10: 6f 62 2e 20 20 20 54 68 69 73 0a 2a 2a 20 72 6f  ob.   This.** ro
fd20: 75 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 75 73  utine is only us
fd30: 65 64 20 66 72 6f 6d 20 77 69 74 68 20 61 73 73  ed from with ass
fd40: 65 72 74 28 29 20 61 6e 64 20 74 65 73 74 63 61  ert() and testca
fd50: 73 65 28 29 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  se() macros..*/.
fd60: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
fd70: 4e 65 78 74 4a 6f 75 72 6e 61 6c 50 61 67 65 49  NextJournalPageI
fd80: 73 56 61 6c 69 64 28 50 61 67 65 72 20 2a 70 50  sValid(Pager *pP
fd90: 61 67 65 72 29 7b 0a 20 20 50 67 6e 6f 20 70 67  ager){.  Pgno pg
fda0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  no;           /*
fdb0: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
fdc0: 20 6f 66 20 74 68 65 20 70 61 67 65 20 2a 2f 0a   of the page */.
fdd0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20 20    u32 cksum;    
fde0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
fdf0: 67 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  ge checksum */. 
fe00: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
fe10: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
fe20: 63 6f 64 65 20 66 72 6f 6d 20 72 65 61 64 20 6f  code from read o
fe30: 70 65 72 61 74 69 6f 6e 73 20 2a 2f 0a 20 20 73  perations */.  s
fe40: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 3b  qlite3_file *fd;
fe50: 20 20 20 20 2f 2a 20 54 68 65 20 66 69 6c 65 20      /* The file 
fe60: 64 65 73 63 72 69 70 74 6f 72 20 66 72 6f 6d 20  descriptor from 
fe70: 77 68 69 63 68 20 77 65 20 61 72 65 20 72 65 61  which we are rea
fe80: 64 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a 61 44  ding */.  u8 *aD
fe90: 61 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ata;           /
fea0: 2a 20 43 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  * Content of the
feb0: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 52   page */..  /* R
fec0: 65 61 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d  ead the page num
fed0: 62 65 72 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  ber header */.  
fee0: 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 6a 66 64  fd = pPager->jfd
fef0: 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ;.  rc = read32b
ff00: 69 74 73 28 66 64 2c 20 70 50 61 67 65 72 2d 3e  its(fd, pPager->
ff10: 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 26 70 67 6e  journalOff, &pgn
ff20: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
ff30: 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75 72  LITE_OK ){ retur
ff40: 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20  n 0; }          
ff50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff60: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
ff70: 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  T*/.  if( pgno==
ff80: 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
ff90: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
ffa0: 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20 7d 20   ){ return 0; } 
ffb0: 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
ffc0: 54 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28  T*/.  if( pgno>(
ffd0: 50 67 6e 6f 29 70 50 61 67 65 72 2d 3e 64 62 53  Pgno)pPager->dbS
ffe0: 69 7a 65 20 29 7b 20 72 65 74 75 72 6e 20 30 3b  ize ){ return 0;
fff0: 20 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20   }              
10000 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45 53          /*NO_TES
10010 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74  T*/..  /* Read t
10020 68 65 20 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20  he checksum */. 
10030 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
10040 28 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  (fd, pPager->jou
10050 72 6e 61 6c 4f 66 66 2b 70 50 61 67 65 72 2d 3e  rnalOff+pPager->
10060 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63 6b 73  pageSize+4, &cks
10070 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
10080 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 72 65 74 75  QLITE_OK ){ retu
10090 72 6e 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20  rn 0; }         
100a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
100b0 20 20 20 20 20 20 20 20 20 2f 2a 4e 4f 5f 54 45           /*NO_TE
100c0 53 54 2a 2f 0a 0a 20 20 2f 2a 20 52 65 61 64 20  ST*/..  /* Read 
100d0 74 68 65 20 64 61 74 61 20 61 6e 64 20 76 65 72  the data and ver
100e0 69 66 79 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ify the checksum
100f0 20 2a 2f 0a 20 20 61 44 61 74 61 20 3d 20 28 75   */.  aData = (u
10100 38 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  8*)pPager->pTmpS
10110 70 61 63 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c  pace;.  rc = sql
10120 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
10130 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
10140 67 65 53 69 7a 65 2c 20 70 50 61 67 65 72 2d 3e  geSize, pPager->
10150 6a 6f 75 72 6e 61 6c 4f 66 66 2b 34 29 3b 0a 20  journalOff+4);. 
10160 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
10170 4f 4b 20 29 7b 20 72 65 74 75 72 6e 20 30 3b 20  OK ){ return 0; 
10180 7d 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  }               
10190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101a0 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20     /*NO_TEST*/. 
101b0 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
101c0 28 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21  (pPager, aData)!
101d0 3d 63 6b 73 75 6d 20 29 7b 20 72 65 74 75 72 6e  =cksum ){ return
101e0 20 30 3b 20 7d 20 20 20 20 20 20 20 20 20 20 20   0; }           
101f0 20 20 20 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 0a     /*NO_TEST*/..
10200 20 20 2f 2a 20 52 65 61 63 68 20 74 68 69 73 20    /* Reach this 
10210 70 6f 69 6e 74 20 6f 6e 6c 79 20 69 66 20 74 68  point only if th
10220 65 20 70 61 67 65 20 69 73 20 76 61 6c 69 64 20  e page is valid 
10230 2a 2f 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  */.  return 1;.}
10240 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
10250 6e 65 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64  ned(NDEBUG) || d
10260 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 43 4f  efined(SQLITE_CO
10270 56 45 52 41 47 45 5f 54 45 53 54 29 20 2a 2f 0a  VERAGE_TEST) */.
10280 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
10290 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
102a0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
102b0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
102c0 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
102d0 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
102e0 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
102f0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
10300 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
10310 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
10320 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
10330 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
10340 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
10350 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10360 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
10370 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
10380 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
10390 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
103a0 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
103b0 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
103c0 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
103d0 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
103e0 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
103f0 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 57 68  nction..**.** Wh
10400 65 6e 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  en a master jour
10410 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 72 65 61  nal file is crea
10420 74 65 64 2c 20 69 74 20 69 73 20 70 6f 70 75 6c  ted, it is popul
10430 61 74 65 64 20 77 69 74 68 20 74 68 65 20 6e 61  ated with the na
10440 6d 65 73 20 0a 2a 2a 20 6f 66 20 61 6c 6c 20 6f  mes .** of all o
10450 66 20 69 74 73 20 63 68 69 6c 64 20 6a 6f 75 72  f its child jour
10460 6e 61 6c 73 2c 20 6f 6e 65 20 61 66 74 65 72 20  nals, one after 
10470 61 6e 6f 74 68 65 72 2c 20 66 6f 72 6d 61 74 74  another, formatt
10480 65 64 20 61 73 20 75 74 66 2d 38 20 0a 2a 2a 20  ed as utf-8 .** 
10490 65 6e 63 6f 64 65 64 20 74 65 78 74 2e 20 54 68  encoded text. Th
104a0 65 20 65 6e 64 20 6f 66 20 65 61 63 68 20 63 68  e end of each ch
104b0 69 6c 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ild journal file
104c0 20 69 73 20 6d 61 72 6b 65 64 20 77 69 74 68 20   is marked with 
104d0 61 20 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e  a .** nul-termin
104e0 61 74 6f 72 20 62 79 74 65 20 28 30 78 30 30 29  ator byte (0x00)
104f0 2e 20 69 2e 65 2e 20 74 68 65 20 65 6e 74 69 72  . i.e. the entir
10500 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20  e contents of a 
10510 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a  master journal.*
10520 2a 20 66 69 6c 65 20 66 6f 72 20 61 20 74 72 61  * file for a tra
10530 6e 73 61 63 74 69 6f 6e 20 69 6e 76 6f 6c 76 69  nsaction involvi
10540 6e 67 20 74 77 6f 20 64 61 74 61 62 61 73 65 73  ng two databases
10550 20 6d 69 67 68 74 20 62 65 3a 0a 2a 2a 0a 2a 2a   might be:.**.**
10560 20 20 20 22 2f 68 6f 6d 65 2f 62 69 6c 6c 2f 61     "/home/bill/a
10570 2e 64 62 2d 6a 6f 75 72 6e 61 6c 5c 78 30 30 2f  .db-journal\x00/
10580 68 6f 6d 65 2f 62 69 6c 6c 2f 62 2e 64 62 2d 6a  home/bill/b.db-j
10590 6f 75 72 6e 61 6c 5c 78 30 30 22 0a 2a 2a 0a 2a  ournal\x00".**.*
105a0 2a 20 41 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  * A master journ
105b0 61 6c 20 66 69 6c 65 20 6d 61 79 20 6f 6e 6c 79  al file may only
105c0 20 62 65 20 64 65 6c 65 74 65 64 20 6f 6e 63 65   be deleted once
105d0 20 61 6c 6c 20 6f 66 20 69 74 73 20 63 68 69 6c   all of its chil
105e0 64 20 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 73 20 68  d .** journals h
105f0 61 76 65 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ave been rolled 
10600 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
10610 20 66 75 6e 63 74 69 6f 6e 20 72 65 61 64 73 20   function reads 
10620 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
10630 74 68 65 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e  the master-journ
10640 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 0a 2a 2a  al file into .**
10650 20 6d 65 6d 6f 72 79 20 61 6e 64 20 6c 6f 6f 70   memory and loop
10660 73 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 6f  s through each o
10670 66 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72  f the child jour
10680 6e 61 6c 20 6e 61 6d 65 73 2e 20 46 6f 72 0a 2a  nal names. For.*
10690 2a 20 65 61 63 68 20 63 68 69 6c 64 20 6a 6f 75  * each child jou
106a0 72 6e 61 6c 2c 20 69 74 20 63 68 65 63 6b 73 20  rnal, it checks 
106b0 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 69 66  if:.**.**   * if
106c0 20 74 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e   the child journ
106d0 61 6c 20 65 78 69 73 74 73 2c 20 61 6e 64 20 69  al exists, and i
106e0 66 20 73 6f 0a 2a 2a 20 20 20 2a 20 69 66 20 74  f so.**   * if t
106f0 68 65 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  he child journal
10700 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 65 66 65   contains a refe
10710 72 65 6e 63 65 20 74 6f 20 6d 61 73 74 65 72 20  rence to master 
10720 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20  journal .**     
10730 66 69 6c 65 20 7a 4d 61 73 74 65 72 0a 2a 2a 0a  file zMaster.**.
10740 2a 2a 20 49 66 20 61 20 63 68 69 6c 64 20 6a 6f  ** If a child jo
10750 75 72 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75  urnal can be fou
10760 6e 64 20 74 68 61 74 20 6d 61 74 63 68 65 73 20  nd that matches 
10770 62 6f 74 68 20 6f 66 20 74 68 65 20 63 72 69 74  both of the crit
10780 65 72 69 61 0a 2a 2a 20 61 62 6f 76 65 2c 20 74  eria.** above, t
10790 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
107a0 75 72 6e 73 20 77 69 74 68 6f 75 74 20 64 6f 69  urns without doi
107b0 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20 4f 74 68  ng anything. Oth
107c0 65 72 77 69 73 65 2c 20 69 66 0a 2a 2a 20 6e 6f  erwise, if.** no
107d0 20 73 75 63 68 20 63 68 69 6c 64 20 6a 6f 75 72   such child jour
107e0 6e 61 6c 20 63 61 6e 20 62 65 20 66 6f 75 6e 64  nal can be found
107f0 2c 20 66 69 6c 65 20 7a 4d 61 73 74 65 72 20 69  , file zMaster i
10800 73 20 64 65 6c 65 74 65 64 20 66 72 6f 6d 0a 2a  s deleted from.*
10810 2a 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  * the file-syste
10820 6d 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 4f  m using sqlite3O
10830 73 44 65 6c 65 74 65 28 29 2e 0a 2a 2a 0a 2a 2a  sDelete()..**.**
10840 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   If an IO error 
10850 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e 63  within this func
10860 74 69 6f 6e 2c 20 61 6e 20 65 72 72 6f 72 20 63  tion, an error c
10870 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e  ode is returned.
10880 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   This.** functio
10890 6e 20 61 6c 6c 6f 63 61 74 65 73 20 6d 65 6d 6f  n allocates memo
108a0 72 79 20 62 79 20 63 61 6c 6c 69 6e 67 20 73 71  ry by calling sq
108b0 6c 69 74 65 33 4d 61 6c 6c 6f 63 28 29 2e 20 49  lite3Malloc(). I
108c0 66 20 61 6e 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a  f an allocation.
108d0 2a 2a 20 66 61 69 6c 73 2c 20 53 51 4c 49 54 45  ** fails, SQLITE
108e0 5f 4e 4f 4d 45 4d 20 69 73 20 72 65 74 75 72 6e  _NOMEM is return
108f0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 69  ed. Otherwise, i
10900 66 20 6e 6f 20 49 4f 20 6f 72 20 6d 61 6c 6c 6f  f no IO or mallo
10910 63 20 65 72 72 6f 72 73 20 0a 2a 2a 20 6f 63 63  c errors .** occ
10920 75 72 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ur, SQLITE_OK is
10930 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
10940 20 54 4f 44 4f 3a 20 54 68 69 73 20 66 75 6e 63   TODO: This func
10950 74 69 6f 6e 20 61 6c 6c 6f 63 61 74 65 73 20 61  tion allocates a
10960 20 73 69 6e 67 6c 65 20 62 6c 6f 63 6b 20 6f 66   single block of
10970 20 6d 65 6d 6f 72 79 20 74 6f 20 6c 6f 61 64 0a   memory to load.
10980 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 63 6f  ** the entire co
10990 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 6d 61  ntents of the ma
109a0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
109b0 65 2e 20 54 68 69 73 20 63 6f 75 6c 64 20 62 65  e. This could be
109c0 0a 2a 2a 20 61 20 63 6f 75 70 6c 65 20 6f 66 20  .** a couple of 
109d0 6b 69 6c 6f 62 79 74 65 73 20 6f 72 20 73 6f 20  kilobytes or so 
109e0 2d 20 70 6f 74 65 6e 74 69 61 6c 6c 79 20 6c 61  - potentially la
109f0 72 67 65 72 20 74 68 61 6e 20 74 68 65 20 70 61  rger than the pa
10a00 67 65 20 0a 2a 2a 20 73 69 7a 65 2e 0a 2a 2f 0a  ge .** size..*/.
10a10 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
10a20 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
10a30 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
10a40 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
10a50 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
10a60 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
10a70 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 20 20 20  fs;.  int rc;   
10a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10a90 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
10aa0 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  /.  sqlite3_file
10ab0 20 2a 70 4d 61 73 74 65 72 3b 20 20 20 20 2f 2a   *pMaster;    /*
10ac0 20 4d 61 6c 6c 6f 63 27 64 20 6d 61 73 74 65 72   Malloc'd master
10ad0 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65  -journal file de
10ae0 73 63 72 69 70 74 6f 72 20 2a 2f 0a 20 20 73 71  scriptor */.  sq
10af0 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 6f 75  lite3_file *pJou
10b00 72 6e 61 6c 3b 20 20 20 2f 2a 20 4d 61 6c 6c 6f  rnal;   /* Mallo
10b10 63 27 64 20 63 68 69 6c 64 2d 6a 6f 75 72 6e 61  c'd child-journa
10b20 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
10b30 72 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61  r */.  char *zMa
10b40 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  sterJournal = 0;
10b50 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20   /* Contents of 
10b60 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
10b70 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61  ile */.  i64 nMa
10b80 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  sterJournal;    
10b90 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61     /* Size of ma
10ba0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
10bb0 65 20 2a 2f 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63  e */..  /* Alloc
10bc0 61 74 65 20 73 70 61 63 65 20 66 6f 72 20 62 6f  ate space for bo
10bd0 74 68 20 74 68 65 20 70 4a 6f 75 72 6e 61 6c 20  th the pJournal 
10be0 61 6e 64 20 70 4d 61 73 74 65 72 20 66 69 6c 65  and pMaster file
10bf0 20 64 65 73 63 72 69 70 74 6f 72 73 2e 0a 20 20   descriptors..  
10c00 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
10c10 2c 20 6f 70 65 6e 20 74 68 65 20 6d 61 73 74 65  , open the maste
10c20 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  r journal file f
10c30 6f 72 20 72 65 61 64 69 6e 67 2e 0a 20 20 2a 2f  or reading..  */
10c40 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
10c50 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
10c60 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 70  ite3MallocZero(p
10c70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20  Vfs->szOsFile * 
10c80 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d  2);.  pJournal =
10c90 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a   (sqlite3_file *
10ca0 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74 65 72  )(((u8 *)pMaster
10cb0 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  ) + pVfs->szOsFi
10cc0 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d 61 73  le);.  if( !pMas
10cd0 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ter ){.    rc = 
10ce0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
10cf0 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
10d00 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
10d10 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e  LITE_OPEN_READON
10d20 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  LY|SQLITE_OPEN_M
10d30 41 53 54 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  ASTER_JOURNAL);.
10d40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
10d50 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61  OsOpen(pVfs, zMa
10d60 73 74 65 72 2c 20 70 4d 61 73 74 65 72 2c 20 66  ster, pMaster, f
10d70 6c 61 67 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  lags, 0);.  }.  
10d80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
10d90 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
10da0 65 72 5f 6f 75 74 3b 0a 0a 20 20 72 63 20 3d 20  er_out;..  rc = 
10db0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
10dc0 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
10dd0 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
10de0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10df0 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
10e00 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
10e10 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
10e20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
10e30 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
10e40 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
10e50 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50      int nMasterP
10e60 74 72 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  tr = pVfs->mxPat
10e70 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20 2f 2a  hname+1;..    /*
10e80 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72 65   Load the entire
10e90 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10ea0 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65 20  file into space 
10eb0 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20  obtained from.  
10ec0 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d 61 6c    ** sqlite3_mal
10ed0 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65  loc() and pointe
10ee0 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a  d to by zMasterJ
10ef0 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a  ournal. .    */.
10f00 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e      zMasterJourn
10f10 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  al = (char *)sql
10f20 69 74 65 33 4d 61 6c 6c 6f 63 28 28 69 6e 74 29  ite3Malloc((int)
10f30 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b  nMasterJournal +
10f40 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20   nMasterPtr);.  
10f50 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f    if( !zMasterJo
10f60 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72  urnal ){.      r
10f70 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
10f80 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c  ;.      goto del
10f90 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
10fa0 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72  }.    zMasterPtr
10fb0 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e   = &zMasterJourn
10fc0 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  al[nMasterJourna
10fd0 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  l];.    rc = sql
10fe0 69 74 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74  ite3OsRead(pMast
10ff0 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  er, zMasterJourn
11000 61 6c 2c 20 28 69 6e 74 29 6e 4d 61 73 74 65 72  al, (int)nMaster
11010 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
11020 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11030 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
11040 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a  ter_out;..    zJ
11050 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72  ournal = zMaster
11060 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69  Journal;.    whi
11070 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d  le( (zJournal-zM
11080 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d  asterJournal)<nM
11090 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
110a0 20 20 20 20 20 20 69 6e 74 20 65 78 69 73 74 73        int exists
110b0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
110c0 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
110d0 73 2c 20 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  s, zJournal, SQL
110e0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
110f0 53 2c 20 26 65 78 69 73 74 73 29 3b 0a 20 20 20  S, &exists);.   
11100 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11110 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
11120 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
11130 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ut;.      }.    
11140 20 20 69 66 28 20 65 78 69 73 74 73 20 29 7b 0a    if( exists ){.
11150 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
11160 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70  f the journals p
11170 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65  ointed to by the
11180 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
11190 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20  exists..        
111a0 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63  ** Open it and c
111b0 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74  heck if it point
111c0 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20  s at the master 
111d0 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20  journal. If.    
111e0 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72      ** so, retur
111f0 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69  n without deleti
11200 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
11210 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20  urnal file..    
11220 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
11230 6e 74 20 63 3b 0a 20 20 20 20 20 20 20 20 69 6e  nt c;.        in
11240 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
11250 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
11260 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
11270 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 20  _JOURNAL);.     
11280 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11290 73 4f 70 65 6e 28 70 56 66 73 2c 20 7a 4a 6f 75  sOpen(pVfs, zJou
112a0 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20  rnal, pJournal, 
112b0 66 6c 61 67 73 2c 20 30 29 3b 0a 20 20 20 20 20  flags, 0);.     
112c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
112d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
112e0 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
112f0 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
11300 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
11310 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
11320 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d 61 73 74 65  pJournal, zMaste
11330 72 50 74 72 2c 20 6e 4d 61 73 74 65 72 50 74 72  rPtr, nMasterPtr
11340 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
11350 65 33 4f 73 43 6c 6f 73 65 28 70 4a 6f 75 72 6e  e3OsClose(pJourn
11360 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  al);.        if(
11370 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11380 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f  {.          goto
11390 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
113a0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
113b0 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74     c = zMasterPt
113c0 72 5b 30 5d 21 3d 30 20 26 26 20 73 74 72 63 6d  r[0]!=0 && strcm
113d0 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d  p(zMasterPtr, zM
113e0 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20  aster)==0;.     
113f0 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20     if( c ){.    
11400 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65        /* We have
11410 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74   a match. Do not
11420 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
11430 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
11440 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f   */.          go
11450 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
11460 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
11470 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e    }.      zJourn
11480 61 6c 20 2b 3d 20 28 73 71 6c 69 74 65 33 53 74  al += (sqlite3St
11490 72 6c 65 6e 33 30 28 7a 4a 6f 75 72 6e 61 6c 29  rlen30(zJournal)
114a0 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
114b0 20 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33   .  rc = sqlite3
114c0 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 7a  OsDelete(pVfs, z
114d0 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a 64 65 6c  Master, 0);..del
114e0 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66  master_out:.  if
114f0 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  ( zMasterJournal
11500 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
11510 66 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  free(zMasterJour
11520 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
11530 28 20 70 4d 61 73 74 65 72 20 29 7b 0a 20 20 20  ( pMaster ){.   
11540 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
11550 70 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 61 73  pMaster);.    as
11560 73 65 72 74 28 20 21 69 73 4f 70 65 6e 28 70 4a  sert( !isOpen(pJ
11570 6f 75 72 6e 61 6c 29 20 29 3b 0a 20 20 7d 0a 20  ournal) );.  }. 
11580 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d   sqlite3_free(pM
11590 61 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  aster);.  return
115a0 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
115b0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
115c0 75 73 65 64 20 74 6f 20 63 68 61 6e 67 65 20 74  used to change t
115d0 68 65 20 61 63 74 75 61 6c 20 73 69 7a 65 20 6f  he actual size o
115e0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 0a  f the database .
115f0 2a 2a 20 66 69 6c 65 20 69 6e 20 74 68 65 20 66  ** file in the f
11600 69 6c 65 2d 73 79 73 74 65 6d 2e 20 54 68 69 73  ile-system. This
11610 20 6f 6e 6c 79 20 68 61 70 70 65 6e 73 20 77 68   only happens wh
11620 65 6e 20 63 6f 6d 6d 69 74 74 69 6e 67 20 61 20  en committing a 
11630 74 72 61 6e 73 61 63 74 69 6f 6e 2c 0a 2a 2a 20  transaction,.** 
11640 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  or rolling back 
11650 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 28 69  a transaction (i
11660 6e 63 6c 75 64 69 6e 67 20 72 6f 6c 6c 69 6e 67  ncluding rolling
11670 20 62 61 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72   back a hot-jour
11680 6e 61 6c 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  nal)..**.** If t
11690 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
116a0 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65   file is not ope
116b0 6e 2c 20 6f 72 20 61 6e 20 65 78 63 6c 75 73 69  n, or an exclusi
116c0 76 65 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 0a 2a  ve lock is not.*
116d0 2a 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75 6e  * held, this fun
116e0 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
116f0 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68 65  . Otherwise, the
11700 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c   size of the fil
11710 65 20 69 73 0a 2a 2a 20 63 68 61 6e 67 65 64 20  e is.** changed 
11720 74 6f 20 6e 50 61 67 65 20 70 61 67 65 73 20 28  to nPage pages (
11730 6e 50 61 67 65 2a 70 50 61 67 65 72 2d 3e 70 61  nPage*pPager->pa
11740 67 65 53 69 7a 65 20 62 79 74 65 73 29 2e 20 49  geSize bytes). I
11750 66 20 74 68 65 20 66 69 6c 65 0a 2a 2a 20 6f 6e  f the file.** on
11760 20 64 69 73 6b 20 69 73 20 63 75 72 72 65 6e 74   disk is current
11770 6c 79 20 6c 61 72 67 65 72 20 74 68 61 6e 20 6e  ly larger than n
11780 50 61 67 65 20 70 61 67 65 73 2c 20 74 68 65 6e  Page pages, then
11790 20 75 73 65 20 74 68 65 20 56 46 53 0a 2a 2a 20   use the VFS.** 
117a0 78 54 72 75 6e 63 61 74 65 28 29 20 6d 65 74 68  xTruncate() meth
117b0 6f 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 69  od to truncate i
117c0 74 2e 0a 2a 2a 0a 2a 2a 20 4f 72 2c 20 69 74 20  t..**.** Or, it 
117d0 6d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20 74  might might be t
117e0 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68 65  he case that the
117f0 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69 73   file on disk is
11800 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 0a 2a   smaller than .*
11810 2a 20 6e 50 61 67 65 20 70 61 67 65 73 2e 20 53  * nPage pages. S
11820 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  ome operating sy
11830 73 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74  stem implementat
11840 69 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e  ions can get con
11850 66 75 73 65 64 20 69 66 20 0a 2a 2a 20 79 6f 75  fused if .** you
11860 20 74 72 79 20 74 6f 20 74 72 75 6e 63 61 74 65   try to truncate
11870 20 61 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20   a file to some 
11880 73 69 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72  size that is lar
11890 67 65 72 20 74 68 61 6e 20 69 74 20 0a 2a 2a 20  ger than it .** 
118a0 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 20 73 6f  currently is, so
118b0 20 64 65 74 65 63 74 20 74 68 69 73 20 63 61 73   detect this cas
118c0 65 20 61 6e 64 20 77 72 69 74 65 20 61 20 73 69  e and write a si
118d0 6e 67 6c 65 20 7a 65 72 6f 20 62 79 74 65 20 74  ngle zero byte t
118e0 6f 20 0a 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66  o .** the end of
118f0 20 74 68 65 20 6e 65 77 20 66 69 6c 65 20 69 6e   the new file in
11900 73 74 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  stead..**.** If 
11910 73 75 63 63 65 73 73 66 75 6c 2c 20 72 65 74 75  successful, retu
11920 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 66  rn SQLITE_OK. If
11930 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63   an IO error occ
11940 75 72 73 20 77 68 69 6c 65 20 6d 6f 64 69 66 79  urs while modify
11950 69 6e 67 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ing.** the datab
11960 61 73 65 20 66 69 6c 65 2c 20 72 65 74 75 72 6e  ase file, return
11970 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
11980 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a  to the caller..*
11990 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
119a0 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
119b0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
119c0 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
119d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
119e0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
119f0 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
11a00 56 45 20 26 26 20 69 73 4f 70 65 6e 28 70 50 61  VE && isOpen(pPa
11a10 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
11a20 69 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c  i64 currentSize,
11a30 20 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 2f 2a   newSize;.    /*
11a40 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 73 61 66   TODO: Is it saf
11a50 65 20 74 6f 20 75 73 65 20 50 61 67 65 72 2e 64  e to use Pager.d
11a60 62 46 69 6c 65 53 69 7a 65 20 68 65 72 65 3f 20  bFileSize here? 
11a70 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  */.    rc = sqli
11a80 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
11a90 61 67 65 72 2d 3e 66 64 2c 20 26 63 75 72 72 65  ager->fd, &curre
11aa0 6e 74 53 69 7a 65 29 3b 0a 20 20 20 20 6e 65 77  ntSize);.    new
11ab0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Size = pPager->p
11ac0 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
11ad0 67 65 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  ge;.    if( rc==
11ae0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 63 75 72  SQLITE_OK && cur
11af0 72 65 6e 74 53 69 7a 65 21 3d 6e 65 77 53 69 7a  rentSize!=newSiz
11b00 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 63  e ){.      if( c
11b10 75 72 72 65 6e 74 53 69 7a 65 3e 6e 65 77 53 69  urrentSize>newSi
11b20 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  ze ){.        rc
11b30 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
11b40 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  cate(pPager->fd,
11b50 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20 20 20   newSize);.     
11b60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
11b70 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
11b80 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
11b90 22 22 2c 20 31 2c 20 6e 65 77 53 69 7a 65 2d 31  "", 1, newSize-1
11ba0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11bb0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
11bc0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  OK ){.        pP
11bd0 61 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65  ager->dbFileSize
11be0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 20 20   = nPage;.      
11bf0 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
11c00 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11c10 2a 20 53 65 74 20 74 68 65 20 76 61 6c 75 65 20  * Set the value 
11c20 6f 66 20 74 68 65 20 50 61 67 65 72 2e 73 65 63  of the Pager.sec
11c30 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
11c40 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 0a 2a   for the given.*
11c50 2a 20 70 61 67 65 72 20 62 61 73 65 64 20 6f 6e  * pager based on
11c60 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
11c70 6e 65 64 20 62 79 20 74 68 65 20 78 53 65 63 74  ned by the xSect
11c80 6f 72 53 69 7a 65 20 6d 65 74 68 6f 64 0a 2a 2a  orSize method.**
11c90 20 6f 66 20 74 68 65 20 6f 70 65 6e 20 64 61 74   of the open dat
11ca0 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
11cb0 73 65 63 74 6f 72 20 73 69 7a 65 20 77 69 6c 6c  sector size will
11cc0 20 62 65 20 75 73 65 64 20 75 73 65 64 20 0a 2a   be used used .*
11cd0 2a 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 74  * to determine t
11ce0 68 65 20 73 69 7a 65 20 61 6e 64 20 61 6c 69 67  he size and alig
11cf0 6e 6d 65 6e 74 20 6f 66 20 6a 6f 75 72 6e 61 6c  nment of journal
11d00 20 68 65 61 64 65 72 20 61 6e 64 20 0a 2a 2a 20   header and .** 
11d10 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70  master journal p
11d20 6f 69 6e 74 65 72 73 20 77 69 74 68 69 6e 20 63  ointers within c
11d30 72 65 61 74 65 64 20 6a 6f 75 72 6e 61 6c 20 66  reated journal f
11d40 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  iles..**.** For 
11d50 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20  temporary files 
11d60 74 68 65 20 65 66 66 65 63 74 69 76 65 20 73 65  the effective se
11d70 63 74 6f 72 20 73 69 7a 65 20 69 73 20 61 6c 77  ctor size is alw
11d80 61 79 73 20 35 31 32 20 62 79 74 65 73 2e 0a 2a  ays 512 bytes..*
11d90 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20  *.** Otherwise, 
11da0 66 6f 72 20 6e 6f 6e 2d 74 65 6d 70 6f 72 61 72  for non-temporar
11db0 79 20 66 69 6c 65 73 2c 20 74 68 65 20 65 66 66  y files, the eff
11dc0 65 63 74 69 76 65 20 73 65 63 74 6f 72 20 73 69  ective sector si
11dd0 7a 65 20 69 73 0a 2a 2a 20 74 68 65 20 76 61 6c  ze is.** the val
11de0 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 74  ue returned by t
11df0 68 65 20 78 53 65 63 74 6f 72 53 69 7a 65 28 29  he xSectorSize()
11e00 20 6d 65 74 68 6f 64 20 72 6f 75 6e 64 65 64 20   method rounded 
11e10 75 70 20 74 6f 20 35 31 32 20 69 66 0a 2a 2a 20  up to 512 if.** 
11e20 69 74 20 69 73 20 6c 65 73 73 20 74 68 61 6e 20  it is less than 
11e30 35 31 32 2c 20 6f 72 20 72 6f 75 6e 64 65 64 20  512, or rounded 
11e40 64 6f 77 6e 20 74 6f 20 4d 41 58 5f 53 45 43 54  down to MAX_SECT
11e50 4f 52 5f 53 49 5a 45 20 69 66 20 69 74 0a 2a 2a  OR_SIZE if it.**
11e60 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
11e70 20 4d 41 58 5f 53 45 43 54 4f 52 5f 53 49 5a 45   MAX_SECTOR_SIZE
11e80 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
11e90 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28 50   setSectorSize(P
11ea0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11eb0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
11ec0 70 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70  pPager->fd) || p
11ed0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
11ee0 29 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65  );..  if( !pPage
11ef0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
11f00 20 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a     /* Sector siz
11f10 65 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72  e doesn't matter
11f20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66   for temporary f
11f30 69 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20  iles. Also, the 
11f40 66 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20  file.    ** may 
11f50 6e 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70  not have been op
11f60 65 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 69  ened yet, in whi
11f70 63 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65  ch case the OsSe
11f80 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a  ctorSize().    *
11f90 2a 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66  * call will segf
11fa0 61 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ault..    */.   
11fb0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
11fc0 69 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53  ize = sqlite3OsS
11fd0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
11fe0 2d 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ->fd);.  }.  if(
11ff0 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
12000 69 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70  ize<512 ){.    p
12010 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
12020 65 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 20 20 69  e = 512;.  }.  i
12030 66 28 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  f( pPager->secto
12040 72 53 69 7a 65 3e 4d 41 58 5f 53 45 43 54 4f 52  rSize>MAX_SECTOR
12050 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 61 73 73  _SIZE ){.    ass
12060 65 72 74 28 20 4d 41 58 5f 53 45 43 54 4f 52 5f  ert( MAX_SECTOR_
12070 53 49 5a 45 3e 3d 35 31 32 20 29 3b 0a 20 20 20  SIZE>=512 );.   
12080 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
12090 69 7a 65 20 3d 20 4d 41 58 5f 53 45 43 54 4f 52  ize = MAX_SECTOR
120a0 5f 53 49 5a 45 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  _SIZE;.  }.}../*
120b0 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
120c0 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
120d0 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
120e0 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
120f0 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
12100 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
12110 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
12120 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
12130 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
12140 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
12150 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
12160 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
12170 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
12180 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
12190 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
121a0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
121b0 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
121c0 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
121d0 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
121e0 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
121f0 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
12200 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
12210 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
12220 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
12230 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
12240 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
12250 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
12260 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
12270 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
12280 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
12290 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
122a0 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
122b0 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
122c0 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
122d0 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
122e0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
122f0 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
12300 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
12310 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
12320 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
12330 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
12340 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
12350 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
12360 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
12370 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
12380 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
12390 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
123a0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
123b0 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
123c0 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73 65  is the page case
123d0 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74  ..**  (7)  4 byt
123e0 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
123f0 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
12400 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
12410 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
12420 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
12430 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
12440 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
12450 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
12460 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
12470 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20  urnal.).**  (8) 
12480 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
12490 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
124a0 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
124b0 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
124c0 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
124d0 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
124e0 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
124f0 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
12500 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
12510 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
12520 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
12530 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
12540 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
12550 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
12560 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
12570 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
12580 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29  n UTF-8..**  (9)
12590 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
125a0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
125b0 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
125c0 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
125d0 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
125e0 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
125f0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
12600 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
12610 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
12620 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
12630 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
12640 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
12650 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
12660 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d 73  he first 8 items
12670 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
12680 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
12690 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
126a0 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20 69  nce of the 9th i
126b0 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
126c0 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
126d0 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
126e0 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
126f0 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
12700 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
12710 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
12720 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
12730 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
12740 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
12750 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
12760 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
12770 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
12780 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
12790 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
127a0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
127b0 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
127c0 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
127d0 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
127e0 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
127f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12800 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
12810 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
12820 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
12830 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
12840 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
12850 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
12860 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
12870 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
12880 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
12890 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
128a0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
128b0 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
128c0 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
128d0 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
128e0 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
128f0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
12900 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
12910 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
12920 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
12930 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
12940 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
12950 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
12960 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
12970 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
12980 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
12990 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
129a0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
129b0 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
129c0 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
129d0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
129e0 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
129f0 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
12a00 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
12a10 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
12a20 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
12a30 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
12a40 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
12a50 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
12a60 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
12a70 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
12a80 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
12a90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
12aa0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
12ab0 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
12ac0 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
12ad0 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
12ae0 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
12af0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
12b00 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
12b10 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
12b20 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
12b30 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
12b40 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
12b50 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
12b60 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
12b70 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
12b80 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
12b90 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
12ba0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
12bb0 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
12bc0 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
12bd0 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
12be0 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20  returned..**.** 
12bf0 54 68 65 20 69 73 48 6f 74 20 70 61 72 61 6d 65  The isHot parame
12c00 74 65 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ter indicates th
12c10 61 74 20 77 65 20 61 72 65 20 74 72 79 69 6e 67  at we are trying
12c20 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 6a   to rollback a j
12c30 6f 75 72 6e 61 6c 0a 2a 2a 20 74 68 61 74 20 6d  ournal.** that m
12c40 69 67 68 74 20 62 65 20 61 20 68 6f 74 20 6a 6f  ight be a hot jo
12c50 75 72 6e 61 6c 2e 20 20 4f 72 2c 20 69 74 20 63  urnal.  Or, it c
12c60 6f 75 6c 64 20 62 65 20 74 68 61 74 20 74 68 65  ould be that the
12c70 20 6a 6f 75 72 6e 61 6c 20 69 73 20 0a 2a 2a 20   journal is .** 
12c80 70 72 65 73 65 72 76 65 64 20 62 65 63 61 75 73  preserved becaus
12c90 65 20 6f 66 20 4a 4f 55 52 4e 41 4c 4d 4f 44 45  e of JOURNALMODE
12ca0 5f 50 45 52 53 49 53 54 20 6f 72 20 4a 4f 55 52  _PERSIST or JOUR
12cb0 4e 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45  NALMODE_TRUNCATE
12cc0 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  ..** If the jour
12cd0 6e 61 6c 20 72 65 61 6c 6c 79 20 69 73 20 68 6f  nal really is ho
12ce0 74 2c 20 72 65 73 65 74 20 74 68 65 20 70 61 67  t, reset the pag
12cf0 65 72 20 63 61 63 68 65 20 70 72 69 6f 72 20 72  er cache prior r
12d00 6f 6c 6c 69 6e 67 0a 2a 2a 20 62 61 63 6b 20 61  olling.** back a
12d10 6e 79 20 63 6f 6e 74 65 6e 74 2e 20 20 49 66 20  ny content.  If 
12d20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6d  the journal is m
12d30 65 72 65 6c 79 20 70 65 72 73 69 73 74 65 6e 74  erely persistent
12d40 2c 20 6e 6f 20 72 65 73 65 74 20 69 73 0a 2a 2a  , no reset is.**
12d50 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a 73 74 61 74   needed..*/.stat
12d60 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
12d70 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
12d80 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29 7b  ger, int isHot){
12d90 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
12da0 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
12db0 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  Vfs;.  i64 szJ; 
12dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12dd0 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6a  /* Size of the j
12de0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20 62  ournal file in b
12df0 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e 52  ytes */.  u32 nR
12e00 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
12e10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
12e20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6a  Records in the j
12e30 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
12e40 75 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  u;              
12e50 20 20 20 20 20 2f 2a 20 55 6e 73 69 67 6e 65 64       /* Unsigned
12e60 20 6c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   loop counter */
12e70 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30  .  Pgno mxPg = 0
12e80 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  ;           /* S
12e90 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69  ize of the origi
12ea0 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65  nal file in page
12eb0 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  s */.  int rc;  
12ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ed0 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f  /* Result code o
12ee0 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a  f a subroutine *
12ef0 2f 0a 20 20 69 6e 74 20 72 65 73 20 3d 20 31 3b  /.  int res = 1;
12f00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
12f10 56 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  Value returned b
12f20 79 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  y sqlite3OsAcces
12f30 73 28 29 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  s() */.  char *z
12f40 4d 61 73 74 65 72 20 3d 20 30 3b 20 20 20 20 20  Master = 0;     
12f50 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73    /* Name of mas
12f60 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
12f70 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 69 6e 74   if any */.  int
12f80 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 3b   needPagerReset;
12f90 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
12fa0 20 72 65 73 65 74 20 70 61 67 65 20 70 72 69 6f   reset page prio
12fb0 72 20 74 6f 20 66 69 72 73 74 20 70 61 67 65 20  r to first page 
12fc0 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 0a 20 20 2f  rollback */..  /
12fd0 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77  * Figure out how
12fe0 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72   many records ar
12ff0 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
13000 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79 20 69  .  Abort early i
13010 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  f.  ** the journ
13020 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 2a  al is empty..  *
13030 2f 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f 70  /.  assert( isOp
13040 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
13050 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
13060 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67  3OsFileSize(pPag
13070 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a  er->jfd, &szJ);.
13080 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13090 5f 4f 4b 20 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b  _OK || szJ==0 ){
130a0 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
130b0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
130c0 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
130d0 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
130e0 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
130f0 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
13100 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
13110 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
13120 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
13130 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
13140 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
13150 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
13160 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
13170 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
13180 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
13190 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
131a0 63 6b 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 4f  ck..  **.  ** TO
131b0 44 4f 3a 20 54 65 63 68 6e 69 63 61 6c 6c 79 20  DO: Technically 
131c0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73  the following is
131d0 20 61 6e 20 65 72 72 6f 72 20 62 65 63 61 75 73   an error becaus
131e0 65 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61  e it assumes tha
131f0 74 0a 20 20 2a 2a 20 62 75 66 66 65 72 20 50 61  t.  ** buffer Pa
13200 67 65 72 2e 70 54 6d 70 53 70 61 63 65 20 69 73  ger.pTmpSpace is
13210 20 28 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 20   (mxPathname+1) 
13220 62 79 74 65 73 20 6f 72 20 6c 61 72 67 65 72 2e  bytes or larger.
13230 20 69 2e 65 2e 20 74 68 61 74 0a 20 20 2a 2a 20   i.e. that.  ** 
13240 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
13250 65 20 3e 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  e >= pPager->pVf
13260 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29  s->mxPathname+1)
13270 2e 20 55 73 69 6e 67 20 6f 73 5f 75 6e 69 78 2e  . Using os_unix.
13280 63 2c 0a 20 20 2a 2a 20 20 6d 78 50 61 74 68 6e  c,.  **  mxPathn
13290 61 6d 65 20 69 73 20 35 31 32 2c 20 77 68 69 63  ame is 512, whic
132a0 68 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73  h is the same as
132b0 20 74 68 65 20 6d 69 6e 69 6d 75 6d 20 61 6c 6c   the minimum all
132c0 6f 77 61 62 6c 65 20 76 61 6c 75 65 0a 20 20 2a  owable value.  *
132d0 2a 20 66 6f 72 20 70 61 67 65 53 69 7a 65 2e 0a  * for pageSize..
132e0 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
132f0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
13300 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
13310 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
13320 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
13330 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
13340 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
13350 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13360 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
13370 5d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  ] ){.    rc = sq
13380 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
13390 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c  fs, zMaster, SQL
133a0 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
133b0 53 2c 20 26 72 65 73 29 3b 0a 20 20 7d 0a 20 20  S, &res);.  }.  
133c0 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 69  zMaster = 0;.  i
133d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
133e0 20 7c 7c 20 21 72 65 73 20 29 7b 0a 20 20 20 20   || !res ){.    
133f0 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
13400 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  k;.  }.  pPager-
13410 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
13420 0a 20 20 6e 65 65 64 50 61 67 65 72 52 65 73 65  .  needPagerRese
13430 74 20 3d 20 69 73 48 6f 74 3b 0a 0a 20 20 2f 2a  t = isHot;..  /*
13440 20 54 68 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69   This loop termi
13450 6e 61 74 65 73 20 65 69 74 68 65 72 20 77 68 65  nates either whe
13460 6e 20 61 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  n a readJournalH
13470 64 72 28 29 20 6f 72 20 0a 20 20 2a 2a 20 70 61  dr() or .  ** pa
13480 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
13490 5f 70 61 67 65 28 29 20 63 61 6c 6c 20 72 65 74  _page() call ret
134a0 75 72 6e 73 20 53 51 4c 49 54 45 5f 44 4f 4e 45  urns SQLITE_DONE
134b0 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
134c0 0a 20 20 2a 2a 20 6f 63 63 75 72 73 2e 20 0a 20  .  ** occurs. . 
134d0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29   */.  while( 1 )
134e0 7b 0a 20 20 20 20 69 6e 74 20 69 73 55 6e 73 79  {.    int isUnsy
134f0 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20  nc = 0;..    /* 
13500 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f  Read the next jo
13510 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f  urnal header fro
13520 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
13530 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72  le.  If there ar
13540 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f  e.    ** not eno
13550 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69  ugh bytes left i
13560 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
13570 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74  le for a complet
13580 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20  e header, or.   
13590 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70   ** it is corrup
135a0 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63  ted, then a proc
135b0 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c  ess must of fail
135c0 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67  ed while writing
135d0 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73   it..    ** This
135e0 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69   indicates nothi
135f0 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f  ng more needs to
13600 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   be rolled back.
13610 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d  .    */.    rc =
13620 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
13630 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52  pPager, szJ, &nR
13640 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20  ec, &mxPg);.    
13650 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
13660 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20  K ){ .      if( 
13670 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
13680 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
13690 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
136a0 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e   }.      goto en
136b0 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
136c0 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
136d0 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  c is 0xffffffff,
136e0 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e   then this journ
136f0 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62  al was created b
13700 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20  y a process.    
13710 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f  ** working in no
13720 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73  -sync mode. This
13730 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
13740 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
13750 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20  nal.    ** file 
13760 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65  consists of page
13770 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20  s, there are no 
13780 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61  more journal hea
13790 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20  ders. Compute.  
137a0 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f    ** the value o
137b0 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20  f nRec based on 
137c0 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e  this assumption.
137d0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
137e0 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66  nRec==0xffffffff
137f0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
13800 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
13810 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
13820 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a  R_SZ(pPager) );.
13830 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 69 6e        nRec = (in
13840 74 29 28 28 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41  t)((szJ - JOURNA
13850 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
13860 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  )/JOURNAL_PG_SZ(
13870 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 7d 0a  pPager));.    }.
13880 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20  .    /* If nRec 
13890 69 73 20 30 20 61 6e 64 20 74 68 69 73 20 72 6f  is 0 and this ro
138a0 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61 20 74  llback is of a t
138b0 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65 61 74  ransaction creat
138c0 65 64 20 62 79 20 74 68 69 73 0a 20 20 20 20 2a  ed by this.    *
138d0 2a 20 70 72 6f 63 65 73 73 20 61 6e 64 20 69 66  * process and if
138e0 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 6e   this is the fin
138f0 61 6c 20 68 65 61 64 65 72 20 69 6e 20 74 68 65  al header in the
13900 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 69   journal, then i
13910 74 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 74  t means.    ** t
13920 68 61 74 20 74 68 69 73 20 70 61 72 74 20 6f 66  hat this part of
13930 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73   the journal was
13940 20 62 65 69 6e 67 20 66 69 6c 6c 65 64 20 62 75   being filled bu
13950 74 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  t has not yet be
13960 65 6e 0a 20 20 20 20 2a 2a 20 73 79 6e 63 65 64  en.    ** synced
13970 20 74 6f 20 64 69 73 6b 2e 20 20 43 6f 6d 70 75   to disk.  Compu
13980 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  te the number of
13990 20 70 61 67 65 73 20 62 61 73 65 64 20 6f 6e 20   pages based on 
139a0 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 0a 20 20  the remaining.  
139b0 20 20 2a 2a 20 73 69 7a 65 20 6f 66 20 74 68 65    ** size of the
139c0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20   file..    **.  
139d0 20 20 2a 2a 20 54 68 65 20 74 68 69 72 64 20 74    ** The third t
139e0 65 72 6d 20 6f 66 20 74 68 65 20 74 65 73 74 20  erm of the test 
139f0 77 61 73 20 61 64 64 65 64 20 74 6f 20 66 69 78  was added to fix
13a00 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 0a 20   ticket #2565.. 
13a10 20 20 20 2a 2a 20 57 68 65 6e 20 72 6f 6c 6c 69     ** When rolli
13a20 6e 67 20 62 61 63 6b 20 61 20 68 6f 74 20 6a 6f  ng back a hot jo
13a30 75 72 6e 61 6c 2c 20 6e 52 65 63 3d 3d 30 20 61  urnal, nRec==0 a
13a40 6c 77 61 79 73 20 6d 65 61 6e 73 20 74 68 61 74  lways means that
13a50 20 74 68 65 20 6e 65 78 74 0a 20 20 20 20 2a 2a   the next.    **
13a60 20 63 68 75 6e 6b 20 6f 66 20 74 68 65 20 6a 6f   chunk of the jo
13a70 75 72 6e 61 6c 20 63 6f 6e 74 61 69 6e 73 20 7a  urnal contains z
13a80 65 72 6f 20 70 61 67 65 73 20 74 6f 20 62 65 20  ero pages to be 
13a90 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 42 75  rolled back.  Bu
13aa0 74 0a 20 20 20 20 2a 2a 20 77 68 65 6e 20 64 6f  t.    ** when do
13ab0 69 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 20 61  ing a ROLLBACK a
13ac0 6e 64 20 74 68 65 20 6e 52 65 63 3d 3d 30 20 63  nd the nRec==0 c
13ad0 68 75 6e 6b 20 69 73 20 74 68 65 20 6c 61 73 74  hunk is the last
13ae0 20 63 68 75 6e 6b 20 69 6e 0a 20 20 20 20 2a 2a   chunk in.    **
13af0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 74   the journal, it
13b00 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
13b10 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
13b20 6e 74 61 69 6e 20 61 64 64 69 74 69 6f 6e 61 6c  ntain additional
13b30 0a 20 20 20 20 2a 2a 20 70 61 67 65 73 20 74 68  .    ** pages th
13b40 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 72 6f  at need to be ro
13b50 6c 6c 65 64 20 62 61 63 6b 20 61 6e 64 20 74 68  lled back and th
13b60 61 74 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  at the number of
13b70 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
13b80 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
13b90 64 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 6a  d based on the j
13ba0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 73 69 7a 65  ournal file size
13bb0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 74 65 73  ..    */.    tes
13bc0 74 63 61 73 65 28 20 6e 52 65 63 3d 3d 30 20 26  tcase( nRec==0 &
13bd0 26 20 21 69 73 48 6f 74 0a 20 20 20 20 20 20 20  & !isHot.       
13be0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
13bf0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
13c00 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 21 3d  HDR_SZ(pPager)!=
13c10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13c20 66 66 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  ff.         && (
13c30 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
13c40 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
13c50 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
13c60 72 29 29 3e 30 0a 20 20 20 20 20 20 20 20 20 26  r))>0.         &
13c70 26 20 70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e  & pagerNextJourn
13c80 61 6c 50 61 67 65 49 73 56 61 6c 69 64 28 70 50  alPageIsValid(pP
13c90 61 67 65 72 29 0a 20 20 20 20 29 3b 0a 20 20 20  ager).    );.   
13ca0 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20   if( nRec==0 && 
13cb0 21 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20  !isHot &&.      
13cc0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
13cd0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
13ce0 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61  _SZ(pPager)==pPa
13cf0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
13d00 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
13d10 28 69 6e 74 29 28 28 73 7a 4a 20 2d 20 70 50 61  (int)((szJ - pPa
13d20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
13d30 20 2f 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a   / JOURNAL_PG_SZ
13d40 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
13d50 20 69 73 55 6e 73 79 6e 63 20 3d 20 31 3b 0a 20   isUnsync = 1;. 
13d60 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
13d70 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
13d80 74 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72  t header read fr
13d90 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
13da0 74 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20  truncate the.   
13db0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
13dc0 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
13dd0 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
13de0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
13df0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
13e00 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
13e10 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
13e20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
13e30 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67  ate(pPager, mxPg
13e40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13e50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13e60 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
13e70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d  layback;.      }
13e80 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
13e90 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20  bSize = mxPg;.  
13ea0 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 43 6f 70 79    }..    /* Copy
13eb0 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
13ec0 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
13ed0 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
13ee0 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 64 61 74   the .    ** dat
13ef0 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 2f 6f  abase file and/o
13f00 72 20 70 61 67 65 20 63 61 63 68 65 2e 0a 20 20  r page cache..  
13f10 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 75 3d 30    */.    for(u=0
13f20 3b 20 75 3c 6e 52 65 63 3b 20 75 2b 2b 29 7b 0a  ; u<nRec; u++){.
13f30 20 20 20 20 20 20 69 66 28 20 6e 65 65 64 50 61        if( needPa
13f40 67 65 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20  gerReset ){.    
13f50 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
13f60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
13f70 20 6e 65 65 64 50 61 67 65 72 52 65 73 65 74 20   needPagerReset 
13f80 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
13f90 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
13fa0 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
13fb0 70 50 61 67 65 72 2c 31 2c 69 73 55 6e 73 79 6e  pPager,1,isUnsyn
13fc0 63 2c 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  c,&pPager->journ
13fd0 61 6c 4f 66 66 2c 30 2c 30 29 3b 0a 20 20 20 20  alOff,0,0);.    
13fe0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13ff0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _OK ){.        i
14000 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f  f( rc==SQLITE_DO
14010 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NE ){.          
14020 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
14030 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
14040 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
14050 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  zJ;.          br
14060 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
14070 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
14080 20 49 66 20 77 65 20 61 72 65 20 75 6e 61 62 6c   If we are unabl
14090 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 2c 20 74  e to rollback, t
140a0 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
140b0 20 69 73 20 70 72 6f 62 61 62 6c 79 0a 20 20 20   is probably.   
140c0 20 20 20 20 20 20 20 2a 2a 20 67 6f 69 6e 67 20         ** going 
140d0 74 6f 20 65 6e 64 20 75 70 20 62 65 69 6e 67 20  to end up being 
140e0 63 6f 72 72 75 70 74 2e 20 20 49 74 20 69 73 20  corrupt.  It is 
140f0 63 6f 72 72 75 70 74 20 74 6f 20 75 73 2c 20 61  corrupt to us, a
14100 6e 79 68 6f 77 2e 0a 20 20 20 20 20 20 20 20 20  nyhow..         
14110 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20   ** Perhaps the 
14120 6e 65 78 74 20 70 72 6f 63 65 73 73 20 74 6f 20  next process to 
14130 63 6f 6d 65 20 61 6c 6f 6e 67 20 63 61 6e 20 66  come along can f
14140 69 78 20 69 74 2e 2e 2e 2e 0a 20 20 20 20 20 20  ix it.....      
14150 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
14160 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
14170 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 20 20 20  RUPT_BKPT;.     
14180 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
14190 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
141a0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
141b0 20 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48    }.  /*NOTREACH
141c0 45 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30  ED*/.  assert( 0
141d0 20 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63   );..end_playbac
141e0 6b 3a 0a 20 20 2f 2a 20 46 6f 6c 6c 6f 77 69 6e  k:.  /* Followin
141f0 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2c 20 74 68  g a rollback, th
14200 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14210 73 68 6f 75 6c 64 20 62 65 20 62 61 63 6b 20 69  should be back i
14220 6e 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20  n its original. 
14230 20 2a 2a 20 73 74 61 74 65 20 70 72 69 6f 72 20   ** state prior 
14240 74 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  to the start of 
14250 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  the transaction,
14260 20 73 6f 20 69 6e 76 6f 6b 65 20 74 68 65 0a 20   so invoke the. 
14270 20 2a 2a 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c   ** SQLITE_FCNTL
14280 5f 44 42 5f 55 4e 43 48 41 4e 47 45 44 20 66 69  _DB_UNCHANGED fi
14290 6c 65 2d 63 6f 6e 74 72 6f 6c 20 6d 65 74 68 6f  le-control metho
142a0 64 20 74 6f 20 64 69 73 61 62 6c 65 20 74 68 65  d to disable the
142b0 0a 20 20 2a 2a 20 61 73 73 65 72 74 69 6f 6e 20  .  ** assertion 
142c0 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63  that the transac
142d0 74 69 6f 6e 20 63 6f 75 6e 74 65 72 20 77 61 73  tion counter was
142e0 20 6d 6f 64 69 66 69 65 64 2e 0a 20 20 2a 2f 0a   modified..  */.
142f0 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 70 50    assert(.    pP
14300 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
14310 64 73 3d 3d 30 20 7c 7c 0a 20 20 20 20 73 71 6c  ds==0 ||.    sql
14320 69 74 65 33 4f 73 46 69 6c 65 43 6f 6e 74 72 6f  ite3OsFileContro
14330 6c 28 70 50 61 67 65 72 2d 3e 66 64 2c 53 51 4c  l(pPager->fd,SQL
14340 49 54 45 5f 46 43 4e 54 4c 5f 44 42 5f 55 4e 43  ITE_FCNTL_DB_UNC
14350 48 41 4e 47 45 44 2c 30 29 3e 3d 53 51 4c 49 54  HANGED,0)>=SQLIT
14360 45 5f 4f 4b 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20  E_OK.  );..  /* 
14370 49 66 20 74 68 69 73 20 70 6c 61 79 62 61 63 6b  If this playback
14380 20 69 73 20 68 61 70 70 65 6e 69 6e 67 20 61 75   is happening au
14390 74 6f 6d 61 74 69 63 61 6c 6c 79 20 61 73 20 61  tomatically as a
143a0 20 72 65 73 75 6c 74 20 6f 66 20 61 6e 20 49 4f   result of an IO
143b0 20 6f 72 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63   or .  ** malloc
143c0 20 65 72 72 6f 72 20 74 68 61 74 20 6f 63 63 75   error that occu
143d0 72 65 64 20 61 66 74 65 72 20 74 68 65 20 63 68  red after the ch
143e0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 77 61 73  ange-counter was
143f0 20 75 70 64 61 74 65 64 20 62 75 74 20 0a 20 20   updated but .  
14400 2a 2a 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  ** before the tr
14410 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 63 6f  ansaction was co
14420 6d 6d 69 74 74 65 64 2c 20 74 68 65 6e 20 74 68  mmitted, then th
14430 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
14440 20 0a 20 20 2a 2a 20 6d 6f 64 69 66 69 63 61 74   .  ** modificat
14450 69 6f 6e 20 6d 61 79 20 6a 75 73 74 20 68 61 76  ion may just hav
14460 65 20 62 65 65 6e 20 72 65 76 65 72 74 65 64 2e  e been reverted.
14470 20 49 66 20 74 68 69 73 20 68 61 70 70 65 6e 73   If this happens
14480 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 0a 20   in exclusive . 
14490 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20 73   ** mode, then s
144a0 75 62 73 65 71 75 65 6e 74 20 74 72 61 6e 73 61  ubsequent transa
144b0 63 74 69 6f 6e 73 20 70 65 72 66 6f 72 6d 65 64  ctions performed
144c0 20 62 79 20 74 68 65 20 63 6f 6e 6e 65 63 74 69   by the connecti
144d0 6f 6e 20 77 69 6c 6c 20 6e 6f 74 0a 20 20 2a 2a  on will not.  **
144e0 20 75 70 64 61 74 65 20 74 68 65 20 63 68 61 6e   update the chan
144f0 67 65 2d 63 6f 75 6e 74 65 72 20 61 74 20 61 6c  ge-counter at al
14500 6c 2e 20 54 68 69 73 20 6d 61 79 20 6c 65 61 64  l. This may lead
14510 20 74 6f 20 63 61 63 68 65 20 69 6e 63 6f 6e 73   to cache incons
14520 69 73 74 65 6e 63 79 0a 20 20 2a 2a 20 70 72 6f  istency.  ** pro
14530 62 6c 65 6d 73 20 66 6f 72 20 6f 74 68 65 72 20  blems for other 
14540 70 72 6f 63 65 73 73 65 73 20 61 74 20 73 6f 6d  processes at som
14550 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66  e point in the f
14560 75 74 75 72 65 2e 20 53 6f 2c 20 6a 75 73 74 0a  uture. So, just.
14570 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 74 68 69    ** in case thi
14580 73 20 68 61 73 20 68 61 70 70 65 6e 65 64 2c 20  s has happened, 
14590 63 6c 65 61 72 20 74 68 65 20 63 68 61 6e 67 65  clear the change
145a0 43 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 20 6e  CountDone flag n
145b0 6f 77 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ow..  */.  pPage
145c0 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f  r->changeCountDo
145d0 6e 65 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d  ne = pPager->tem
145e0 70 46 69 6c 65 3b 0a 0a 20 20 69 66 28 20 72 63  pFile;..  if( rc
145f0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14600 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61     zMaster = pPa
14610 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
14620 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73      rc = readMas
14630 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
14640 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
14650 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d   pPager->pVfs->m
14660 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20  xPathname+1);.  
14670 20 20 74 65 73 74 63 61 73 65 28 20 72 63 21 3d    testcase( rc!=
14680 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 7d  SQLITE_OK );.  }
14690 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
146a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
146b0 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
146c0 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 7a  action(pPager, z
146d0 4d 61 73 74 65 72 5b 30 5d 21 3d 27 5c 30 27 29  Master[0]!='\0')
146e0 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
146f0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b  rc!=SQLITE_OK );
14700 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
14710 51 4c 49 54 45 5f 4f 4b 20 26 26 20 7a 4d 61 73  QLITE_OK && zMas
14720 74 65 72 5b 30 5d 20 26 26 20 72 65 73 20 29 7b  ter[0] && res ){
14730 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
14740 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
14750 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
14760 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
14770 72 6e 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20  rn success,.    
14780 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73 20  ** see if it is 
14790 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
147a0 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
147b0 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20  urnal..    */.  
147c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
147d0 6d 61 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a  master(pPager, z
147e0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 74 65 73  Master);.    tes
147f0 74 63 61 73 65 28 20 72 63 21 3d 53 51 4c 49 54  tcase( rc!=SQLIT
14800 45 5f 4f 4b 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  E_OK );.  }..  /
14810 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74  * The Pager.sect
14820 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20  orSize variable 
14830 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70  may have been up
14840 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c  dated while roll
14850 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20  ing.  ** back a 
14860 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20  journal created 
14870 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74  by a process wit
14880 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65  h a different se
14890 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76  ctor size.  ** v
148a0 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74  alue. Reset it t
148b0 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61  o the correct va
148c0 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f  lue for this pro
148d0 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74  cess..  */.  set
148e0 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
148f0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
14900 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
14910 63 6b 20 73 61 76 65 70 6f 69 6e 74 20 70 53 61  ck savepoint pSa
14920 76 65 70 6f 69 6e 74 2e 20 4f 72 2c 20 69 66 20  vepoint. Or, if 
14930 70 53 61 76 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c  pSavepoint==NULL
14940 2c 20 74 68 65 6e 20 70 6c 61 79 62 61 63 6b 0a  , then playback.
14950 2a 2a 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ** the entire ma
14960 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
14970 65 2e 20 54 68 65 20 63 61 73 65 20 70 53 61 76  e. The case pSav
14980 65 70 6f 69 6e 74 3d 3d 4e 55 4c 4c 20 6f 63 63  epoint==NULL occ
14990 75 72 73 20 77 68 65 6e 20 0a 2a 2a 20 61 20 52  urs when .** a R
149a0 4f 4c 4c 42 41 43 4b 20 54 4f 20 63 6f 6d 6d 61  OLLBACK TO comma
149b0 6e 64 20 69 73 20 69 6e 76 6f 6b 65 64 20 6f 6e  nd is invoked on
149c0 20 61 20 53 41 56 45 50 4f 49 4e 54 20 74 68 61   a SAVEPOINT tha
149d0 74 20 69 73 20 61 20 74 72 61 6e 73 61 63 74 69  t is a transacti
149e0 6f 6e 20 0a 2a 2a 20 73 61 76 65 70 6f 69 6e 74  on .** savepoint
149f0 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 70 53 61  ..**.** When pSa
14a00 76 65 70 6f 69 6e 74 20 69 73 20 6e 6f 74 20 4e  vepoint is not N
14a10 55 4c 4c 20 28 6d 65 61 6e 69 6e 67 20 61 20 6e  ULL (meaning a n
14a20 6f 6e 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 73  on-transaction s
14a30 61 76 65 70 6f 69 6e 74 20 69 73 20 0a 2a 2a 20  avepoint is .** 
14a40 62 65 69 6e 67 20 72 6f 6c 6c 65 64 20 62 61 63  being rolled bac
14a50 6b 29 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  k), then the rol
14a60 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f  lback consists o
14a70 66 20 75 70 20 74 6f 20 74 68 72 65 65 20 73 74  f up to three st
14a80 61 67 65 73 2c 0a 2a 2a 20 70 65 72 66 6f 72 6d  ages,.** perform
14a90 65 64 20 69 6e 20 74 68 65 20 6f 72 64 65 72 20  ed in the order 
14aa0 73 70 65 63 69 66 69 65 64 3a 0a 2a 2a 0a 2a 2a  specified:.**.**
14ab0 20 20 20 2a 20 50 61 67 65 73 20 61 72 65 20 70     * Pages are p
14ac0 6c 61 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20  layed back from 
14ad0 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
14ae0 20 73 74 61 72 74 69 6e 67 20 61 74 20 62 79 74   starting at byt
14af0 65 0a 2a 2a 20 20 20 20 20 6f 66 66 73 65 74 20  e.**     offset 
14b00 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e 69  PagerSavepoint.i
14b10 4f 66 66 73 65 74 20 61 6e 64 20 63 6f 6e 74 69  Offset and conti
14b20 6e 75 69 6e 67 20 74 6f 20 0a 2a 2a 20 20 20 20  nuing to .**    
14b30 20 50 61 67 65 72 53 61 76 65 70 6f 69 6e 74 2e   PagerSavepoint.
14b40 69 48 64 72 4f 66 66 73 65 74 2c 20 6f 72 20 74  iHdrOffset, or t
14b50 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
14b60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a   main journal.**
14b70 20 20 20 20 20 66 69 6c 65 20 69 66 20 50 61 67       file if Pag
14b80 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
14b90 4f 66 66 73 65 74 20 69 73 20 7a 65 72 6f 2e 0a  Offset is zero..
14ba0 2a 2a 0a 2a 2a 20 20 20 2a 20 49 66 20 50 61 67  **.**   * If Pag
14bb0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 48 64 72  erSavepoint.iHdr
14bc0 4f 66 66 73 65 74 20 69 73 20 6e 6f 74 20 7a 65  Offset is not ze
14bd0 72 6f 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  ro, then pages a
14be0 72 65 20 70 6c 61 79 65 64 0a 2a 2a 20 20 20 20  re played.**    
14bf0 20 62 61 63 6b 20 73 74 61 72 74 69 6e 67 20 66   back starting f
14c00 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
14c10 68 65 61 64 65 72 20 69 6d 6d 65 64 69 61 74 65  header immediate
14c20 6c 79 20 66 6f 6c 6c 6f 77 69 6e 67 20 0a 2a 2a  ly following .**
14c30 20 20 20 20 20 50 61 67 65 72 53 61 76 65 70 6f       PagerSavepo
14c40 69 6e 74 2e 69 48 64 72 4f 66 66 73 65 74 20 74  int.iHdrOffset t
14c50 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
14c60 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
14c70 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 50 61  le..**.**   * Pa
14c80 67 65 73 20 61 72 65 20 74 68 65 6e 20 70 6c 61  ges are then pla
14c90 79 65 64 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  yed back from th
14ca0 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 69  e sub-journal fi
14cb0 6c 65 2c 20 73 74 61 72 74 69 6e 67 0a 2a 2a 20  le, starting.** 
14cc0 20 20 20 20 77 69 74 68 20 74 68 65 20 50 61 67      with the Pag
14cd0 65 72 53 61 76 65 70 6f 69 6e 74 2e 69 53 75 62  erSavepoint.iSub
14ce0 52 65 63 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69  Rec and continui
14cf0 6e 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  ng to the end of
14d00 0a 2a 2a 20 20 20 20 20 74 68 65 20 6a 6f 75 72  .**     the jour
14d10 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20  nal file..**.** 
14d20 54 68 72 6f 75 67 68 6f 75 74 20 74 68 65 20 72  Throughout the r
14d30 6f 6c 6c 62 61 63 6b 20 70 72 6f 63 65 73 73 2c  ollback process,
14d40 20 65 61 63 68 20 74 69 6d 65 20 61 20 70 61 67   each time a pag
14d50 65 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  e is rolled back
14d60 2c 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  , the.** corresp
14d70 6f 6e 64 69 6e 67 20 62 69 74 20 69 73 20 73 65  onding bit is se
14d80 74 20 69 6e 20 61 20 62 69 74 76 65 63 20 73 74  t in a bitvec st
14d90 72 75 63 74 75 72 65 20 28 76 61 72 69 61 62 6c  ructure (variabl
14da0 65 20 70 44 6f 6e 65 20 69 6e 20 74 68 65 0a 2a  e pDone in the.*
14db0 2a 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * implementation
14dc0 20 62 65 6c 6f 77 29 2e 20 54 68 69 73 20 69 73   below). This is
14dd0 20 75 73 65 64 20 74 6f 20 65 6e 73 75 72 65 20   used to ensure 
14de0 74 68 61 74 20 61 20 70 61 67 65 20 69 73 20 6f  that a page is o
14df0 6e 6c 79 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61  nly.** rolled ba
14e00 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
14e10 65 20 69 74 20 69 73 20 65 6e 63 6f 75 6e 74 65  e it is encounte
14e20 72 65 64 20 69 6e 20 65 69 74 68 65 72 20 6a 6f  red in either jo
14e30 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
14e40 70 53 61 76 65 70 6f 69 6e 74 20 69 73 20 4e 55  pSavepoint is NU
14e50 4c 4c 2c 20 74 68 65 6e 20 70 61 67 65 73 20 61  LL, then pages a
14e60 72 65 20 6f 6e 6c 79 20 70 6c 61 79 65 64 20 62  re only played b
14e70 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 6d 61 69  ack from the mai
14e80 6e 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  n.** journal fil
14e90 65 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 6e  e. There is no n
14ea0 65 65 64 20 66 6f 72 20 61 20 62 69 74 76 65 63  eed for a bitvec
14eb0 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
14ec0 2a 0a 2a 2a 20 49 6e 20 65 69 74 68 65 72 20 63  *.** In either c
14ed0 61 73 65 2c 20 62 65 66 6f 72 65 20 70 6c 61 79  ase, before play
14ee0 62 61 63 6b 20 63 6f 6d 6d 65 6e 63 65 73 20 74  back commences t
14ef0 68 65 20 50 61 67 65 72 2e 64 62 53 69 7a 65 20  he Pager.dbSize 
14f00 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69 73 20 72  variable.** is r
14f10 65 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75  eset to the valu
14f20 65 20 74 68 61 74 20 69 74 20 68 65 6c 64 20 61  e that it held a
14f30 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74  t the start of t
14f40 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 2a 2a  he savepoint .**
14f50 20 28 6f 72 20 74 72 61 6e 73 61 63 74 69 6f 6e   (or transaction
14f60 29 2e 20 4e 6f 20 70 61 67 65 20 77 69 74 68 20  ). No page with 
14f70 61 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 67 72  a page-number gr
14f80 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 20  eater than this 
14f90 76 61 6c 75 65 0a 2a 2a 20 69 73 20 70 6c 61 79  value.** is play
14fa0 65 64 20 62 61 63 6b 2e 20 49 66 20 6f 6e 65 20  ed back. If one 
14fb0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 20 69  is encountered i
14fc0 74 20 69 73 20 73 69 6d 70 6c 79 20 73 6b 69 70  t is simply skip
14fd0 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ped..*/.static i
14fe0 6e 74 20 70 61 67 65 72 50 6c 61 79 62 61 63 6b  nt pagerPlayback
14ff0 53 61 76 65 70 6f 69 6e 74 28 50 61 67 65 72 20  Savepoint(Pager 
15000 2a 70 50 61 67 65 72 2c 20 50 61 67 65 72 53 61  *pPager, PagerSa
15010 76 65 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f  vepoint *pSavepo
15020 69 6e 74 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  int){.  i64 szJ;
15030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15040 20 2f 2a 20 45 66 66 65 63 74 69 76 65 20 73 69   /* Effective si
15050 7a 65 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ze of the main j
15060 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
15070 69 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  iHdrOff;        
15080 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 66       /* End of f
15090 69 72 73 74 20 73 65 67 6d 65 6e 74 20 6f 66 20  irst segment of 
150a0 6d 61 69 6e 2d 6a 6f 75 72 6e 61 6c 20 72 65 63  main-journal rec
150b0 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63  ords */.  int rc
150c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20   = SQLITE_OK;   
150d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
150e0 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a 70  e */.  Bitvec *p
150f0 44 6f 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20  Done = 0;       
15100 2f 2a 20 42 69 74 76 65 63 20 74 6f 20 65 6e 73  /* Bitvec to ens
15110 75 72 65 20 70 61 67 65 73 20 70 6c 61 79 65 64  ure pages played
15120 20 62 61 63 6b 20 6f 6e 6c 79 20 6f 6e 63 65 20   back only once 
15130 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
15140 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
15150 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20  ER_SHARED );..  
15160 2f 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 62 69  /* Allocate a bi
15170 74 76 65 63 20 74 6f 20 75 73 65 20 74 6f 20 73  tvec to use to s
15180 74 6f 72 65 20 74 68 65 20 73 65 74 20 6f 66 20  tore the set of 
15190 70 61 67 65 73 20 72 6f 6c 6c 65 64 20 62 61 63  pages rolled bac
151a0 6b 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65  k */.  if( pSave
151b0 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 70 44 6f  point ){.    pDo
151c0 6e 65 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76  ne = sqlite3Bitv
151d0 65 63 43 72 65 61 74 65 28 70 53 61 76 65 70 6f  ecCreate(pSavepo
151e0 69 6e 74 2d 3e 6e 4f 72 69 67 29 3b 0a 20 20 20  int->nOrig);.   
151f0 20 69 66 28 20 21 70 44 6f 6e 65 20 29 7b 0a 20   if( !pDone ){. 
15200 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
15210 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a  TE_NOMEM;.    }.
15220 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68    }..  /* Set th
15230 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
15240 62 61 63 6b 20 74 6f 20 74 68 65 20 76 61 6c 75  back to the valu
15250 65 20 69 74 20 77 61 73 20 62 65 66 6f 72 65 20  e it was before 
15260 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 0a 20  the savepoint . 
15270 20 2a 2a 20 62 65 69 6e 67 20 72 65 76 65 72 74   ** being revert
15280 65 64 20 77 61 73 20 6f 70 65 6e 65 64 2e 0a 20  ed was opened.. 
15290 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   */.  pPager->db
152a0 53 69 7a 65 20 3d 20 70 53 61 76 65 70 6f 69 6e  Size = pSavepoin
152b0 74 20 3f 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e  t ? pSavepoint->
152c0 6e 4f 72 69 67 20 3a 20 70 50 61 67 65 72 2d 3e  nOrig : pPager->
152d0 64 62 4f 72 69 67 53 69 7a 65 3b 0a 0a 20 20 2f  dbOrigSize;..  /
152e0 2a 20 55 73 65 20 70 50 61 67 65 72 2d 3e 6a 6f  * Use pPager->jo
152f0 75 72 6e 61 6c 4f 66 66 20 61 73 20 74 68 65 20  urnalOff as the 
15300 65 66 66 65 63 74 69 76 65 20 73 69 7a 65 20 6f  effective size o
15310 66 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62  f the main rollb
15320 61 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ack.  ** journal
15330 2e 20 20 54 68 65 20 61 63 74 75 61 6c 20 66 69  .  The actual fi
15340 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 61 72 67  le might be larg
15350 65 72 20 74 68 61 6e 20 74 68 69 73 20 69 6e 0a  er than this in.
15360 20 20 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e    ** PAGER_JOURN
15370 41 4c 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 20  ALMODE_TRUNCATE 
15380 6f 72 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  or PAGER_JOURNAL
15390 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20 20 42  MODE_PERSIST.  B
153a0 75 74 20 61 6e 79 74 68 69 6e 67 0a 20 20 2a 2a  ut anything.  **
153b0 20 70 61 73 74 20 70 50 61 67 65 72 2d 3e 6a 6f   past pPager->jo
153c0 75 72 6e 61 6c 4f 66 66 20 69 73 20 6f 66 66 2d  urnalOff is off-
153d0 6c 69 6d 69 74 73 20 74 6f 20 75 73 2e 0a 20 20  limits to us..  
153e0 2a 2f 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67 65  */.  szJ = pPage
153f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a  r->journalOff;..
15400 20 20 2f 2a 20 42 65 67 69 6e 20 62 79 20 72 6f    /* Begin by ro
15410 6c 6c 69 6e 67 20 62 61 63 6b 20 72 65 63 6f 72  lling back recor
15420 64 73 20 66 72 6f 6d 20 74 68 65 20 6d 61 69 6e  ds from the main
15430 20 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e   journal startin
15440 67 20 61 74 0a 20 20 2a 2a 20 50 61 67 65 72 53  g at.  ** PagerS
15450 61 76 65 70 6f 69 6e 74 2e 69 4f 66 66 73 65 74  avepoint.iOffset
15460 20 61 6e 64 20 63 6f 6e 74 69 6e 75 69 6e 67 20   and continuing 
15470 74 6f 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72  to the next jour
15480 6e 61 6c 20 68 65 61 64 65 72 2e 0a 20 20 2a 2a  nal header..  **
15490 20 54 68 65 72 65 20 6d 69 67 68 74 20 62 65 20   There might be 
154a0 72 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20 6d  records in the m
154b0 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 74 68 61 74  ain journal that
154c0 20 68 61 76 65 20 61 20 70 61 67 65 20 6e 75 6d   have a page num
154d0 62 65 72 0a 20 20 2a 2a 20 67 72 65 61 74 65 72  ber.  ** greater
154e0 20 74 68 61 6e 20 74 68 65 20 63 75 72 72 65 6e   than the curren
154f0 74 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  t database size 
15500 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
15510 20 62 75 74 20 74 68 6f 73 65 0a 20 20 2a 2a 20   but those.  ** 
15520 77 69 6c 6c 20 62 65 20 73 6b 69 70 70 65 64 20  will be skipped 
15530 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 2e 20 20  automatically.  
15540 50 61 67 65 73 20 61 72 65 20 61 64 64 65 64 20  Pages are added 
15550 74 6f 20 70 44 6f 6e 65 20 61 73 20 74 68 65 79  to pDone as they
15560 0a 20 20 2a 2a 20 61 72 65 20 70 6c 61 79 65 64  .  ** are played
15570 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66   back..  */.  if
15580 28 20 70 53 61 76 65 70 6f 69 6e 74 20 29 7b 0a  ( pSavepoint ){.
15590 20 20 20 20 69 48 64 72 4f 66 66 20 3d 20 70 53      iHdrOff = pS
155a0 61 76 65 70 6f 69 6e 74 2d 3e 69 48 64 72 4f 66  avepoint->iHdrOf
155b0 66 73 65 74 20 3f 20 70 53 61 76 65 70 6f 69 6e  fset ? pSavepoin
155c0 74 2d 3e 69 48 64 72 4f 66 66 73 65 74 20 3a 20  t->iHdrOffset : 
155d0 73 7a 4a 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  szJ;.    pPager-
155e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 53  >journalOff = pS
155f0 61 76 65 70 6f 69 6e 74 2d 3e 69 4f 66 66 73 65  avepoint->iOffse
15600 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63  t;.    while( rc
15610 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70  ==SQLITE_OK && p
15620 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15630 66 3c 69 48 64 72 4f 66 66 20 29 7b 0a 20 20 20  f<iHdrOff ){.   
15640 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
15650 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
15660 70 50 61 67 65 72 2c 20 31 2c 20 30 2c 20 26 70  pPager, 1, 0, &p
15670 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
15680 66 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20 20  f, 1, pDone);.  
15690 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
156a0 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
156b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
156c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
156d0 66 66 20 3d 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  ff = 0;.  }..  /
156e0 2a 20 43 6f 6e 74 69 6e 75 65 20 72 6f 6c 6c 69  * Continue rolli
156f0 6e 67 20 62 61 63 6b 20 72 65 63 6f 72 64 73 20  ng back records 
15700 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69 6e 20  out of the main 
15710 6a 6f 75 72 6e 61 6c 20 73 74 61 72 74 69 6e 67  journal starting
15720 20 61 74 0a 20 20 2a 2a 20 74 68 65 20 66 69 72   at.  ** the fir
15730 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
15740 72 20 73 65 65 6e 20 61 6e 64 20 63 6f 6e 74 69  r seen and conti
15750 6e 75 69 6e 67 20 75 6e 74 69 6c 20 74 68 65 20  nuing until the 
15760 65 66 66 65 63 74 69 76 65 20 65 6e 64 0a 20 20  effective end.  
15770 2a 2a 20 6f 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** of the main j
15780 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 43 6f  ournal file.  Co
15790 6e 74 69 6e 75 65 20 74 6f 20 73 6b 69 70 20 6f  ntinue to skip o
157a0 75 74 2d 6f 66 2d 72 61 6e 67 65 20 70 61 67 65  ut-of-range page
157b0 73 20 61 6e 64 0a 20 20 2a 2a 20 63 6f 6e 74 69  s and.  ** conti
157c0 6e 75 65 20 61 64 64 69 6e 67 20 70 61 67 65 73  nue adding pages
157d0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 6f 20   rolled back to 
157e0 70 44 6f 6e 65 2e 0a 20 20 2a 2f 0a 20 20 77 68  pDone..  */.  wh
157f0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
15800 4f 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  OK && pPager->jo
15810 75 72 6e 61 6c 4f 66 66 3c 73 7a 4a 20 29 7b 0a  urnalOff<szJ ){.
15820 20 20 20 20 75 33 32 20 69 69 3b 20 20 20 20 20      u32 ii;     
15830 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
15840 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 75 33  ounter */.    u3
15850 32 20 6e 4a 52 65 63 20 3d 20 30 3b 20 20 20 20  2 nJRec = 0;    
15860 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
15870 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
15880 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
15890 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
158a0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
158b0 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
158c0 6d 6d 79 29 3b 0a 20 20 20 20 61 73 73 65 72 74  mmy);.    assert
158d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
158e0 45 20 29 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  E );..    /*.   
158f0 20 2a 2a 20 54 68 65 20 22 70 50 61 67 65 72 2d   ** The "pPager-
15900 3e 6a 6f 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52  >journalHdr+JOUR
15910 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
15920 72 29 3d 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72  r)==pPager->jour
15930 6e 61 6c 4f 66 66 22 0a 20 20 20 20 2a 2a 20 74  nalOff".    ** t
15940 65 73 74 20 69 73 20 72 65 6c 61 74 65 64 20 74  est is related t
15950 6f 20 74 69 63 6b 65 74 20 23 32 35 36 35 2e 20  o ticket #2565. 
15960 20 53 65 65 20 74 68 65 20 64 69 73 63 75 73 73   See the discuss
15970 69 6f 6e 20 69 6e 20 74 68 65 0a 20 20 20 20 2a  ion in the.    *
15980 2a 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  * pager_playback
15990 28 29 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20  () function for 
159a0 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
159b0 6d 61 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  mation..    */. 
159c0 20 20 20 61 73 73 65 72 74 28 20 21 28 6e 4a 52     assert( !(nJR
159d0 65 63 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ec==0.         &
159e0 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
159f0 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52  lHdr+JOURNAL_HDR
15a00 5f 53 5a 28 70 50 61 67 65 72 29 21 3d 70 50 61  _SZ(pPager)!=pPa
15a10 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 0a  ger->journalOff.
15a20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 73 7a           && ((sz
15a30 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
15a40 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52 4e 41  nalOff) / JOURNA
15a50 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29  L_PG_SZ(pPager))
15a60 3e 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 70  >0.         && p
15a70 61 67 65 72 4e 65 78 74 4a 6f 75 72 6e 61 6c 50  agerNextJournalP
15a80 61 67 65 49 73 56 61 6c 69 64 28 70 50 61 67 65  ageIsValid(pPage
15a90 72 29 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  r)).    );.    i
15aa0 66 28 20 6e 4a 52 65 63 3d 3d 30 20 0a 20 20 20  f( nJRec==0 .   
15ab0 20 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75    && pPager->jou
15ac0 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
15ad0 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
15ae0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
15af0 66 66 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  ff.    ){.      
15b00 6e 4a 52 65 63 20 3d 20 28 75 33 32 29 28 28 73  nJRec = (u32)((s
15b10 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
15b20 72 6e 61 6c 4f 66 66 29 2f 4a 4f 55 52 4e 41 4c  rnalOff)/JOURNAL
15b30 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 29 3b  _PG_SZ(pPager));
15b40 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
15b50 69 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=0; rc==SQLITE_
15b60 4f 4b 20 26 26 20 69 69 3c 6e 4a 52 65 63 20 26  OK && ii<nJRec &
15b70 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
15b80 6c 4f 66 66 3c 73 7a 4a 3b 20 69 69 2b 2b 29 7b  lOff<szJ; ii++){
15b90 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
15ba0 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
15bb0 61 67 65 28 70 50 61 67 65 72 2c 20 31 2c 20 30  age(pPager, 1, 0
15bc0 2c 20 26 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  , &pPager->journ
15bd0 61 6c 4f 66 66 2c 20 31 2c 20 70 44 6f 6e 65 29  alOff, 1, pDone)
15be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
15bf0 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
15c00 4f 4e 45 20 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ONE );.  }.  ass
15c10 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
15c20 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f  OK || pPager->jo
15c30 75 72 6e 61 6c 4f 66 66 3d 3d 73 7a 4a 20 29 3b  urnalOff==szJ );
15c40 0a 0a 20 20 2f 2a 20 46 69 6e 61 6c 6c 79 2c 20  ..  /* Finally, 
15c50 20 72 6f 6c 6c 62 61 63 6b 20 70 61 67 65 73 20   rollback pages 
15c60 66 72 6f 6d 20 74 68 65 20 73 75 62 2d 6a 6f 75  from the sub-jou
15c70 72 6e 61 6c 2e 20 20 50 61 67 65 20 74 68 61 74  rnal.  Page that
15c80 20 77 65 72 65 0a 20 20 2a 2a 20 70 72 65 76 69   were.  ** previ
15c90 6f 75 73 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  ously rolled bac
15ca0 6b 20 6f 75 74 20 6f 66 20 74 68 65 20 6d 61 69  k out of the mai
15cb0 6e 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 61  n journal (and a
15cc0 72 65 20 68 65 6e 63 65 20 69 6e 20 70 44 6f 6e  re hence in pDon
15cd0 65 29 0a 20 20 2a 2a 20 77 69 6c 6c 20 62 65 20  e).  ** will be 
15ce0 73 6b 69 70 70 65 64 2e 20 20 4f 75 74 2d 6f 66  skipped.  Out-of
15cf0 2d 72 61 6e 67 65 20 70 61 67 65 73 20 61 72 65  -range pages are
15d00 20 61 6c 73 6f 20 73 6b 69 70 70 65 64 2e 0a 20   also skipped.. 
15d10 20 2a 2f 0a 20 20 69 66 28 20 70 53 61 76 65 70   */.  if( pSavep
15d20 6f 69 6e 74 20 29 7b 0a 20 20 20 20 75 33 32 20  oint ){.    u32 
15d30 69 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  ii;            /
15d40 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
15d50 2f 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  /.    i64 offset
15d60 20 3d 20 70 53 61 76 65 70 6f 69 6e 74 2d 3e 69   = pSavepoint->i
15d70 53 75 62 52 65 63 2a 28 34 2b 70 50 61 67 65 72  SubRec*(4+pPager
15d80 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
15d90 20 66 6f 72 28 69 69 3d 70 53 61 76 65 70 6f 69   for(ii=pSavepoi
15da0 6e 74 2d 3e 69 53 75 62 52 65 63 3b 20 72 63 3d  nt->iSubRec; rc=
15db0 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 69  =SQLITE_OK && ii
15dc0 3c 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65 63  <pPager->nSubRec
15dd0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ; ii++){.      a
15de0 73 73 65 72 74 28 20 6f 66 66 73 65 74 3d 3d 69  ssert( offset==i
15df0 69 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67  i*(4+pPager->pag
15e00 65 53 69 7a 65 29 20 29 3b 0a 20 20 20 20 20 20  eSize) );.      
15e10 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
15e20 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
15e30 67 65 72 2c 20 30 2c 20 30 2c 20 26 6f 66 66 73  ger, 0, 0, &offs
15e40 65 74 2c 20 31 2c 20 70 44 6f 6e 65 29 3b 0a 20  et, 1, pDone);. 
15e50 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
15e60 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
15e70 20 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74   );.  }..  sqlit
15e80 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
15e90 70 44 6f 6e 65 29 3b 0a 20 20 69 66 28 20 72 63  pDone);.  if( rc
15ea0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
15eb0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
15ec0 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  alOff = szJ;.  }
15ed0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15ee0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
15ef0 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
15f00 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
15f10 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
15f20 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
15f30 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
15f40 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
15f50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
15f60 29 7b 0a 20 20 73 71 6c 69 74 65 33 50 63 61 63  ){.  sqlite3Pcac
15f70 68 65 53 65 74 43 61 63 68 65 73 69 7a 65 28 70  heSetCachesize(p
15f80 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 2c 20  Pager->pPCache, 
15f90 6d 78 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  mxPage);.}../*.*
15fa0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
15fb0 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
15fc0 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
15fd0 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
15fe0 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
15ff0 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
16000 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
16010 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
16020 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
16030 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
16040 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
16050 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
16060 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
16070 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
16080 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
16090 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
160a0 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
160b0 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
160c0 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
160d0 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
160e0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
160f0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
16100 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
16110 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
16120 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16130 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
16140 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
16150 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
16160 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
16170 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
16180 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
16190 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
161a0 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
161b0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
161c0 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
161d0 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
161e0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
161f0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
16200 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
16210 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
16220 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
16230 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
16240 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
16250 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
16260 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
16270 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
16280 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
16290 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
162a0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
162b0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
162c0 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
162d0 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
162e0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
162f0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
16300 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
16310 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
16320 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
16330 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
16340 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
16350 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
16360 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
16370 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
16380 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
16390 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
163a0 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
163b0 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
163c0 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
163d0 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
163e0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
163f0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
16400 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
16410 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
16420 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
16430 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
16440 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
16450 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
16460 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
16470 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
16480 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
16490 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
164a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
164b0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
164c0 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
164d0 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
164e0 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
164f0 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
16500 6e 74 20 62 46 75 6c 6c 46 73 79 6e 63 29 7b 0a  nt bFullFsync){.
16510 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
16520 20 3d 20 20 28 6c 65 76 65 6c 3d 3d 31 20 7c 7c   =  (level==1 ||
16530 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
16540 65 29 20 3f 31 3a 30 3b 0a 20 20 70 50 61 67 65  e) ?1:0;.  pPage
16550 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 6c  r->fullSync = (l
16560 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
16570 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 20 3f 31  er->tempFile) ?1
16580 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  :0;.  pPager->sy
16590 6e 63 5f 66 6c 61 67 73 20 3d 20 28 62 46 75 6c  nc_flags = (bFul
165a0 6c 46 73 79 6e 63 3f 53 51 4c 49 54 45 5f 53 59  lFsync?SQLITE_SY
165b0 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45 5f 53  NC_FULL:SQLITE_S
165c0 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20 20 69  YNC_NORMAL);.  i
165d0 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
165e0 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
165f0 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  Sync = 0;.}.#end
16600 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  if../*.** The fo
16610 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76  llowing global v
16620 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63 72 65  ariable is incre
16630 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65 72 20  mented whenever 
16640 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 61  the library.** a
16650 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65 6e 20  ttempts to open 
16660 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
16670 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d 61 74  .  This informat
16680 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f 72 0a  ion is used for.
16690 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64 20 61  ** testing and a
166a0 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20 20 0a  nalysis only.  .
166b0 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
166c0 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
166d0 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74  3_opentemp_count
166e0 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a   = 0;.#endif../*
166f0 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
16700 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a  rary file..**.**
16710 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65 20   Write the file 
16720 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
16730 2a 70 46 69 6c 65 2e 20 52 65 74 75 72 6e 20 53  *pFile. Return S
16740 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
16750 65 73 73 20 0a 2a 2a 20 6f 72 20 73 6f 6d 65 20  ess .** or some 
16760 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
16770 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
16780 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
16790 69 63 61 6c 6c 79 20 0a 2a 2a 20 64 65 6c 65 74  ically .** delet
167a0 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
167b0 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20  file when it is 
167c0 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  closed..**.** Th
167d0 65 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  e flags passed t
167e0 6f 20 74 68 65 20 56 46 53 20 6c 61 79 65 72 20  o the VFS layer 
167f0 78 4f 70 65 6e 28 29 20 63 61 6c 6c 20 61 72 65  xOpen() call are
16800 20 74 68 6f 73 65 20 73 70 65 63 69 66 69 65 64   those specified
16810 0a 2a 2a 20 62 79 20 70 61 72 61 6d 65 74 65 72  .** by parameter
16820 20 76 66 73 46 6c 61 67 73 20 4f 52 65 64 20 77   vfsFlags ORed w
16830 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  ith the followin
16840 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 51 4c  g:.**.**     SQL
16850 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
16860 54 45 0a 2a 2a 20 20 20 20 20 53 51 4c 49 54 45  TE.**     SQLITE
16870 5f 4f 50 45 4e 5f 43 52 45 41 54 45 0a 2a 2a 20  _OPEN_CREATE.** 
16880 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
16890 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20 20 20  EXCLUSIVE.**    
168a0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
168b0 45 54 45 4f 4e 43 4c 4f 53 45 0a 2a 2f 0a 73 74  ETEONCLOSE.*/.st
168c0 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 4f 70  atic int pagerOp
168d0 65 6e 74 65 6d 70 28 0a 20 20 50 61 67 65 72 20  entemp(.  Pager 
168e0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 20 20  *pPager,        
168f0 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 62 6a  /* The pager obj
16900 65 63 74 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ect */.  sqlite3
16910 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
16920 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
16930 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
16940 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
16950 67 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  gs          /* F
16960 6c 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f  lags passed thro
16970 75 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a  ugh to the VFS *
16980 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  /.){.  int rc;  
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
169a0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a  Return code */..
169b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
169c0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
169d0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
169e0 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
169f0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
16a00 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
16a10 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
16a20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
16a30 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
16a40 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
16a50 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
16a60 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
16a70 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
16a80 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
16a90 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
16aa0 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 30  (pPager->pVfs, 0
16ab0 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
16ac0 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
16ad0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
16ae0 7c 20 69 73 4f 70 65 6e 28 70 46 69 6c 65 29 20  | isOpen(pFile) 
16af0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
16b00 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
16b10 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
16b20 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  nction..**.** Th
16b30 65 20 70 61 67 65 72 20 69 6e 76 6f 6b 65 73 20  e pager invokes 
16b40 74 68 65 20 62 75 73 79 2d 68 61 6e 64 6c 65 72  the busy-handler
16b50 20 69 66 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63   if sqlite3OsLoc
16b60 6b 28 29 20 72 65 74 75 72 6e 73 20 0a 2a 2a 20  k() returns .** 
16b70 53 51 4c 49 54 45 5f 42 55 53 59 20 77 68 65 6e  SQLITE_BUSY when
16b80 20 74 72 79 69 6e 67 20 74 6f 20 75 70 67 72 61   trying to upgra
16b90 64 65 20 66 72 6f 6d 20 6e 6f 2d 6c 6f 63 6b 20  de from no-lock 
16ba0 74 6f 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b  to a SHARED lock
16bb0 2c 0a 2a 2a 20 6f 72 20 77 68 65 6e 20 74 72 79  ,.** or when try
16bc0 69 6e 67 20 74 6f 20 75 70 67 72 61 64 65 20 66  ing to upgrade f
16bd0 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44 20 6c  rom a RESERVED l
16be0 6f 63 6b 20 74 6f 20 61 6e 20 45 58 43 4c 55 53  ock to an EXCLUS
16bf0 49 56 45 20 0a 2a 2a 20 6c 6f 63 6b 2e 20 49 74  IVE .** lock. It
16c00 20 64 6f 65 73 20 2a 6e 6f 74 2a 20 69 6e 76 6f   does *not* invo
16c10 6b 65 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  ke the busy hand
16c20 6c 65 72 20 77 68 65 6e 20 75 70 67 72 61 64 69  ler when upgradi
16c30 6e 67 20 66 72 6f 6d 0a 2a 2a 20 53 48 41 52 45  ng from.** SHARE
16c40 44 20 74 6f 20 52 45 53 45 52 56 45 44 2c 20 6f  D to RESERVED, o
16c50 72 20 77 68 65 6e 20 75 70 67 72 61 64 69 6e 67  r when upgrading
16c60 20 66 72 6f 6d 20 53 48 41 52 45 44 20 74 6f 20   from SHARED to 
16c70 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 28 77 68  EXCLUSIVE.** (wh
16c80 69 63 68 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ich occurs durin
16c90 67 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 72 6f  g hot-journal ro
16ca0 6c 6c 62 61 63 6b 29 2e 20 53 75 6d 6d 61 72 79  llback). Summary
16cb0 3a 0a 2a 2a 0a 2a 2a 20 20 20 54 72 61 6e 73 69  :.**.**   Transi
16cc0 74 69 6f 6e 20 20 20 20 20 20 20 20 20 20 20 20  tion            
16cd0 20 20 20 20 20 20 20 20 20 20 20 20 7c 20 49 6e              | In
16ce0 76 6f 6b 65 73 20 78 42 75 73 79 48 61 6e 64 6c  vokes xBusyHandl
16cf0 65 72 0a 2a 2a 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  er.**   --------
16d00 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d10 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
16d30 0a 2a 2a 20 20 20 4e 4f 5f 4c 4f 43 4b 20 20 20  .**   NO_LOCK   
16d40 20 20 20 20 2d 3e 20 53 48 41 52 45 44 5f 4c 4f      -> SHARED_LO
16d50 43 4b 20 20 20 20 20 20 7c 20 59 65 73 0a 2a 2a  CK      | Yes.**
16d60 20 20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 20     SHARED_LOCK  
16d70 20 2d 3e 20 52 45 53 45 52 56 45 44 5f 4c 4f 43   -> RESERVED_LOC
16d80 4b 20 20 20 20 7c 20 4e 6f 0a 2a 2a 20 20 20 53  K    | No.**   S
16d90 48 41 52 45 44 5f 4c 4f 43 4b 20 20 20 2d 3e 20  HARED_LOCK   -> 
16da0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 20  EXCLUSIVE_LOCK  
16db0 20 7c 20 4e 6f 0a 2a 2a 20 20 20 52 45 53 45 52   | No.**   RESER
16dc0 56 45 44 5f 4c 4f 43 4b 20 2d 3e 20 45 58 43 4c  VED_LOCK -> EXCL
16dd0 55 53 49 56 45 5f 4c 4f 43 4b 20 20 20 7c 20 59  USIVE_LOCK   | Y
16de0 65 73 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  es.**.** If the 
16df0 62 75 73 79 2d 68 61 6e 64 6c 65 72 20 63 61 6c  busy-handler cal
16e00 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 20 6e 6f  lback returns no
16e10 6e 2d 7a 65 72 6f 2c 20 74 68 65 20 6c 6f 63 6b  n-zero, the lock
16e20 20 69 73 20 0a 2a 2a 20 72 65 74 72 69 65 64 2e   is .** retried.
16e30 20 49 66 20 69 74 20 72 65 74 75 72 6e 73 20 7a   If it returns z
16e40 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 53 51  ero, then the SQ
16e50 4c 49 54 45 5f 42 55 53 59 20 65 72 72 6f 72 20  LITE_BUSY error 
16e60 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 74  is.** returned t
16e70 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 66 20  o the caller of 
16e80 74 68 65 20 70 61 67 65 72 20 41 50 49 20 66 75  the pager API fu
16e90 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
16ea0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
16eb0 75 73 79 68 61 6e 64 6c 65 72 28 0a 20 20 50 61  usyhandler(.  Pa
16ec0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20  ger *pPager,    
16ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ee0 20 20 20 2f 2a 20 50 61 67 65 72 20 6f 62 6a 65     /* Pager obje
16ef0 63 74 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 42  ct */.  int (*xB
16f00 75 73 79 48 61 6e 64 6c 65 72 29 28 76 6f 69 64  usyHandler)(void
16f10 20 2a 29 2c 20 20 20 20 20 20 20 20 20 2f 2a 20   *),         /* 
16f20 50 6f 69 6e 74 65 72 20 74 6f 20 62 75 73 79 2d  Pointer to busy-
16f30 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
16f40 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 42 75 73   */.  void *pBus
16f50 79 48 61 6e 64 6c 65 72 41 72 67 20 20 20 20 20  yHandlerArg     
16f60 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
16f70 67 75 6d 65 6e 74 20 74 6f 20 70 61 73 73 20 74  gument to pass t
16f80 6f 20 78 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  o xBusyHandler *
16f90 2f 0a 29 7b 20 20 0a 20 20 70 50 61 67 65 72 2d  /.){  .  pPager-
16fa0 3e 78 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >xBusyHandler = 
16fb0 78 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20  xBusyHandler;.  
16fc0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
16fd0 64 6c 65 72 41 72 67 20 3d 20 70 42 75 73 79 48  dlerArg = pBusyH
16fe0 61 6e 64 6c 65 72 41 72 67 3b 0a 7d 0a 0a 2f 2a  andlerArg;.}../*
16ff0 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e  .** Set the rein
17000 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68  itializer for th
17010 69 73 20 70 61 67 65 72 2e 20 49 66 20 6e 6f 74  is pager. If not
17020 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
17030 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
17040 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
17050 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
17060 20 69 6e 20 63 61 63 68 65 20 69 73 20 6d 6f 64   in cache is mod
17070 69 66 69 65 64 20 28 72 65 73 74 6f 72 65 64 29  ified (restored)
17080 0a 2a 2a 20 61 73 20 70 61 72 74 20 6f 66 20 61  .** as part of a
17090 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72 20   transaction or 
170a0 73 61 76 65 70 6f 69 6e 74 20 72 6f 6c 6c 62 61  savepoint rollba
170b0 63 6b 2e 20 54 68 65 20 63 61 6c 6c 62 61 63 6b  ck. The callback
170c0 20 67 69 76 65 73 20 0a 2a 2a 20 68 69 67 68 65   gives .** highe
170d0 72 2d 6c 65 76 65 6c 20 63 6f 64 65 20 61 6e 20  r-level code an 
170e0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
170f0 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
17100 20 73 65 63 74 69 6f 6e 20 74 6f 20 0a 2a 2a 20   section to .** 
17110 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
17120 65 73 74 6f 72 65 64 20 70 61 67 65 20 64 61 74  estored page dat
17130 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  a..*/.void sqlit
17140 65 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74  e3PagerSetReinit
17150 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
17160 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74  , void (*xReinit
17170 29 28 44 62 50 61 67 65 2a 29 29 7b 0a 20 20 70  )(DbPage*)){.  p
17180 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
17190 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
171a0 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
171b0 70 61 67 65 20 73 69 7a 65 20 75 73 65 64 20 62  page size used b
171c0 79 20 74 68 65 20 50 61 67 65 72 20 6f 62 6a 65  y the Pager obje
171d0 63 74 2e 20 54 68 65 20 6e 65 77 20 70 61 67 65  ct. The new page
171e0 20 73 69 7a 65 20 0a 2a 2a 20 69 73 20 70 61 73   size .** is pas
171f0 73 65 64 20 69 6e 20 2a 70 50 61 67 65 53 69 7a  sed in *pPageSiz
17200 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
17210 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
17220 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65 6e  error state when
17230 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
17240 73 20 63 61 6c 6c 65 64 2c 20 69 74 0a 2a 2a 20  s called, it.** 
17250 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 54 68 65 20  is a no-op. The 
17260 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
17270 73 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  s the error stat
17280 65 20 65 72 72 6f 72 20 63 6f 64 65 20 28 69 2e  e error code (i.
17290 65 2e 20 0a 2a 2a 20 6f 6e 65 20 6f 66 20 53 51  e. .** one of SQ
172a0 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
172b0 54 45 5f 43 4f 52 52 55 50 54 20 6f 72 20 53 51  TE_CORRUPT or SQ
172c0 4c 49 54 45 5f 46 55 4c 4c 29 2e 0a 2a 2a 0a 2a  LITE_FULL)..**.*
172d0 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20  * Otherwise, if 
172e0 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
172f0 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
17300 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 6e 65 77  *.**   * the new
17310 20 70 61 67 65 20 73 69 7a 65 20 28 76 61 6c 75   page size (valu
17320 65 20 6f 66 20 2a 70 50 61 67 65 53 69 7a 65 29  e of *pPageSize)
17330 20 69 73 20 76 61 6c 69 64 20 28 61 20 70 6f 77   is valid (a pow
17340 65 72 20 0a 2a 2a 20 20 20 20 20 6f 66 20 74 77  er .**     of tw
17350 6f 20 62 65 74 77 65 65 6e 20 35 31 32 20 61 6e  o between 512 an
17360 64 20 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  d SQLITE_MAX_PAG
17370 45 5f 53 49 5a 45 2c 20 69 6e 63 6c 75 73 69 76  E_SIZE, inclusiv
17380 65 29 2c 20 61 6e 64 0a 2a 2a 0a 2a 2a 20 20 20  e), and.**.**   
17390 2a 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6f  * there are no o
173a0 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 20  utstanding page 
173b0 72 65 66 65 72 65 6e 63 65 73 2c 20 61 6e 64 0a  references, and.
173c0 2a 2a 0a 2a 2a 20 20 20 2a 20 74 68 65 20 64 61  **.**   * the da
173d0 74 61 62 61 73 65 20 69 73 20 65 69 74 68 65 72  tabase is either
173e0 20 6e 6f 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   not an in-memor
173f0 79 20 64 61 74 61 62 61 73 65 20 6f 72 20 69 74  y database or it
17400 20 69 73 0a 2a 2a 20 20 20 20 20 61 6e 20 69 6e   is.**     an in
17410 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
17420 20 74 68 61 74 20 63 75 72 72 65 6e 74 6c 79 20   that currently 
17430 63 6f 6e 73 69 73 74 73 20 6f 66 20 7a 65 72 6f  consists of zero
17440 20 70 61 67 65 73 2e 0a 2a 2a 0a 2a 2a 20 74 68   pages..**.** th
17450 65 6e 20 74 68 65 20 70 61 67 65 72 20 6f 62 6a  en the pager obj
17460 65 63 74 20 70 61 67 65 20 73 69 7a 65 20 69 73  ect page size is
17470 20 73 65 74 20 74 6f 20 2a 70 50 61 67 65 53 69   set to *pPageSi
17480 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ze..**.** If the
17490 20 70 61 67 65 20 73 69 7a 65 20 69 73 20 63 68   page size is ch
174a0 61 6e 67 65 64 2c 20 74 68 65 6e 20 74 68 69 73  anged, then this
174b0 20 66 75 6e 63 74 69 6f 6e 20 75 73 65 73 20 73   function uses s
174c0 71 6c 69 74 65 33 50 61 67 65 72 4d 61 6c 6c 6f  qlite3PagerMallo
174d0 63 28 29 20 0a 2a 2a 20 74 6f 20 6f 62 74 61 69  c() .** to obtai
174e0 6e 20 61 20 6e 65 77 20 50 61 67 65 72 2e 70 54  n a new Pager.pT
174f0 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e 20  mpSpace buffer. 
17500 49 66 20 74 68 69 73 20 61 6c 6c 6f 63 61 74 69  If this allocati
17510 6f 6e 20 61 74 74 65 6d 70 74 20 0a 2a 2a 20 66  on attempt .** f
17520 61 69 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d  ails, SQLITE_NOM
17530 45 4d 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  EM is returned a
17540 6e 64 20 74 68 65 20 70 61 67 65 20 73 69 7a 65  nd the page size
17550 20 72 65 6d 61 69 6e 73 20 75 6e 63 68 61 6e 67   remains unchang
17560 65 64 2e 20 0a 2a 2a 20 49 6e 20 61 6c 6c 20 6f  ed. .** In all o
17570 74 68 65 72 20 63 61 73 65 73 2c 20 53 51 4c 49  ther cases, SQLI
17580 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
17590 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
175a0 70 61 67 65 20 73 69 7a 65 20 69 73 20 6e 6f 74  page size is not
175b0 20 63 68 61 6e 67 65 64 2c 20 65 69 74 68 65 72   changed, either
175c0 20 62 65 63 61 75 73 65 20 6f 6e 65 20 6f 66 20   because one of 
175d0 74 68 65 20 65 6e 75 6d 65 72 61 74 65 64 0a 2a  the enumerated.*
175e0 2a 20 63 6f 6e 64 69 74 69 6f 6e 73 20 61 62 6f  * conditions abo
175f0 76 65 20 69 73 20 6e 6f 74 20 74 72 75 65 2c 20  ve is not true, 
17600 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
17610 20 65 72 72 6f 72 20 73 74 61 74 65 20 77 68 65   error state whe
17620 6e 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  n this.** functi
17630 6f 6e 20 77 61 73 20 63 61 6c 6c 65 64 2c 20 6f  on was called, o
17640 72 20 62 65 63 61 75 73 65 20 74 68 65 20 6d 65  r because the me
17650 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20  mory allocation 
17660 61 74 74 65 6d 70 74 20 66 61 69 6c 65 64 2c 20  attempt failed, 
17670 0a 2a 2a 20 74 68 65 6e 20 2a 70 50 61 67 65 53  .** then *pPageS
17680 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
17690 65 20 6f 6c 64 2c 20 72 65 74 61 69 6e 65 64 20  e old, retained 
176a0 70 61 67 65 20 73 69 7a 65 20 62 65 66 6f 72 65  page size before
176b0 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
176c0 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
176d0 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
176e0 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70   *pPager, u16 *p
176f0 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74  PageSize){.  int
17700 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
17710 72 43 6f 64 65 3b 0a 20 20 69 66 28 20 72 63 3d  rCode;.  if( rc=
17720 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
17730 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d    u16 pageSize =
17740 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 20   *pPageSize;.   
17750 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
17760 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
17770 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
17780 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
17790 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 20  AGE_SIZE) );.   
177a0 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26 26   if( pageSize &&
177b0 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65   pageSize!=pPage
177c0 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20  r->pageSize .   
177d0 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 6d 65    && (pPager->me
177e0 6d 44 62 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  mDb==0 || pPager
177f0 2d 3e 64 62 53 69 7a 65 3d 3d 30 29 0a 20 20 20  ->dbSize==0).   
17800 20 20 26 26 20 73 71 6c 69 74 65 33 50 63 61 63    && sqlite3Pcac
17810 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
17820 72 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 0a  r->pPCache)==0 .
17830 20 20 20 20 29 7b 0a 20 20 20 20 20 20 63 68 61      ){.      cha
17840 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20  r *pNew = (char 
17850 2a 29 73 71 6c 69 74 65 33 50 61 67 65 4d 61 6c  *)sqlite3PageMal
17860 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
17870 20 20 20 20 20 69 66 28 20 21 70 4e 65 77 20 29       if( !pNew )
17880 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
17890 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
178a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
178b0 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50    pager_reset(pP
178c0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70  ager);.        p
178d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
178e0 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
178f0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 46      sqlite3PageF
17900 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
17910 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 20 20  Space);.        
17920 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
17930 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  e = pNew;.      
17940 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 53    sqlite3PcacheS
17950 65 74 50 61 67 65 53 69 7a 65 28 70 50 61 67 65  etPageSize(pPage
17960 72 2d 3e 70 50 43 61 63 68 65 2c 20 70 61 67 65  r->pPCache, page
17970 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Size);.      }. 
17980 20 20 20 7d 0a 20 20 20 20 2a 70 50 61 67 65 53     }.    *pPageS
17990 69 7a 65 20 3d 20 28 75 31 36 29 70 50 61 67 65  ize = (u16)pPage
179a0 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d  r->pageSize;.  }
179b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
179c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
179d0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
179e0 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
179f0 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
17a00 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
17a10 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
17a20 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
17a30 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
17a40 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
17a50 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
17a60 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
17a70 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
17a80 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
17a90 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
17aa0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
17ab0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
17ac0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
17ad0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
17ae0 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
17af0 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
17b00 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
17b10 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
17b20 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
17b30 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
17b40 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
17b50 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
17b60 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
17b70 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
17b80 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
17b90 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
17ba0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
17bb0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
17bc0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
17bd0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
17be0 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
17bf0 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
17c00 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
17c10 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
17c20 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
17c30 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
17c40 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
17c50 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
17c60 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
17c70 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
17c80 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
17c90 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
17ca0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
17cb0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
17cc0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
17cd0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
17ce0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
17cf0 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
17d00 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
17d10 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
17d20 20 30 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50   0);.  return pP
17d30 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a  ager->mxPgno;.}.
17d40 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
17d50 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74  wing set of rout
17d60 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74 6f  ines are used to
17d70 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d   disable the sim
17d80 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72  ulated.** I/O er
17d90 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20  ror mechanism.  
17da0 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61  These routines a
17db0 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64  re used to avoid
17dc0 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72   simulated.** er
17dd0 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77  rors in places w
17de0 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63  here we do not c
17df0 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73  are about errors
17e00 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d  ..**.** Unless -
17e10 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69  DSQLITE_TEST=1 i
17e20 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f  s used, these ro
17e30 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e  utines are all n
17e40 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e  o-ops.** and gen
17e50 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a  erate no code..*
17e60 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
17e70 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20  TEST.extern int 
17e80 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
17e90 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e  _pending;.extern
17ea0 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f   int sqlite3_io_
17eb0 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69  error_hit;.stati
17ec0 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b  c int saved_cnt;
17ed0 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69  .void disable_si
17ee0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
17ef0 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64  s(void){.  saved
17f00 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69  _cnt = sqlite3_i
17f10 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b  o_error_pending;
17f20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  .  sqlite3_io_er
17f30 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31  ror_pending = -1
17f40 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f  ;.}.void enable_
17f50 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
17f60 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c  ors(void){.  sql
17f70 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
17f80 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e  nding = saved_cn
17f90 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66  t;.}.#else.# def
17fa0 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ine disable_simu
17fb0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
17fc0 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c  ).# define enabl
17fd0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
17fe0 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a  rrors().#endif..
17ff0 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66  /*.** Read the f
18000 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f  irst N bytes fro
18010 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  m the beginning 
18020 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f  of the file into
18030 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20   memory.** that 
18040 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e  pDest points to.
18050 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 70   .**.** If the p
18060 61 67 65 72 20 77 61 73 20 6f 70 65 6e 65 64 20  ager was opened 
18070 6f 6e 20 61 20 74 72 61 6e 73 69 65 6e 74 20 66  on a transient f
18080 69 6c 65 20 28 7a 46 69 6c 65 6e 61 6d 65 3d 3d  ile (zFilename==
18090 22 22 29 2c 20 6f 72 0a 2a 2a 20 6f 70 65 6e 65  ""), or.** opene
180a0 64 20 6f 6e 20 61 20 66 69 6c 65 20 6c 65 73 73  d on a file less
180b0 20 74 68 61 6e 20 4e 20 62 79 74 65 73 20 69 6e   than N bytes in
180c0 20 73 69 7a 65 2c 20 74 68 65 20 6f 75 74 70 75   size, the outpu
180d0 74 20 62 75 66 66 65 72 20 69 73 0a 2a 2a 20 7a  t buffer is.** z
180e0 65 72 6f 65 64 20 61 6e 64 20 53 51 4c 49 54 45  eroed and SQLITE
180f0 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68  _OK returned. Th
18100 65 20 72 61 74 69 6f 6e 61 6c 65 20 66 6f 72 20  e rationale for 
18110 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
18120 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  s .** function i
18130 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 64  s used to read d
18140 61 74 61 62 61 73 65 20 68 65 61 64 65 72 73 2c  atabase headers,
18150 20 61 6e 64 20 61 20 6e 65 77 20 74 72 61 6e 73   and a new trans
18160 69 65 6e 74 20 6f 72 0a 2a 2a 20 7a 65 72 6f 20  ient or.** zero 
18170 73 69 7a 65 64 20 64 61 74 61 62 61 73 65 20 68  sized database h
18180 61 73 20 61 20 68 65 61 64 65 72 20 74 68 61 6e  as a header than
18190 20 63 6f 6e 73 69 73 74 73 20 65 6e 74 69 72 65   consists entire
181a0 6c 79 20 6f 66 20 7a 65 72 6f 65 73 2e 0a 2a 2a  ly of zeroes..**
181b0 0a 2a 2a 20 49 66 20 61 6e 79 20 49 4f 20 65 72  .** If any IO er
181c0 72 6f 72 20 61 70 61 72 74 20 66 72 6f 6d 20 53  ror apart from S
181d0 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
181e0 54 5f 52 45 41 44 20 69 73 20 65 6e 63 6f 75 6e  T_READ is encoun
181f0 74 65 72 65 64 2c 0a 2a 2a 20 74 68 65 20 65 72  tered,.** the er
18200 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
18210 72 6e 65 64 20 74 6f 20 74 68 65 20 63 61 6c 6c  rned to the call
18220 65 72 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  er and the conte
18230 6e 74 73 20 6f 66 20 74 68 65 0a 2a 2a 20 6f 75  nts of the.** ou
18240 74 70 75 74 20 62 75 66 66 65 72 20 75 6e 64 65  tput buffer unde
18250 66 69 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  fined..*/.int sq
18260 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
18270 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
18280 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
18290 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
182a0 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
182b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
182c0 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
182d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 69 73 4f  );.  assert( isO
182e0 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
182f0 7c 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  || pPager->tempF
18300 69 6c 65 20 29 3b 0a 20 20 69 66 28 20 69 73 4f  ile );.  if( isO
18310 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
18320 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28  ){.    IOTRACE((
18330 22 44 42 48 44 52 20 25 70 20 30 20 25 64 5c 6e  "DBHDR %p 0 %d\n
18340 22 2c 20 70 50 61 67 65 72 2c 20 4e 29 29 0a 20  ", pPager, N)). 
18350 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18360 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
18370 2c 20 70 44 65 73 74 2c 20 4e 2c 20 30 29 3b 0a  , pDest, N, 0);.
18380 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18390 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52  TE_IOERR_SHORT_R
183a0 45 41 44 20 29 7b 0a 20 20 20 20 20 20 72 63 20  EAD ){.      rc 
183b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
183c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
183d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rc;.}../*.** Ret
183e0 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  urn the total nu
183f0 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
18400 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
18410 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 0a 2a  le associated .*
18420 2a 20 77 69 74 68 20 70 50 61 67 65 72 2e 20 4e  * with pPager. N
18430 6f 72 6d 61 6c 6c 79 2c 20 74 68 69 73 20 69 73  ormally, this is
18440 20 63 61 6c 63 75 6c 61 74 65 64 20 61 73 20 28   calculated as (
18450 3c 64 62 20 66 69 6c 65 20 73 69 7a 65 3e 2f 3c  <db file size>/<
18460 70 61 67 65 2d 73 69 7a 65 3e 29 2e 0a 2a 2a 20  page-size>)..** 
18470 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 65 20  However, if the 
18480 66 69 6c 65 20 69 73 20 62 65 74 77 65 65 6e 20  file is between 
18490 31 20 61 6e 64 20 3c 70 61 67 65 2d 73 69 7a 65  1 and <page-size
184a0 3e 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65 2c  > bytes in size,
184b0 20 74 68 65 6e 20 0a 2a 2a 20 74 68 69 73 20 69   then .** this i
184c0 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 31  s considered a 1
184d0 20 70 61 67 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a   page file..**.*
184e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
184f0 73 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74 65  s in error state
18500 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
18510 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ion is called, t
18520 68 65 6e 20 74 68 65 0a 2a 2a 20 65 72 72 6f 72  hen the.** error
18530 20 73 74 61 74 65 20 65 72 72 6f 72 20 63 6f 64   state error cod
18540 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
18550 64 20 2a 70 6e 50 61 67 65 20 6c 65 66 74 20 75  d *pnPage left u
18560 6e 63 68 61 6e 67 65 64 2e 20 4f 72 2c 0a 2a 2a  nchanged. Or,.**
18570 20 69 66 20 74 68 65 20 66 69 6c 65 20 73 79 73   if the file sys
18580 74 65 6d 20 68 61 73 20 74 6f 20 62 65 20 71 75  tem has to be qu
18590 65 72 69 65 64 20 66 6f 72 20 74 68 65 20 73 69  eried for the si
185a0 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  ze of the file a
185b0 6e 64 0a 2a 2a 20 74 68 65 20 71 75 65 72 79 20  nd.** the query 
185c0 61 74 74 65 6d 70 74 20 72 65 74 75 72 6e 73 20  attempt returns 
185d0 61 6e 20 49 4f 20 65 72 72 6f 72 2c 20 74 68 65  an IO error, the
185e0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
185f0 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 61 6e  s returned.** an
18600 64 20 2a 70 6e 50 61 67 65 20 69 73 20 6c 65 66  d *pnPage is lef
18610 74 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2a 0a  t unchanged..**.
18620 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66  ** Otherwise, if
18630 20 65 76 65 72 79 74 68 69 6e 67 20 69 73 20 73   everything is s
18640 75 63 63 65 73 73 66 75 6c 2c 20 74 68 65 6e 20  uccessful, then 
18650 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18660 75 72 6e 65 64 0a 2a 2a 20 61 6e 64 20 2a 70 6e  urned.** and *pn
18670 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20 74  Page is set to t
18680 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
18690 65 73 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  es in the databa
186a0 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
186b0 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
186c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
186d0 69 6e 74 20 2a 70 6e 50 61 67 65 29 7b 0a 20 20  int *pnPage){.  
186e0 50 67 6e 6f 20 6e 50 61 67 65 3b 20 20 20 20 20  Pgno nPage;     
186f0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c            /* Val
18700 75 65 20 74 6f 20 72 65 74 75 72 6e 20 76 69 61  ue to return via
18710 20 2a 70 6e 50 61 67 65 20 2a 2f 0a 0a 20 20 2f   *pnPage */..  /
18720 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
18730 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  s already in the
18740 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 72 65   error state, re
18750 74 75 72 6e 20 74 68 65 20 65 72 72 6f 72 20 63  turn the error c
18760 6f 64 65 2e 20 2a 2f 0a 20 20 69 66 28 20 70 50  ode. */.  if( pP
18770 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
18780 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
18790 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
187a0 0a 0a 20 20 2f 2a 20 44 65 74 65 72 6d 69 6e 65  ..  /* Determine
187b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
187c0 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
187d0 2e 20 53 74 6f 72 65 20 74 68 69 73 20 69 6e 20  . Store this in 
187e0 6e 50 61 67 65 2e 20 2a 2f 0a 20 20 69 66 28 20  nPage. */.  if( 
187f0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
18800 6c 69 64 20 29 7b 0a 20 20 20 20 6e 50 61 67 65  lid ){.    nPage
18810 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
18820 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
18830 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
18840 20 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72          /* Error
18850 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46   returned by OsF
18860 69 6c 65 53 69 7a 65 28 29 20 2a 2f 0a 20 20 20  ileSize() */.   
18870 20 69 36 34 20 6e 20 3d 20 30 3b 20 20 20 20 20   i64 n = 0;     
18880 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
18890 20 73 69 7a 65 20 69 6e 20 62 79 74 65 73 20 72   size in bytes r
188a0 65 74 75 72 6e 65 64 20 62 79 20 4f 73 46 69 6c  eturned by OsFil
188b0 65 53 69 7a 65 28 29 20 2a 2f 0a 0a 20 20 20 20  eSize() */..    
188c0 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
188d0 50 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 70 50  Pager->fd) || pP
188e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
188f0 3b 0a 20 20 20 20 69 66 28 20 69 73 4f 70 65 6e  ;.    if( isOpen
18900 28 70 50 61 67 65 72 2d 3e 66 64 29 20 26 26 20  (pPager->fd) && 
18910 28 30 20 21 3d 20 28 72 63 20 3d 20 73 71 6c 69  (0 != (rc = sqli
18920 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50  te3OsFileSize(pP
18930 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 29 20  ager->fd, &n))) 
18940 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  ){.      pager_e
18950 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
18960 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  ;.      return r
18970 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  c;.    }.    if(
18980 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65 72   n>0 && n<pPager
18990 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
189a0 20 20 20 20 6e 50 61 67 65 20 3d 20 31 3b 0a 20      nPage = 1;. 
189b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
189c0 6e 50 61 67 65 20 3d 20 28 50 67 6e 6f 29 28 6e  nPage = (Pgno)(n
189d0 20 2f 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   / pPager->pageS
189e0 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
189f0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
18a00 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
18a10 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
18a20 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
18a30 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
18a40 62 46 69 6c 65 53 69 7a 65 20 3d 20 6e 50 61 67  bFileSize = nPag
18a50 65 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e;.      pPager-
18a60 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 31  >dbSizeValid = 1
18a70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
18a80 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
18a90 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
18aa0 20 69 6e 20 74 68 65 20 66 69 6c 65 20 69 73 20   in the file is 
18ab0 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
18ac0 20 0a 20 20 2a 2a 20 63 6f 6e 66 69 67 75 72 65   .  ** configure
18ad0 64 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 72 20  d maximum pager 
18ae0 6e 75 6d 62 65 72 2c 20 69 6e 63 72 65 61 73 65  number, increase
18af0 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 6c 69 6d   the allowed lim
18b00 69 74 20 73 6f 0a 20 20 2a 2a 20 74 68 61 74 20  it so.  ** that 
18b10 74 68 65 20 66 69 6c 65 20 63 61 6e 20 62 65 20  the file can be 
18b20 72 65 61 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  read..  */.  if(
18b30 20 6e 50 61 67 65 3e 70 50 61 67 65 72 2d 3e 6d   nPage>pPager->m
18b40 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
18b50 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 28 50  ger->mxPgno = (P
18b60 67 6e 6f 29 6e 50 61 67 65 3b 0a 20 20 7d 0a 0a  gno)nPage;.  }..
18b70 20 20 2f 2a 20 53 65 74 20 74 68 65 20 6f 75 74    /* Set the out
18b80 70 75 74 20 76 61 72 69 61 62 6c 65 20 61 6e 64  put variable and
18b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18ba0 4b 20 2a 2f 0a 20 20 69 66 28 20 70 6e 50 61 67  K */.  if( pnPag
18bb0 65 20 29 7b 0a 20 20 20 20 2a 70 6e 50 61 67 65  e ){.    *pnPage
18bc0 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20   = nPage;.  }.  
18bd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
18be0 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ;.}.../*.** Try 
18bf0 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b  to obtain a lock
18c00 20 6f 66 20 74 79 70 65 20 6c 6f 63 6b 74 79 70   of type locktyp
18c10 65 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  e on the databas
18c20 65 20 66 69 6c 65 2e 20 49 66 0a 2a 2a 20 61 20  e file. If.** a 
18c30 73 69 6d 69 6c 61 72 20 6f 72 20 67 72 65 61 74  similar or great
18c40 65 72 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61  er lock is alrea
18c50 64 79 20 68 65 6c 64 2c 20 74 68 69 73 20 66 75  dy held, this fu
18c60 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f  nction is a no-o
18c70 70 0a 2a 2a 20 28 72 65 74 75 72 6e 69 6e 67 20  p.** (returning 
18c80 53 51 4c 49 54 45 5f 4f 4b 20 69 6d 6d 65 64 69  SQLITE_OK immedi
18c90 61 74 65 6c 79 29 2e 0a 2a 2a 0a 2a 2a 20 4f 74  ately)..**.** Ot
18ca0 68 65 72 77 69 73 65 2c 20 61 74 74 65 6d 70 74  herwise, attempt
18cb0 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65 20 6c   to obtain the l
18cc0 6f 63 6b 20 75 73 69 6e 67 20 73 71 6c 69 74 65  ock using sqlite
18cd0 33 4f 73 4c 6f 63 6b 28 29 2e 20 49 6e 76 6f 6b  3OsLock(). Invok
18ce0 65 20 0a 2a 2a 20 74 68 65 20 62 75 73 79 20 63  e .** the busy c
18cf0 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
18d00 6f 63 6b 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ock is currently
18d10 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
18d20 52 65 70 65 61 74 20 0a 2a 2a 20 75 6e 74 69 6c  Repeat .** until
18d30 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
18d40 63 6b 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ck returns false
18d50 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 61 74   or until the at
18d60 74 65 6d 70 74 20 74 6f 20 0a 2a 2a 20 6f 62 74  tempt to .** obt
18d70 61 69 6e 20 74 68 65 20 6c 6f 63 6b 20 73 75 63  ain the lock suc
18d80 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  ceeds..**.** Ret
18d90 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e  urn SQLITE_OK on
18da0 20 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20   success and an 
18db0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65  error code if we
18dc0 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a   cannot obtain.*
18dd0 2a 20 74 68 65 20 6c 6f 63 6b 2e 20 49 66 20 74  * the lock. If t
18de0 68 65 20 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69  he lock is obtai
18df0 6e 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ned successfully
18e00 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72 2e  , set the Pager.
18e10 73 74 61 74 65 20 0a 2a 2a 20 76 61 72 69 61 62  state .** variab
18e20 6c 65 20 74 6f 20 6c 6f 63 6b 74 79 70 65 20 62  le to locktype b
18e30 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e  efore returning.
18e40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
18e50 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
18e60 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
18e70 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
18e80 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
18e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ea0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
18eb0 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 2f 2a 20 54   code */..  /* T
18ec0 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75 65  he OS lock value
18ed0 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73 61  s must be the sa
18ee0 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72 20  me as the Pager 
18ef0 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a 20  lock values */. 
18f00 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
18f10 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
18f20 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
18f30 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
18f40 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
18f50 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
18f60 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
18f70 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a 20  USIVE_LOCK );.. 
18f80 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
18f90 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e 6c  is currently unl
18fa0 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20 73  ocked then the s
18fb0 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b 6e  ize must be unkn
18fc0 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  own */.  assert(
18fd0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
18fe0 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c 20  PAGER_SHARED || 
18ff0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56 61  pPager->dbSizeVa
19000 6c 69 64 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  lid==0 );..  /* 
19010 43 68 65 63 6b 20 74 68 61 74 20 74 68 69 73 20  Check that this 
19020 69 73 20 65 69 74 68 65 72 20 61 20 6e 6f 2d 6f  is either a no-o
19030 70 20 28 62 65 63 61 75 73 65 20 74 68 65 20 72  p (because the r
19040 65 71 75 65 73 74 65 64 20 6c 6f 63 6b 20 69 73  equested lock is
19050 20 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 68   .  ** already h
19060 65 6c 64 2c 20 6f 72 20 6f 6e 65 20 6f 66 20 74  eld, or one of t
19070 68 65 20 74 72 61 6e 73 69 73 74 69 6f 6e 73 20  he transistions 
19080 74 68 61 74 20 74 68 65 20 62 75 73 79 2d 68 61  that the busy-ha
19090 6e 64 6c 65 72 0a 20 20 2a 2a 20 6d 61 79 20 62  ndler.  ** may b
190a0 65 20 69 6e 76 6f 6b 65 64 20 64 75 72 69 6e 67  e invoked during
190b0 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  , according to t
190c0 68 65 20 63 6f 6d 6d 65 6e 74 20 61 62 6f 76 65  he comment above
190d0 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67  .  ** sqlite3Pag
190e0 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
190f0 28 29 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ()..  */.  asser
19100 74 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61 74  t( (pPager->stat
19110 65 3e 3d 6c 6f 63 6b 74 79 70 65 29 0a 20 20 20  e>=locktype).   
19120 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e      || (pPager->
19130 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
19140 4f 43 4b 20 26 26 20 6c 6f 63 6b 74 79 70 65 3d  OCK && locktype=
19150 3d 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a 20  =PAGER_SHARED). 
19160 20 20 20 20 20 20 7c 7c 20 28 70 50 61 67 65 72        || (pPager
19170 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
19180 45 53 45 52 56 45 44 20 26 26 20 6c 6f 63 6b 74  ESERVED && lockt
19190 79 70 65 3d 3d 50 41 47 45 52 5f 45 58 43 4c 55  ype==PAGER_EXCLU
191a0 53 49 56 45 29 0a 20 20 29 3b 0a 0a 20 20 69 66  SIVE).  );..  if
191b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
191c0 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20  =locktype ){.   
191d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
191e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f  .  }else{.    do
191f0 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
19200 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
19210 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
19220 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
19230 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
19240 26 20 70 50 61 67 65 72 2d 3e 78 42 75 73 79 48  & pPager->xBusyH
19250 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
19260 42 75 73 79 48 61 6e 64 6c 65 72 41 72 67 29 20  BusyHandlerArg) 
19270 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
19280 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
19290 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
192a0 3d 20 28 75 38 29 6c 6f 63 6b 74 79 70 65 3b 0a  = (u8)locktype;.
192b0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
192c0 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
192d0 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
192e0 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
192f0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
19300 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 69  * Truncate the i
19310 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
19320 65 20 66 69 6c 65 20 69 6d 61 67 65 20 74 6f 20  e file image to 
19330 6e 50 61 67 65 20 70 61 67 65 73 2e 20 54 68 69  nPage pages. Thi
19340 73 20 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 64  s .** function d
19350 6f 65 73 20 6e 6f 74 20 61 63 74 75 61 6c 6c 79  oes not actually
19360 20 6d 6f 64 69 66 79 20 74 68 65 20 64 61 74 61   modify the data
19370 62 61 73 65 20 66 69 6c 65 20 6f 6e 20 64 69 73  base file on dis
19380 6b 2e 20 49 74 20 0a 2a 2a 20 6a 75 73 74 20 73  k. It .** just s
19390 65 74 73 20 74 68 65 20 69 6e 74 65 72 6e 61 6c  ets the internal
193a0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61   state of the pa
193b0 67 65 72 20 6f 62 6a 65 63 74 20 73 6f 20 74 68  ger object so th
193c0 61 74 20 74 68 65 20 0a 2a 2a 20 74 72 75 6e 63  at the .** trunc
193d0 61 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 64 6f  ation will be do
193e0 6e 65 20 77 68 65 6e 20 74 68 65 20 63 75 72 72  ne when the curr
193f0 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
19400 69 73 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2f  is committed..*/
19410 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
19420 65 72 54 72 75 6e 63 61 74 65 49 6d 61 67 65 28  erTruncateImage(
19430 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
19440 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20 61 73  gno nPage){.  as
19450 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62  sert( pPager->db
19460 53 69 7a 65 56 61 6c 69 64 20 29 3b 0a 20 20 61  SizeValid );.  a
19470 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
19480 62 53 69 7a 65 3e 3d 6e 50 61 67 65 20 29 3b 0a  bSize>=nPage );.
19490 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
194a0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
194b0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 70 50 61  ESERVED );.  pPa
194c0 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
194d0 61 67 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68  age;.}../*.** Sh
194e0 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20  utdown the page 
194f0 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c  cache.  Free all
19500 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73   memory and clos
19510 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a  e all files..**.
19520 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  ** If a transact
19530 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72  ion was in progr
19540 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ess when this ro
19550 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
19560 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63   that.** transac
19570 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62  tion is rolled b
19580 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61  ack.  All outsta
19590 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20  nding pages are 
195a0 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61  invalidated.** a
195b0 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20  nd their memory 
195c0 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61  is freed.  Any a
195d0 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20  ttempt to use a 
195e0 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a  page associated.
195f0 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67  ** with this pag
19600 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68  e cache after th
19610 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  is function retu
19620 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a  rns will likely.
19630 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ** result in a c
19640 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54  oredump..**.** T
19650 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77  his function alw
19660 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66  ays succeeds. If
19670 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69   a transaction i
19680 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65  s active an atte
19690 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74  mpt.** is made t
196a0 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20  o roll it back. 
196b0 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  If an error occu
196c0 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f  rs during the ro
196d0 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74  llback .** a hot
196e0 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20   journal may be 
196f0 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65  left in the file
19700 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72  system but no er
19710 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a  ror is returned.
19720 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72  ** to the caller
19730 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
19740 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72  PagerClose(Pager
19750 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 64 69 73   *pPager){.  dis
19760 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69  able_simulated_i
19770 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71  o_errors();.  sq
19780 6c 69 74 65 33 42 65 67 69 6e 42 65 6e 69 67 6e  lite3BeginBenign
19790 4d 61 6c 6c 6f 63 28 29 3b 0a 20 20 70 50 61 67  Malloc();.  pPag
197a0 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
197b0 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
197c0 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  siveMode = 0;.  
197d0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
197e0 65 72 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  er);.  if( MEMDB
197f0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   ){.    pager_un
19800 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
19810 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65  }else{.    /* Se
19820 74 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 48  t Pager.journalH
19830 64 72 20 74 6f 20 2d 31 20 66 6f 72 20 74 68 65  dr to -1 for the
19840 20 62 65 6e 65 66 69 74 20 6f 66 20 74 68 65 20   benefit of the 
19850 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
19860 20 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 68   .    ** call wh
19870 69 63 68 20 6d 61 79 20 62 65 20 6d 61 64 65 20  ich may be made 
19880 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
19890 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61  rUnlockAndRollba
198a0 63 6b 28 29 2e 20 49 66 20 69 74 0a 20 20 20 20  ck(). If it.    
198b0 2a 2a 20 69 73 20 6e 6f 74 20 2d 31 2c 20 74 68  ** is not -1, th
198c0 65 6e 20 74 68 65 20 75 6e 73 79 6e 63 65 64 20  en the unsynced 
198d0 70 6f 72 74 69 6f 6e 20 6f 66 20 61 6e 20 6f 70  portion of an op
198e0 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
198f0 6d 61 79 0a 20 20 20 20 2a 2a 20 62 65 20 70 6c  may.    ** be pl
19900 61 79 65 64 20 62 61 63 6b 20 69 6e 74 6f 20 74  ayed back into t
19910 68 65 20 64 61 74 61 62 61 73 65 2e 20 49 66 20  he database. If 
19920 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
19930 6f 63 63 75 72 73 20 77 68 69 6c 65 0a 20 20 20  occurs while.   
19940 20 2a 2a 20 74 68 69 73 20 69 73 20 68 61 70 70   ** this is happ
19950 65 6e 69 6e 67 2c 20 74 68 65 20 64 61 74 61 62  ening, the datab
19960 61 73 65 20 6d 61 79 20 62 65 63 6f 6d 65 20 63  ase may become c
19970 6f 72 72 75 70 74 2e 0a 20 20 20 20 2a 2f 0a 20  orrupt..    */. 
19980 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
19990 61 6c 48 64 72 20 3d 20 2d 31 3b 0a 20 20 20 20  alHdr = -1;.    
199a0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
199b0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
199c0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 45 6e 64    }.  sqlite3End
199d0 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b 0a  BenignMalloc();.
199e0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
199f0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
19a00 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22 43    PAGERTRACE(("C
19a10 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
19a20 52 49 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20  RID(pPager)));. 
19a30 20 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45   IOTRACE(("CLOSE
19a40 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
19a50 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
19a60 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
19a70 20 73 71 6c 69 74 65 33 50 61 67 65 46 72 65 65   sqlite3PageFree
19a80 28 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61  (pPager->pTmpSpa
19a90 63 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 63  ce);.  sqlite3Pc
19aa0 61 63 68 65 43 6c 6f 73 65 28 70 50 61 67 65 72  acheClose(pPager
19ab0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 61  ->pPCache);..  a
19ac0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
19ad0 61 53 61 76 65 70 6f 69 6e 74 20 26 26 20 21 70  aSavepoint && !p
19ae0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
19af0 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 21  l );.  assert( !
19b00 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a  isOpen(pPager->j
19b10 66 64 29 20 26 26 20 21 69 73 4f 70 65 6e 28 70  fd) && !isOpen(p
19b20 50 61 67 65 72 2d 3e 73 6a 66 64 29 20 29 3b 0a  Pager->sjfd) );.
19b30 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
19b40 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
19b50 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19b60 23 69 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45  #if !defined(NDE
19b70 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  BUG) || defined(
19b80 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a  SQLITE_TEST)./*.
19b90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70 61  ** Return the pa
19ba0 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 61  ge number for pa
19bb0 67 65 20 70 50 67 2e 0a 2a 2f 0a 50 67 6e 6f 20  ge pPg..*/.Pgno 
19bc0 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
19bd0 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
19be0 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  Pg){.  return pP
19bf0 67 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69  g->pgno;.}.#endi
19c00 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
19c10 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
19c20 20 63 6f 75 6e 74 20 66 6f 72 20 70 61 67 65 20   count for page 
19c30 70 50 67 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pPg..*/.void sql
19c40 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62 50  ite3PagerRef(DbP
19c50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c  age *pPg){.  sql
19c60 69 74 65 33 50 63 61 63 68 65 52 65 66 28 70 50  ite3PcacheRef(pP
19c70 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  g);.}../*.** Syn
19c80 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 49  c the journal. I
19c90 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 6d  n other words, m
19ca0 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68 65  ake sure all the
19cb0 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76 65   pages that have
19cc0 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65 6e  .** been written
19cd0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
19ce0 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72 65  have actually re
19cf0 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61 63  ached the surfac
19d00 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73 6b  e of the.** disk
19d10 20 61 6e 64 20 63 61 6e 20 62 65 20 72 65 73 74   and can be rest
19d20 6f 72 65 64 20 69 6e 20 74 68 65 20 65 76 65 6e  ored in the even
19d30 74 20 6f 66 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  t of a hot-journ
19d40 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  al rollback..**.
19d50 2a 2a 20 49 66 20 74 68 65 20 50 61 67 65 72 2e  ** If the Pager.
19d60 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
19d70 20 6e 6f 74 20 73 65 74 2c 20 74 68 65 6e 20 74   not set, then t
19d80 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
19d90 61 0a 2a 2a 20 6e 6f 2d 6f 70 2e 20 4f 74 68 65  a.** no-op. Othe
19da0 72 77 69 73 65 2c 20 74 68 65 20 61 63 74 69 6f  rwise, the actio
19db0 6e 73 20 72 65 71 75 69 72 65 64 20 64 65 70 65  ns required depe
19dc0 6e 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nd on the journa
19dd0 6c 2d 6d 6f 64 65 0a 2a 2a 20 61 6e 64 20 74 68  l-mode.** and th
19de0 65 20 64 65 76 69 63 65 20 63 68 61 72 61 63 74  e device charact
19df0 65 72 69 73 74 69 63 73 20 6f 66 20 74 68 65 20  eristics of the 
19e00 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c  the file-system,
19e10 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a   as follows:.**.
19e20 2a 2a 20 20 20 2a 20 49 66 20 74 68 65 20 6a 6f  **   * If the jo
19e30 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 61 6e  urnal file is an
19e40 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f 75 72 6e   in-memory journ
19e50 61 6c 20 66 69 6c 65 2c 20 6e 6f 20 61 63 74 69  al file, no acti
19e60 6f 6e 20 6e 65 65 64 0a 2a 2a 20 20 20 20 20 62  on need.**     b
19e70 65 20 74 61 6b 65 6e 2e 0a 2a 2a 0a 2a 2a 20 20  e taken..**.**  
19e80 20 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66   * Otherwise, if
19e90 20 74 68 65 20 64 65 76 69 63 65 20 64 6f 65 73   the device does
19ea0 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 74 68 65   not support the
19eb0 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f   SAFE_APPEND pro
19ec0 70 65 72 74 79 2c 0a 2a 2a 20 20 20 20 20 74 68  perty,.**     th
19ed0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
19ee0 64 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65  d of the most re
19ef0 63 65 6e 74 6c 79 20 77 72 69 74 74 65 6e 20 6a  cently written j
19f00 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 0a 2a 2a  ournal header.**
19f10 20 20 20 20 20 69 73 20 75 70 64 61 74 65 64 20       is updated 
19f20 74 6f 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e  to contain the n
19f30 75 6d 62 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  umber of journal
19f40 20 72 65 63 6f 72 64 73 20 74 68 61 74 20 68 61   records that ha
19f50 76 65 0a 2a 2a 20 20 20 20 20 62 65 65 6e 20 77  ve.**     been w
19f60 72 69 74 74 65 6e 20 66 6f 6c 6c 6f 77 69 6e 67  ritten following
19f70 20 69 74 2e 20 49 66 20 74 68 65 20 70 61 67 65   it. If the page
19f80 72 20 69 73 20 6f 70 65 72 61 74 69 6e 67 20 69  r is operating i
19f90 6e 20 66 75 6c 6c 2d 73 79 6e 63 0a 2a 2a 20 20  n full-sync.**  
19fa0 20 20 20 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68     mode, then th
19fb0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
19fc0 73 20 73 79 6e 63 65 64 20 62 65 66 6f 72 65 20  s synced before 
19fd0 74 68 69 73 20 66 69 65 6c 64 20 69 73 20 75 70  this field is up
19fe0 64 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 2a  dated..**.**   *
19ff0 20 49 66 20 74 68 65 20 64 65 76 69 63 65 20 64   If the device d
1a000 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
1a010 74 68 65 20 53 45 51 55 45 4e 54 49 41 4c 20 70  the SEQUENTIAL p
1a020 72 6f 70 65 72 74 79 2c 20 74 68 65 6e 20 0a 2a  roperty, then .*
1a030 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69  *     journal fi
1a040 6c 65 20 69 73 20 73 79 6e 63 65 64 2e 0a 2a 2a  le is synced..**
1a050 0a 2a 2a 20 4f 72 2c 20 69 6e 20 70 73 65 75 64  .** Or, in pseud
1a060 6f 2d 63 6f 64 65 3a 0a 2a 2a 0a 2a 2a 20 20 20  o-code:.**.**   
1a070 69 66 28 20 4e 4f 54 20 3c 69 6e 2d 6d 65 6d 6f  if( NOT <in-memo
1a080 72 79 20 6a 6f 75 72 6e 61 6c 3e 20 29 7b 0a 2a  ry journal> ){.*
1a090 2a 20 20 20 20 20 69 66 28 20 4e 4f 54 20 53 41  *     if( NOT SA
1a0a0 46 45 5f 41 50 50 45 4e 44 20 29 7b 0a 2a 2a 20  FE_APPEND ){.** 
1a0b0 20 20 20 20 20 20 69 66 28 20 3c 66 75 6c 6c 2d        if( <full-
1a0c0 73 79 6e 63 20 6d 6f 64 65 3e 20 29 20 78 53 79  sync mode> ) xSy
1a0d0 6e 63 28 3c 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  nc(<journal file
1a0e0 3e 29 3b 0a 2a 2a 20 20 20 20 20 20 20 3c 75 70  >);.**       <up
1a0f0 64 61 74 65 20 6e 52 65 63 20 66 69 65 6c 64 3e  date nRec field>
1a100 0a 2a 2a 20 20 20 20 20 7d 20 0a 2a 2a 20 20 20  .**     } .**   
1a110 20 20 69 66 28 20 4e 4f 54 20 53 45 51 55 45 4e    if( NOT SEQUEN
1a120 54 49 41 4c 20 29 20 78 53 79 6e 63 28 3c 6a 6f  TIAL ) xSync(<jo
1a130 75 72 6e 61 6c 20 66 69 6c 65 3e 29 3b 0a 2a 2a  urnal file>);.**
1a140 20 20 20 7d 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50     }.**.** The P
1a150 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1a160 61 67 20 69 73 20 6e 65 76 65 72 20 62 65 20 73  ag is never be s
1a170 65 74 20 66 6f 72 20 74 65 6d 70 6f 72 61 72 79  et for temporary
1a180 20 66 69 6c 65 73 2c 20 6f 72 20 61 6e 79 0a 2a   files, or any.*
1a190 2a 20 66 69 6c 65 20 6f 70 65 72 61 74 69 6e 67  * file operating
1a1a0 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
1a1b0 20 28 50 61 67 65 72 2e 6e 6f 53 79 6e 63 20 73   (Pager.noSync s
1a1c0 65 74 20 74 6f 20 6e 6f 6e 2d 7a 65 72 6f 29 2e  et to non-zero).
1a1d0 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73  .**.** If succes
1a1e0 73 66 75 6c 2c 20 74 68 69 73 20 72 6f 75 74 69  sful, this routi
1a1f0 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 50 47  ne clears the PG
1a200 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 20 66 6c  HDR_NEED_SYNC fl
1a210 61 67 20 6f 66 20 65 76 65 72 79 20 0a 2a 2a 20  ag of every .** 
1a220 70 61 67 65 20 63 75 72 72 65 6e 74 6c 79 20 68  page currently h
1a230 65 6c 64 20 69 6e 20 6d 65 6d 6f 72 79 20 62 65  eld in memory be
1a240 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 20 53  fore returning S
1a250 51 4c 49 54 45 5f 4f 4b 2e 20 49 66 20 61 6e 20  QLITE_OK. If an 
1a260 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 69 73 20 65  IO.** error is e
1a270 6e 63 6f 75 6e 74 65 72 65 64 2c 20 74 68 65 6e  ncountered, then
1a280 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
1a290 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 74  de is returned t
1a2a0 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f  o the caller..*/
1a2b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
1a2c0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
1a2d0 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50  Pager){.  if( pP
1a2e0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
1a2f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70  {.    assert( !p
1a300 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1a310 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
1a320 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
1a330 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1a340 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20 20 20 20  E_MEMORY ){.    
1a350 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
1a360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a370 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1a380 20 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 63   code */.      c
1a390 6f 6e 73 74 20 69 6e 74 20 69 44 63 20 3d 20 73  onst int iDc = s
1a3a0 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68  qlite3OsDeviceCh
1a3b0 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50  aracteristics(pP
1a3c0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
1a3d0 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28   assert( isOpen(
1a3e0 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a  pPager->jfd) );.
1a3f0 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 69  .      if( 0==(i
1a400 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  Dc&SQLITE_IOCAP_
1a410 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b 0a  SAFE_APPEND) ){.
1a420 20 20 20 20 20 20 20 20 2f 2a 20 56 61 72 69 61          /* Varia
1a430 62 6c 65 20 69 4e 52 65 63 4f 66 66 73 65 74 20  ble iNRecOffset 
1a440 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6f 66  is set to the of
1a450 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
1a460 6e 61 6c 20 66 69 6c 65 0a 20 20 20 20 20 20 20  nal file.       
1a470 20 2a 2a 20 6f 66 20 74 68 65 20 6e 52 65 63 20   ** of the nRec 
1a480 66 69 65 6c 64 20 6f 66 20 74 68 65 20 6d 6f 73  field of the mos
1a490 74 20 72 65 63 65 6e 74 6c 79 20 77 72 69 74 74  t recently writt
1a4a0 65 6e 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  en journal heade
1a4b0 72 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  r..        ** Th
1a4c0 69 73 20 66 69 65 6c 64 20 77 69 6c 6c 20 62 65  is field will be
1a4d0 20 75 70 64 61 74 65 64 20 66 6f 6c 6c 6f 77 69   updated followi
1a4e0 6e 67 20 74 68 65 20 78 53 79 6e 63 28 29 20 6f  ng the xSync() o
1a4f0 70 65 72 61 74 69 6f 6e 0a 20 20 20 20 20 20 20  peration.       
1a500 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e   ** on the journ
1a510 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  al file. */.    
1a520 20 20 20 20 69 36 34 20 69 4e 52 65 63 4f 66 66      i64 iNRecOff
1a530 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
1a540 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
1a550 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
1a560 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ;..        /* Th
1a570 69 73 20 62 6c 6f 63 6b 20 64 65 61 6c 73 20 77  is block deals w
1a580 69 74 68 20 61 6e 20 6f 62 73 63 75 72 65 20 70  ith an obscure p
1a590 72 6f 62 6c 65 6d 2e 20 49 66 20 74 68 65 20 6c  roblem. If the l
1a5a0 61 73 74 20 63 6f 6e 6e 65 63 74 69 6f 6e 0a 20  ast connection. 
1a5b0 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
1a5c0 72 6f 74 65 20 74 6f 20 74 68 69 73 20 64 61 74  rote to this dat
1a5d0 61 62 61 73 65 20 77 61 73 20 6f 70 65 72 61 74  abase was operat
1a5e0 69 6e 67 20 69 6e 20 70 65 72 73 69 73 74 65 6e  ing in persisten
1a5f0 74 2d 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  t-journal.      
1a600 20 20 2a 2a 20 6d 6f 64 65 2c 20 74 68 65 6e 20    ** mode, then 
1a610 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1a620 20 6d 61 79 20 61 74 20 74 68 69 73 20 70 6f 69   may at this poi
1a630 6e 74 20 61 63 74 75 61 6c 6c 79 20 62 65 20 6c  nt actually be l
1a640 61 72 67 65 72 0a 20 20 20 20 20 20 20 20 2a 2a  arger.        **
1a650 20 74 68 61 6e 20 50 61 67 65 72 2e 6a 6f 75 72   than Pager.jour
1a660 6e 61 6c 4f 66 66 20 62 79 74 65 73 2e 20 49 66  nalOff bytes. If
1a670 20 74 68 65 20 6e 65 78 74 20 74 68 69 6e 67 20   the next thing 
1a680 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  in the journal. 
1a690 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 20 68         ** file h
1a6a0 61 70 70 65 6e 73 20 74 6f 20 62 65 20 61 20 6a  appens to be a j
1a6b0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 28 77  ournal-header (w
1a6c0 72 69 74 74 65 6e 20 61 73 20 70 61 72 74 20 6f  ritten as part o
1a6d0 66 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  f the.        **
1a6e0 20 70 72 65 76 69 6f 75 73 20 63 6f 6e 6e 65 63   previous connec
1a6f0 74 69 6f 6e 73 20 74 72 61 6e 73 61 63 74 69 6f  tions transactio
1a700 6e 29 2c 20 61 6e 64 20 61 20 63 72 61 73 68 20  n), and a crash 
1a710 6f 72 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  or power-failure
1a720 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 63 63   .        ** occ
1a730 75 72 73 20 61 66 74 65 72 20 6e 52 65 63 20 69  urs after nRec i
1a740 73 20 75 70 64 61 74 65 64 20 62 75 74 20 62 65  s updated but be
1a750 66 6f 72 65 20 74 68 69 73 20 63 6f 6e 6e 65 63  fore this connec
1a760 74 69 6f 6e 20 77 72 69 74 65 73 20 0a 20 20 20  tion writes .   
1a770 20 20 20 20 20 2a 2a 20 61 6e 79 74 68 69 6e 67       ** anything
1a780 20 65 6c 73 65 20 74 6f 20 74 68 65 20 6a 6f 75   else to the jou
1a790 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 20 63 6f  rnal file (or co
1a7a0 6d 6d 69 74 73 2f 72 6f 6c 6c 73 20 62 61 63 6b  mmits/rolls back
1a7b0 20 69 74 73 20 0a 20 20 20 20 20 20 20 20 2a 2a   its .        **
1a7c0 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 74   transaction), t
1a7d0 68 65 6e 20 53 51 4c 69 74 65 20 6d 61 79 20 62  hen SQLite may b
1a7e0 65 63 6f 6d 65 20 63 6f 6e 66 75 73 65 64 20 77  ecome confused w
1a7f0 68 65 6e 20 64 6f 69 6e 67 20 74 68 65 20 0a 20  hen doing the . 
1a800 20 20 20 20 20 20 20 2a 2a 20 68 6f 74 2d 6a 6f         ** hot-jo
1a810 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 20 66  urnal rollback f
1a820 6f 6c 6c 6f 77 69 6e 67 20 72 65 63 6f 76 65 72  ollowing recover
1a830 79 2e 20 49 74 20 6d 61 79 20 72 6f 6c 6c 20 62  y. It may roll b
1a840 61 63 6b 20 61 6c 6c 0a 20 20 20 20 20 20 20 20  ack all.        
1a850 2a 2a 20 6f 66 20 74 68 69 73 20 63 6f 6e 6e 65  ** of this conne
1a860 63 74 69 6f 6e 73 20 64 61 74 61 2c 20 74 68 65  ctions data, the
1a870 6e 20 70 72 6f 63 65 65 64 20 74 6f 20 72 6f 6c  n proceed to rol
1a880 6c 69 6e 67 20 62 61 63 6b 20 74 68 65 20 6f 6c  ling back the ol
1a890 64 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  d,.        ** ou
1a8a0 74 2d 6f 66 2d 64 61 74 65 20 64 61 74 61 20 74  t-of-date data t
1a8b0 68 61 74 20 66 6f 6c 6c 6f 77 73 20 69 74 2e 20  hat follows it. 
1a8c0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
1a8d0 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ion..        **.
1a8e0 20 20 20 20 20 20 20 20 2a 2a 20 54 6f 20 77 6f          ** To wo
1a8f0 72 6b 20 61 72 6f 75 6e 64 20 74 68 69 73 2c 20  rk around this, 
1a900 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  if the journal f
1a910 69 6c 65 20 64 6f 65 73 20 61 70 70 65 61 72 20  ile does appear 
1a920 74 6f 20 63 6f 6e 74 61 69 6e 0a 20 20 20 20 20  to contain.     
1a930 20 20 20 2a 2a 20 61 20 76 61 6c 69 64 20 68 65     ** a valid he
1a940 61 64 65 72 20 66 6f 6c 6c 6f 77 69 6e 67 20 50  ader following P
1a950 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ager.journalOff,
1a960 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 30 78   then write a 0x
1a970 30 30 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 79  00.        ** by
1a980 74 65 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  te to the start 
1a990 6f 66 20 69 74 20 74 6f 20 70 72 65 76 65 6e 74  of it to prevent
1a9a0 20 69 74 20 66 72 6f 6d 20 62 65 69 6e 67 20 72   it from being r
1a9b0 65 63 6f 67 6e 69 7a 65 64 2e 0a 20 20 20 20 20  ecognized..     
1a9c0 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
1a9d0 20 56 61 72 69 61 62 6c 65 20 69 4e 65 78 74 48   Variable iNextH
1a9e0 64 72 4f 66 66 73 65 74 20 69 73 20 73 65 74 20  drOffset is set 
1a9f0 74 6f 20 74 68 65 20 6f 66 66 73 65 74 20 61 74  to the offset at
1aa00 20 77 68 69 63 68 20 74 68 69 73 0a 20 20 20 20   which this.    
1aa10 20 20 20 20 2a 2a 20 70 72 6f 62 6c 65 6d 61 74      ** problemat
1aa20 69 63 20 68 65 61 64 65 72 20 77 69 6c 6c 20 6f  ic header will o
1aa30 63 63 75 72 2c 20 69 66 20 69 74 20 65 78 69 73  ccur, if it exis
1aa40 74 73 2e 20 61 4d 61 67 69 63 20 69 73 20 75 73  ts. aMagic is us
1aa50 65 64 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ed .        ** a
1aa60 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 62 75  s a temporary bu
1aa70 66 66 65 72 20 74 6f 20 69 6e 73 70 65 63 74 20  ffer to inspect 
1aa80 74 68 65 20 66 69 72 73 74 20 63 6f 75 70 6c 65  the first couple
1aa90 20 6f 66 20 62 79 74 65 73 20 6f 66 0a 20 20 20   of bytes of.   
1aaa0 20 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 74 65       ** the pote
1aab0 6e 74 69 61 6c 20 6a 6f 75 72 6e 61 6c 20 68 65  ntial journal he
1aac0 61 64 65 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ader..        */
1aad0 0a 20 20 20 20 20 20 20 20 69 36 34 20 69 4e 65  .        i64 iNe
1aae0 78 74 48 64 72 4f 66 66 73 65 74 20 3d 20 6a 6f  xtHdrOffset = jo
1aaf0 75 72 6e 61 6c 48 64 72 4f 66 66 73 65 74 28 70  urnalHdrOffset(p
1ab00 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1ab10 75 38 20 61 4d 61 67 69 63 5b 38 5d 3b 0a 20 20  u8 aMagic[8];.  
1ab20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1ab30 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1ab40 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 38 2c  >jfd, aMagic, 8,
1ab50 20 69 4e 65 78 74 48 64 72 4f 66 66 73 65 74 29   iNextHdrOffset)
1ab60 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
1ab70 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 30  ==SQLITE_OK && 0
1ab80 3d 3d 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ==memcmp(aMagic,
1ab90 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
1aba0 38 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  8) ){.          
1abb0 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 38 20  static const u8 
1abc0 7a 65 72 6f 62 79 74 65 20 3d 20 30 3b 0a 20 20  zerobyte = 0;.  
1abd0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1abe0 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
1abf0 65 72 2d 3e 6a 66 64 2c 20 26 7a 65 72 6f 62 79  er->jfd, &zeroby
1ac00 74 65 2c 20 31 2c 20 69 4e 65 78 74 48 64 72 4f  te, 1, iNextHdrO
1ac10 66 66 73 65 74 29 3b 0a 20 20 20 20 20 20 20 20  ffset);.        
1ac20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  }.        if( rc
1ac30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1ac40 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1ac50 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1ac60 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
1ac70 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  c;.        }..  
1ac80 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
1ac90 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e  he nRec value in
1aca0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
1acb0 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66 20 69  ile header. If i
1acc0 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 75 6c  n.        ** ful
1acd0 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f  l-synchronous mo
1ace0 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  de, sync the jou
1acf0 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68 69 73  rnal first. This
1ad00 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a 20 20   ensures that.  
1ad10 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74        ** all dat
1ad20 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68 69 74  a has really hit
1ad30 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f 72 65   the disk before
1ad40 20 6e 52 65 63 20 69 73 20 75 70 64 61 74 65 64   nRec is updated
1ad50 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20 20 20   to mark.       
1ad60 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61 6e 64   ** it as a cand
1ad70 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61  idate for rollba
1ad80 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ck..        **. 
1ad90 20 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 69         ** This i
1ada0 73 20 6e 6f 74 20 72 65 71 75 69 72 65 64 20 69  s not required i
1adb0 66 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  f the persistent
1adc0 20 6d 65 64 69 61 20 73 75 70 70 6f 72 74 73 20   media supports 
1add0 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  the.        ** S
1ade0 41 46 45 5f 41 50 50 45 4e 44 20 70 72 6f 70 65  AFE_APPEND prope
1adf0 72 74 79 2e 20 42 65 63 61 75 73 65 20 69 6e 20  rty. Because in 
1ae00 74 68 69 73 20 63 61 73 65 20 69 74 20 69 73 20  this case it is 
1ae10 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 0a 20 20  not possible .  
1ae20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 67 61 72        ** for gar
1ae30 62 61 67 65 20 64 61 74 61 20 74 6f 20 62 65 20  bage data to be 
1ae40 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
1ae50 66 69 6c 65 2c 20 74 68 65 20 6e 52 65 63 20 66  file, the nRec f
1ae60 69 65 6c 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  ield.        ** 
1ae70 69 73 20 70 6f 70 75 6c 61 74 65 64 20 77 69 74  is populated wit
1ae80 68 20 30 78 46 46 46 46 46 46 46 46 20 77 68 65  h 0xFFFFFFFF whe
1ae90 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
1aea0 61 64 65 72 20 69 73 20 77 72 69 74 74 65 6e 0a  ader is written.
1aeb0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6e          ** and n
1aec0 65 76 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ever needs to be
1aed0 20 75 70 64 61 74 65 64 2e 0a 20 20 20 20 20 20   updated..      
1aee0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1aef0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
1af00 63 20 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c  c && 0==(iDc&SQL
1af10 49 54 45 5f 49 4f 43 41 50 5f 53 45 51 55 45 4e  ITE_IOCAP_SEQUEN
1af20 54 49 41 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  TIAL) ){.       
1af30 20 20 20 50 41 47 45 52 54 52 41 43 45 28 28 22     PAGERTRACE(("
1af40 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
1af50 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1af60 50 61 67 65 72 29 29 29 3b 0a 20 20 20 20 20 20  Pager)));.      
1af70 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a 53      IOTRACE(("JS
1af80 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  YNC %p\n", pPage
1af90 72 29 29 0a 20 20 20 20 20 20 20 20 20 20 72 63  r)).          rc
1afa0 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
1afb0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
1afc0 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73  ager->sync_flags
1afd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
1afe0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1b000 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 49 4f      }.        IO
1b010 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
1b020 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
1b030 65 72 2c 20 69 4e 52 65 63 4f 66 66 73 65 74 2c  er, iNRecOffset,
1b040 20 34 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63   4));.        rc
1b050 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
1b060 50 61 67 65 72 2d 3e 6a 66 64 2c 20 69 4e 52 65  Pager->jfd, iNRe
1b070 63 4f 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d  cOffset, pPager-
1b080 3e 6e 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20  >nRec);.        
1b090 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1b0a0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
1b0b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1b0c0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
1b0d0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
1b0e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47  ) ){.        PAG
1b0f0 45 52 54 52 41 43 45 28 28 22 53 59 4e 43 20 6a  ERTRACE(("SYNC j
1b100 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
1b110 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1b120 29 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  ));.        IOTR
1b130 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
1b140 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1b150 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b160 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  OsSync(pPager->j
1b170 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63  fd, pPager->sync
1b180 5f 66 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20  _flags| .       
1b190 20 20 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63     (pPager->sync
1b1a0 5f 66 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53  _flags==SQLITE_S
1b1b0 59 4e 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f  YNC_FULL?SQLITE_
1b1c0 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29  SYNC_DATAONLY:0)
1b1d0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
1b1e0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b1f0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
1b200 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  c;.      }.    }
1b210 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f 75  ..    /* The jou
1b220 72 6e 61 6c 20 66 69 6c 65 20 77 61 73 20 6a 75  rnal file was ju
1b230 73 74 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  st successfully 
1b240 73 79 6e 63 65 64 2e 20 53 65 74 20 50 61 67 65  synced. Set Page
1b250 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  r.needSync .    
1b260 2a 2a 20 74 6f 20 7a 65 72 6f 20 61 6e 64 20 63  ** to zero and c
1b270 6c 65 61 72 20 74 68 65 20 50 47 48 44 52 5f 4e  lear the PGHDR_N
1b280 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 6f 6e  EED_SYNC flag on
1b290 20 61 6c 6c 20 70 61 67 65 73 73 2e 0a 20 20 20   all pagess..   
1b2a0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
1b2b0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1b2c0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1b2d0 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20 20  lStarted = 1;.  
1b2e0 20 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 43    sqlite3PcacheC
1b2f0 6c 65 61 72 53 79 6e 63 46 6c 61 67 73 28 70 50  learSyncFlags(pP
1b300 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a  ager->pPCache);.
1b310 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1b320 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
1b330 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 69  * The argument i
1b340 73 20 74 68 65 20 66 69 72 73 74 20 69 6e 20 61  s the first in a
1b350 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
1b360 64 69 72 74 79 20 70 61 67 65 73 20 63 6f 6e 6e  dirty pages conn
1b370 65 63 74 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  ected.** by the 
1b380 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
1b390 6e 74 65 72 2e 20 54 68 69 73 20 66 75 6e 63 74  nter. This funct
1b3a0 69 6f 6e 20 77 72 69 74 65 73 20 65 61 63 68 20  ion writes each 
1b3b0 6f 6e 65 20 6f 66 20 74 68 65 0a 2a 2a 20 69 6e  one of the.** in
1b3c0 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 69 6e  -memory pages in
1b3d0 20 74 68 65 20 6c 69 73 74 20 74 6f 20 74 68 65   the list to the
1b3e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1b3f0 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6d 61 79  The argument may
1b400 0a 2a 2a 20 62 65 20 4e 55 4c 4c 2c 20 72 65 70  .** be NULL, rep
1b410 72 65 73 65 6e 74 69 6e 67 20 61 6e 20 65 6d 70  resenting an emp
1b420 74 79 20 6c 69 73 74 2e 20 49 6e 20 74 68 69 73  ty list. In this
1b430 20 63 61 73 65 20 74 68 69 73 20 66 75 6e 63 74   case this funct
1b440 69 6f 6e 20 69 73 0a 2a 2a 20 61 20 6e 6f 2d 6f  ion is.** a no-o
1b450 70 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  p..**.** The pag
1b460 65 72 20 6d 75 73 74 20 68 6f 6c 64 20 61 74 20  er must hold at 
1b470 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45 44  least a RESERVED
1b480 20 6c 6f 63 6b 20 77 68 65 6e 20 74 68 69 73 20   lock when this 
1b490 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 63  function.** is c
1b4a0 61 6c 6c 65 64 2e 20 42 65 66 6f 72 65 20 77 72  alled. Before wr
1b4b0 69 74 69 6e 67 20 61 6e 79 74 68 69 6e 67 20 74  iting anything t
1b4c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b4d0 69 6c 65 2c 20 74 68 69 73 20 6c 6f 63 6b 0a 2a  ile, this lock.*
1b4e0 2a 20 69 73 20 75 70 67 72 61 64 65 64 20 74 6f  * is upgraded to
1b4f0 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
1b500 63 6b 2e 20 49 66 20 74 68 65 20 6c 6f 63 6b 20  ck. If the lock 
1b510 63 61 6e 6e 6f 74 20 62 65 20 6f 62 74 61 69 6e  cannot be obtain
1b520 65 64 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 42 55  ed,.** SQLITE_BU
1b530 53 59 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  SY is returned a
1b540 6e 64 20 6e 6f 20 64 61 74 61 20 69 73 20 77 72  nd no data is wr
1b550 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
1b560 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 0a  abase file..** .
1b570 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
1b580 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20 70  is a temp-file p
1b590 61 67 65 72 20 61 6e 64 20 74 68 65 20 61 63 74  ager and the act
1b5a0 75 61 6c 20 66 69 6c 65 2d 73 79 73 74 65 6d 20  ual file-system 
1b5b0 66 69 6c 65 0a 2a 2a 20 69 73 20 6e 6f 74 20 79  file.** is not y
1b5c0 65 74 20 6f 70 65 6e 2c 20 69 74 20 69 73 20 63  et open, it is c
1b5d0 72 65 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  reated and opene
1b5e0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
1b5f0 61 20 69 73 20 0a 2a 2a 20 77 72 69 74 74 65 6e  a is .** written
1b600 20 6f 75 74 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 63 65   out..**.** Once
1b610 20 74 68 65 20 6c 6f 63 6b 20 68 61 73 20 62 65   the lock has be
1b620 65 6e 20 75 70 67 72 61 64 65 64 20 61 6e 64 2c  en upgraded and,
1b630 20 69 66 20 6e 65 63 65 73 73 61 72 79 2c 20 74   if necessary, t
1b640 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 2c 0a  he file opened,.
1b650 2a 2a 20 74 68 65 20 70 61 67 65 73 20 61 72 65  ** the pages are
1b660 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20   written out to 
1b670 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b680 65 20 69 6e 20 6c 69 73 74 20 6f 72 64 65 72 2e  e in list order.
1b690 20 57 72 69 74 69 6e 67 0a 2a 2a 20 61 20 70 61   Writing.** a pa
1b6a0 67 65 20 69 73 20 73 6b 69 70 70 65 64 20 69 66  ge is skipped if
1b6b0 20 69 74 20 6d 65 65 74 73 20 65 69 74 68 65 72   it meets either
1b6c0 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
1b6d0 67 20 63 72 69 74 65 72 69 61 3a 0a 2a 2a 0a 2a  g criteria:.**.*
1b6e0 2a 20 20 20 2a 20 54 68 65 20 70 61 67 65 20 6e  *   * The page n
1b6f0 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
1b700 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
1b710 7a 65 2c 20 6f 72 0a 2a 2a 20 20 20 2a 20 54 68  ze, or.**   * Th
1b720 65 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49  e PGHDR_DONT_WRI
1b730 54 45 20 66 6c 61 67 20 69 73 20 73 65 74 20 6f  TE flag is set o
1b740 6e 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a  n the page..**.*
1b750 2a 20 49 66 20 77 72 69 74 69 6e 67 20 6f 75 74  * If writing out
1b760 20 61 20 70 61 67 65 20 63 61 75 73 65 73 20 74   a page causes t
1b770 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1b780 20 74 6f 20 67 72 6f 77 2c 20 50 61 67 65 72 2e   to grow, Pager.
1b790 64 62 46 69 6c 65 53 69 7a 65 0a 2a 2a 20 69 73  dbFileSize.** is
1b7a0 20 75 70 64 61 74 65 64 20 61 63 63 6f 72 64 69   updated accordi
1b7b0 6e 67 6c 79 2e 20 49 66 20 70 61 67 65 20 31 20  ngly. If page 1 
1b7c0 69 73 20 77 72 69 74 74 65 6e 20 6f 75 74 2c 20  is written out, 
1b7d0 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20 63  then the value c
1b7e0 61 63 68 65 64 0a 2a 2a 20 69 6e 20 50 61 67 65  ached.** in Page
1b7f0 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
1b800 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61 74  s updated to mat
1b810 63 68 20 74 68 65 20 6e 65 77 20 76 61 6c 75 65  ch the new value
1b820 20 73 74 6f 72 65 64 20 69 6e 0a 2a 2a 20 74 68   stored in.** th
1b830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b840 0a 2a 2a 0a 2a 2a 20 49 66 20 65 76 65 72 79 74  .**.** If everyt
1b850 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73 66  hing is successf
1b860 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  ul, SQLITE_OK is
1b870 20 72 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e   returned. If an
1b880 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   IO error .** oc
1b890 63 75 72 73 2c 20 61 6e 20 49 4f 20 65 72 72 6f  curs, an IO erro
1b8a0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
1b8b0 65 64 2e 20 4f 72 2c 20 69 66 20 74 68 65 20 45  ed. Or, if the E
1b8c0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 63 61  XCLUSIVE lock ca
1b8d0 6e 6e 6f 74 0a 2a 2a 20 62 65 20 6f 62 74 61 69  nnot.** be obtai
1b8e0 6e 65 64 2c 20 53 51 4c 49 54 45 5f 42 55 53 59  ned, SQLITE_BUSY
1b8f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
1b900 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1b910 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74  r_write_pagelist
1b920 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a  (PgHdr *pList){.
1b930 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20         /* Pager 
1b960 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20  object */.  int 
1b970 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rc;             
1b980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b990 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20   /* Return code 
1b9a0 2a 2f 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  */..  if( pList=
1b9b0 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
1b9c0 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20  TE_OK;.  pPager 
1b9d0 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b  = pList->pPager;
1b9e0 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70  ..  /* At this p
1b9f0 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20 62  oint there may b
1ba00 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45 52  e either a RESER
1ba10 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
1ba20 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a   lock on the.  *
1ba30 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
1ba40 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c 72   If there is alr
1ba50 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49 56  eady an EXCLUSIV
1ba60 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c  E lock, the foll
1ba70 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 20  owing.  ** call 
1ba80 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2a  is a no-op..  **
1ba90 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65  .  ** Moving the
1baa0 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52   lock from RESER
1bab0 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45  VED to EXCLUSIVE
1bac0 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76   actually involv
1bad0 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68  es going.  ** th
1bae0 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65  rough an interme
1baf0 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44  diate state PEND
1bb00 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47  ING.   A PENDING
1bb10 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e   lock prevents n
1bb20 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20  ew.  ** readers 
1bb30 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74  from attaching t
1bb40 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  o the database b
1bb50 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65  ut is unsufficie
1bb60 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a  nt for us to.  *
1bb70 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64  * write.  The id
1bb80 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20  ea of a PENDING 
1bb90 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65  lock is to preve
1bba0 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66  nt new readers f
1bbb0 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20  rom.  ** coming 
1bbc0 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74  in while we wait
1bbd0 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65   for existing re
1bbe0 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a  aders to clear..
1bbf0 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20    **.  ** While 
1bc00 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
1bc10 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61  the RESERVED sta
1bc20 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  te, the original
1bc30 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20   database file. 
1bc40 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64   ** is unchanged
1bc50 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c   and we can roll
1bc60 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76  back without hav
1bc70 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20  ing to playback 
1bc80 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  the.  ** journal
1bc90 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e   into the origin
1bca0 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
1bcb0 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73  .  Once we trans
1bcc0 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58  ition to.  ** EX
1bcd0 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e  CLUSIVE, it mean
1bce0 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  s the database f
1bcf0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61  ile has been cha
1bd00 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c  nged and any rol
1bd10 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20  lback.  ** will 
1bd20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61  require a journa
1bd30 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f  l playback..  */
1bd40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1bd50 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1bd60 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 72 63  RESERVED );.  rc
1bd70 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e   = pager_wait_on
1bd80 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58  _lock(pPager, EX
1bd90 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 0a  CLUSIVE_LOCK);..
1bda0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1bdb0 20 69 73 20 61 20 74 65 6d 70 2d 66 69 6c 65 20   is a temp-file 
1bdc0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
1bdd0 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
1bde0 20 6e 6f 77 2e 20 49 74 0a 20 20 2a 2a 20 69 73   now. It.  ** is
1bdf0 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20 66 6f   not possible fo
1be00 72 20 72 63 20 74 6f 20 62 65 20 6f 74 68 65 72  r rc to be other
1be10 20 74 68 61 6e 20 53 51 4c 49 54 45 5f 4f 4b 20   than SQLITE_OK 
1be20 69 66 20 74 68 69 73 20 62 72 61 6e 63 68 0a 20  if this branch. 
1be30 20 2a 2a 20 69 73 20 74 61 6b 65 6e 2c 20 61 73   ** is taken, as
1be40 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c   pager_wait_on_l
1be50 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1be60 20 66 6f 72 20 74 65 6d 70 2d 66 69 6c 65 73 2e   for temp-files.
1be70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 69 73 4f  .  */.  if( !isO
1be80 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64 29 20  pen(pPager->fd) 
1be90 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1bea0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1beb0 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  && rc==SQLITE_OK
1bec0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
1bed0 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
1bee0 72 2c 20 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  r, pPager->fd, p
1bef0 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 29  Pager->vfsFlags)
1bf00 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
1bf10 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1bf20 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 50 67   pList ){.    Pg
1bf30 6e 6f 20 70 67 6e 6f 20 3d 20 70 4c 69 73 74 2d  no pgno = pList-
1bf40 3e 70 67 6e 6f 3b 0a 0a 20 20 20 20 2f 2a 20 49  >pgno;..    /* I
1bf50 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72 74  f there are dirt
1bf60 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 70  y pages in the p
1bf70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20 70  age cache with p
1bf80 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65 61  age numbers grea
1bf90 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20  ter.    ** than 
1bfa0 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74 68  Pager.dbSize, th
1bfb0 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65 33  is means sqlite3
1bfc0 50 61 67 65 72 54 72 75 6e 63 61 74 65 49 6d 61  PagerTruncateIma
1bfd0 67 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  ge() was called 
1bfe0 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
1bff0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
1c000 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
1c010 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
1c020 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
1c030 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
1c040 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
1c050 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
1c060 41 6c 73 6f 2c 20 64 6f 20 6e 6f 74 20 77 72 69  Also, do not wri
1c070 74 65 20 6f 75 74 20 61 6e 79 20 70 61 67 65 20  te out any page 
1c080 74 68 61 74 20 68 61 73 20 74 68 65 20 50 47 48  that has the PGH
1c090 44 52 5f 44 4f 4e 54 5f 57 52 49 54 45 20 66 6c  DR_DONT_WRITE fl
1c0a0 61 67 0a 20 20 20 20 2a 2a 20 73 65 74 20 28 73  ag.    ** set (s
1c0b0 65 74 20 62 79 20 73 71 6c 69 74 65 33 50 61 67  et by sqlite3Pag
1c0c0 65 72 44 6f 6e 74 57 72 69 74 65 28 29 29 2e 0a  erDontWrite())..
1c0d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
1c0e0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
1c0f0 69 7a 65 20 26 26 20 30 3d 3d 28 70 4c 69 73 74  ize && 0==(pList
1c100 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 4f  ->flags&PGHDR_DO
1c110 4e 54 5f 57 52 49 54 45 29 20 29 7b 0a 20 20 20  NT_WRITE) ){.   
1c120 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1c130 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1c140 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 20  ager->pageSize; 
1c150 20 20 20 20 20 20 20 20 2f 2a 20 4f 66 66 73 65          /* Offse
1c160 74 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 20 20  t to write */.  
1c170 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 20      char *pData 
1c180 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c  = CODEC2(pPager,
1c190 20 70 4c 69 73 74 2d 3e 70 44 61 74 61 2c 20 70   pList->pData, p
1c1a0 67 6e 6f 2c 20 36 29 3b 20 2f 2a 20 44 61 74 61  gno, 6); /* Data
1c1b0 20 74 6f 20 77 72 69 74 65 20 2a 2f 0a 0a 20 20   to write */..  
1c1c0 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6f 75 74      /* Write out
1c1d0 20 74 68 65 20 70 61 67 65 20 64 61 74 61 2e 20   the page data. 
1c1e0 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  */.      rc = sq
1c1f0 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
1c200 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20  ger->fd, pData, 
1c210 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1c220 2c 20 6f 66 66 73 65 74 29 3b 0a 0a 20 20 20 20  , offset);..    
1c230 20 20 2f 2a 20 49 66 20 70 61 67 65 20 31 20 77    /* If page 1 w
1c240 61 73 20 6a 75 73 74 20 77 72 69 74 74 65 6e 2c  as just written,
1c250 20 75 70 64 61 74 65 20 50 61 67 65 72 2e 64 62   update Pager.db
1c260 46 69 6c 65 56 65 72 73 20 74 6f 20 6d 61 74 63  FileVers to matc
1c270 68 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 76  h.      ** the v
1c280 61 6c 75 65 20 6e 6f 77 20 73 74 6f 72 65 64 20  alue now stored 
1c290 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
1c2a0 66 69 6c 65 2e 20 49 66 20 77 72 69 74 69 6e 67  file. If writing
1c2b0 20 74 68 69 73 20 0a 20 20 20 20 20 20 2a 2a 20   this .      ** 
1c2c0 70 61 67 65 20 63 61 75 73 65 64 20 74 68 65 20  page caused the 
1c2d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
1c2e0 20 67 72 6f 77 2c 20 75 70 64 61 74 65 20 64 62   grow, update db
1c2f0 46 69 6c 65 53 69 7a 65 2e 20 0a 20 20 20 20 20  FileSize. .     
1c300 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 67   */.      if( pg
1c310 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
1c320 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1c330 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
1c340 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
1c350 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1c360 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
1c370 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
1c380 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20  ger->dbFileSize 
1c390 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
1c3a0 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 20 3d 20  r->dbFileSize = 
1c3b0 70 67 6e 6f 3b 0a 20 20 20 20 20 20 7d 0a 0a 20  pgno;.      }.. 
1c3c0 20 20 20 20 20 2f 2a 20 55 70 64 61 74 65 20 61       /* Update a
1c3d0 6e 79 20 62 61 63 6b 75 70 20 6f 62 6a 65 63 74  ny backup object
1c3e0 73 20 63 6f 70 79 69 6e 67 20 74 68 65 20 63 6f  s copying the co
1c3f0 6e 74 65 6e 74 73 20 6f 66 20 74 68 69 73 20 70  ntents of this p
1c400 61 67 65 72 2e 20 2a 2f 0a 20 20 20 20 20 20 73  ager. */.      s
1c410 71 6c 69 74 65 33 42 61 63 6b 75 70 55 70 64 61  qlite3BackupUpda
1c420 74 65 28 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  te(pPager->pBack
1c430 75 70 2c 20 70 67 6e 6f 2c 20 28 75 38 20 2a 29  up, pgno, (u8 *)
1c440 70 44 61 74 61 29 3b 0a 0a 20 20 20 20 20 20 50  pData);..      P
1c450 41 47 45 52 54 52 41 43 45 28 28 22 53 54 4f 52  AGERTRACE(("STOR
1c460 45 20 25 64 20 70 61 67 65 20 25 64 20 68 61 73  E %d page %d has
1c470 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20  h(%08x)\n",.    
1c480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50                 P
1c490 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
1c4a0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
1c4b0 68 61 73 68 28 70 4c 69 73 74 29 29 29 3b 0a 20  hash(pList)));. 
1c4c0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
1c4d0 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
1c4e0 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1c4f0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
1c500 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
1c510 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
1c520 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
1c530 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
1c540 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1c550 20 50 41 47 45 52 54 52 41 43 45 28 28 22 4e 4f   PAGERTRACE(("NO
1c560 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
1c570 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
1c580 67 65 72 29 2c 20 70 67 6e 6f 29 29 3b 0a 20 20  ger), pgno));.  
1c590 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
1c5a0 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
1c5b0 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48 61 73    pList->pageHas
1c5c0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
1c5d0 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e 64 69  sh(pList);.#endi
1c5e0 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c  f.    pList = pL
1c5f0 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d  ist->pDirty;.  }
1c600 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
1c610 0a 0a 2f 2a 0a 2a 2a 20 41 70 70 65 6e 64 20 61  ../*.** Append a
1c620 20 72 65 63 6f 72 64 20 6f 66 20 74 68 65 20 63   record of the c
1c630 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1c640 70 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20  page pPg to the 
1c650 73 75 62 2d 6a 6f 75 72 6e 61 6c 2e 20 0a 2a 2a  sub-journal. .**
1c660 20 49 74 20 69 73 20 74 68 65 20 63 61 6c 6c 65   It is the calle
1c670 72 73 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  rs responsibilit
1c680 79 20 74 6f 20 75 73 65 20 73 75 62 6a 52 65 71  y to use subjReq
1c690 75 69 72 65 73 50 61 67 65 28 29 20 74 6f 20 63  uiresPage() to c
1c6a0 68 65 63 6b 20 0a 2a 2a 20 74 68 61 74 20 69 74  heck .** that it
1c6b0 20 69 73 20 72 65 61 6c 6c 79 20 72 65 71 75 69   is really requi
1c6c0 72 65 64 20 62 65 66 6f 72 65 20 63 61 6c 6c 69  red before calli
1c6d0 6e 67 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ng this function
1c6e0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
1c6f0 73 73 66 75 6c 2c 20 73 65 74 20 74 68 65 20 62  ssful, set the b
1c700 69 74 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  it corresponding
1c710 20 74 6f 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e   to pPg->pgno in
1c720 20 74 68 65 20 62 69 74 76 65 63 73 0a 2a 2a 20   the bitvecs.** 
1c730 66 6f 72 20 61 6c 6c 20 6f 70 65 6e 20 73 61 76  for all open sav
1c740 65 70 6f 69 6e 74 73 20 62 65 66 6f 72 65 20 72  epoints before r
1c750 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  eturning..**.** 
1c760 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  This function re
1c770 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 20  turns SQLITE_OK 
1c780 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 69 73  if everything is
1c790 20 73 75 63 63 65 73 73 66 75 6c 2c 20 61 6e 20   successful, an 
1c7a0 49 4f 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65  IO.** error code
1c7b0 20 69 66 20 74 68 65 20 61 74 74 65 6d 70 74 20   if the attempt 
1c7c0 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  to write to the 
1c7d0 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 66 61 69 6c  sub-journal fail
1c7e0 73 2c 20 6f 72 20 0a 2a 2a 20 53 51 4c 49 54 45  s, or .** SQLITE
1c7f0 5f 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 61 6c 6c  _NOMEM if a mall
1c800 6f 63 20 66 61 69 6c 73 20 77 68 69 6c 65 20 73  oc fails while s
1c810 65 74 74 69 6e 67 20 61 20 62 69 74 20 69 6e 20  etting a bit in 
1c820 61 20 73 61 76 65 70 6f 69 6e 74 0a 2a 2a 20 62  a savepoint.** b
1c830 69 74 76 65 63 2e 0a 2a 2f 0a 73 74 61 74 69 63  itvec..*/.static
1c840 20 69 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 50   int subjournalP
1c850 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
1c860 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
1c870 54 45 5f 4f 4b 3b 0a 20 20 50 61 67 65 72 20 2a  TE_OK;.  Pager *
1c880 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1c890 61 67 65 72 3b 0a 20 20 69 66 28 20 69 73 4f 70  ager;.  if( isOp
1c8a0 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29  en(pPager->sjfd)
1c8b0 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70 44   ){.    void *pD
1c8c0 61 74 61 20 3d 20 70 50 67 2d 3e 70 44 61 74 61  ata = pPg->pData
1c8d0 3b 0a 20 20 20 20 69 36 34 20 6f 66 66 73 65 74  ;.    i64 offset
1c8e0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52   = pPager->nSubR
1c8f0 65 63 2a 28 34 2b 70 50 61 67 65 72 2d 3e 70 61  ec*(4+pPager->pa
1c900 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 63 68 61  geSize);.    cha
1c910 72 20 2a 70 44 61 74 61 32 20 3d 20 43 4f 44 45  r *pData2 = CODE
1c920 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  C2(pPager, pData
1c930 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
1c940 0a 20 20 0a 20 20 20 20 50 41 47 45 52 54 52 41  .  .    PAGERTRA
1c950 43 45 28 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE(("STMT-JOURNA
1c960 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
1c970 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
1c980 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
1c990 20 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61   .    assert( pa
1c9a0 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
1c9b0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
1c9c0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
1c9d0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69   );.    rc = wri
1c9e0 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  te32bits(pPager-
1c9f0 3e 73 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70  >sjfd, offset, p
1ca00 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
1ca10 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1ca20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1ca30 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1ca40 61 67 65 72 2d 3e 73 6a 66 64 2c 20 70 44 61 74  ager->sjfd, pDat
1ca50 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
1ca60 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29 3b  Size, offset+4);
1ca70 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
1ca80 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1ca90 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 53  {.    pPager->nS
1caa0 75 62 52 65 63 2b 2b 3b 0a 20 20 20 20 61 73 73  ubRec++;.    ass
1cab0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 53 61  ert( pPager->nSa
1cac0 76 65 70 6f 69 6e 74 3e 30 20 29 3b 0a 20 20 20  vepoint>0 );.   
1cad0 20 72 63 20 3d 20 61 64 64 54 6f 53 61 76 65 70   rc = addToSavep
1cae0 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61 67  ointBitvecs(pPag
1caf0 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a  er, pPg->pgno);.
1cb00 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 63      testcase( rc
1cb10 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20  !=SQLITE_OK );. 
1cb20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
1cb30 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  }.../*.** This f
1cb40 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
1cb50 64 20 62 79 20 74 68 65 20 70 63 61 63 68 65 20  d by the pcache 
1cb60 6c 61 79 65 72 20 77 68 65 6e 20 69 74 20 68 61  layer when it ha
1cb70 73 20 72 65 61 63 68 65 64 20 73 6f 6d 65 0a 2a  s reached some.*
1cb80 2a 20 73 6f 66 74 20 6d 65 6d 6f 72 79 20 6c 69  * soft memory li
1cb90 6d 69 74 2e 20 54 68 65 20 66 69 72 73 74 20 61  mit. The first a
1cba0 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69  rgument is a poi
1cbb0 6e 74 65 72 20 74 6f 20 61 20 50 61 67 65 72 20  nter to a Pager 
1cbc0 6f 62 6a 65 63 74 0a 2a 2a 20 28 63 61 73 74 20  object.** (cast 
1cbd0 61 73 20 61 20 76 6f 69 64 2a 29 2e 20 54 68 65  as a void*). The
1cbe0 20 70 61 67 65 72 20 69 73 20 61 6c 77 61 79 73   pager is always
1cbf0 20 27 70 75 72 67 65 61 62 6c 65 27 20 28 6e 6f   'purgeable' (no
1cc00 74 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 0a 2a  t an in-memory.*
1cc10 2a 20 64 61 74 61 62 61 73 65 29 2e 20 54 68 65  * database). The
1cc20 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
1cc30 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
1cc40 74 6f 20 61 20 70 61 67 65 20 74 68 61 74 20 69  to a page that i
1cc50 73 20 0a 2a 2a 20 63 75 72 72 65 6e 74 6c 79 20  s .** currently 
1cc60 64 69 72 74 79 20 62 75 74 20 68 61 73 20 6e 6f  dirty but has no
1cc70 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 72 65 66   outstanding ref
1cc80 65 72 65 6e 63 65 73 2e 20 54 68 65 20 70 61 67  erences. The pag
1cc90 65 0a 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 61  e.** is always a
1cca0 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
1ccb0 68 65 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20  he Pager object 
1ccc0 70 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69  passed as the fi
1ccd0 72 73 74 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  rst .** argument
1cce0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 62 20  ..**.** The job 
1ccf0 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1cd00 20 69 73 20 74 6f 20 6d 61 6b 65 20 70 50 67 20   is to make pPg 
1cd10 63 6c 65 61 6e 20 62 79 20 77 72 69 74 69 6e 67  clean by writing
1cd20 20 69 74 73 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   its contents.**
1cd30 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61   out to the data
1cd40 62 61 73 65 20 66 69 6c 65 2c 20 69 66 20 70 6f  base file, if po
1cd50 73 73 69 62 6c 65 2e 20 54 68 69 73 20 6d 61 79  ssible. This may
1cd60 20 69 6e 76 6f 6c 76 65 20 73 79 6e 63 69 6e 67   involve syncing
1cd70 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
1cd80 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20  file. .**.** If 
1cd90 73 75 63 63 65 73 73 66 75 6c 2c 20 73 71 6c 69  successful, sqli
1cda0 74 65 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65  te3PcacheMakeCle
1cdb0 61 6e 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  an() is called o
1cdc0 6e 20 74 68 65 20 70 61 67 65 20 61 6e 64 0a 2a  n the page and.*
1cdd0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
1cde0 72 6e 65 64 2e 20 49 66 20 61 6e 20 49 4f 20 65  rned. If an IO e
1cdf0 72 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c  rror occurs whil
1ce00 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 6b 65  e trying to make
1ce10 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6c 65   the.** page cle
1ce20 61 6e 2c 20 74 68 65 20 49 4f 20 65 72 72 6f 72  an, the IO error
1ce30 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
1ce40 64 2e 20 49 66 20 74 68 65 20 70 61 67 65 20 63  d. If the page c
1ce50 61 6e 6e 6f 74 20 62 65 0a 2a 2a 20 6d 61 64 65  annot be.** made
1ce60 20 63 6c 65 61 6e 20 66 6f 72 20 73 6f 6d 65 20   clean for some 
1ce70 6f 74 68 65 72 20 72 65 61 73 6f 6e 2c 20 62 75  other reason, bu
1ce80 74 20 6e 6f 20 65 72 72 6f 72 20 6f 63 63 75 72  t no error occur
1ce90 73 2c 20 74 68 65 6e 20 53 51 4c 49 54 45 5f 4f  s, then SQLITE_O
1cea0 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e 65 64  K.** is returned
1ceb0 20 62 79 20 73 71 6c 69 74 65 33 50 63 61 63 68   by sqlite3Pcach
1cec0 65 4d 61 6b 65 43 6c 65 61 6e 28 29 20 69 73 20  eMakeClean() is 
1ced0 6e 6f 74 20 63 61 6c 6c 65 64 2e 0a 2a 2f 0a 73  not called..*/.s
1cee0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1cef0 74 72 65 73 73 28 76 6f 69 64 20 2a 70 2c 20 50  tress(void *p, P
1cf00 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
1cf10 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 28 50  ger *pPager = (P
1cf20 61 67 65 72 20 2a 29 70 3b 0a 20 20 69 6e 74 20  ager *)p;.  int 
1cf30 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1cf40 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
1cf50 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20 29  pPager==pPager )
1cf60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
1cf70 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49 52  >flags&PGHDR_DIR
1cf80 54 59 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  TY );..  /* The 
1cf90 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 69  doNotSync flag i
1cfa0 73 20 73 65 74 20 62 79 20 74 68 65 20 73 71 6c  s set by the sql
1cfb0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
1cfc0 20 66 75 6e 63 74 69 6f 6e 20 77 68 69 6c 65 20   function while 
1cfd0 69 74 0a 20 20 2a 2a 20 69 73 20 6a 6f 75 72 6e  it.  ** is journ
1cfe0 61 6c 6c 69 6e 67 20 61 20 73 65 74 20 6f 66 20  alling a set of 
1cff0 74 77 6f 20 6f 72 20 6d 6f 72 65 20 64 61 74 61  two or more data
1d000 62 61 73 65 20 70 61 67 65 73 20 74 68 61 74 20  base pages that 
1d010 61 72 65 20 73 74 6f 72 65 64 0a 20 20 2a 2a 20  are stored.  ** 
1d020 6f 6e 20 74 68 65 20 73 61 6d 65 20 64 69 73 6b  on the same disk
1d030 20 73 65 63 74 6f 72 2e 20 53 79 6e 63 69 6e 67   sector. Syncing
1d040 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
1d050 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 77 68 69 6c  not allowed whil
1d060 65 0a 20 20 2a 2a 20 74 68 69 73 20 69 73 20 68  e.  ** this is h
1d070 61 70 70 65 6e 69 6e 67 20 61 73 20 69 74 20 69  appening as it i
1d080 73 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  s important that
1d090 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66 20   all members of 
1d0a0 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 65 74 20  such a.  ** set 
1d0b0 6f 66 20 70 61 67 65 73 20 61 72 65 20 73 79 6e  of pages are syn
1d0c0 63 65 64 20 74 6f 20 64 69 73 6b 20 74 6f 67 65  ced to disk toge
1d0d0 74 68 65 72 2e 20 53 6f 2c 20 69 66 20 74 68 65  ther. So, if the
1d0e0 20 70 61 67 65 20 74 68 69 73 20 66 75 6e 63 74   page this funct
1d0f0 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 74 72 79 69  ion.  ** is tryi
1d100 6e 67 20 74 6f 20 6d 61 6b 65 20 63 6c 65 61 6e  ng to make clean
1d110 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
1d120 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 20 61 6e 64  journal sync and
1d130 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63 0a 20   the doNotSync. 
1d140 20 2a 2a 20 66 6c 61 67 20 69 73 20 73 65 74 2c   ** flag is set,
1d150 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
1d160 64 6f 69 6e 67 20 61 6e 79 74 68 69 6e 67 2e 20  doing anything. 
1d170 54 68 65 20 70 63 61 63 68 65 20 6c 61 79 65 72  The pcache layer
1d180 20 77 69 6c 6c 0a 20 20 2a 2a 20 6a 75 73 74 20   will.  ** just 
1d190 68 61 76 65 20 74 6f 20 67 6f 20 61 68 65 61 64  have to go ahead
1d1a0 20 61 6e 64 20 61 6c 6c 6f 63 61 74 65 20 61 20   and allocate a 
1d1b0 6e 65 77 20 70 61 67 65 20 62 75 66 66 65 72 20  new page buffer 
1d1c0 69 6e 73 74 65 61 64 20 6f 66 0a 20 20 2a 2a 20  instead of.  ** 
1d1d0 72 65 75 73 69 6e 67 20 70 50 67 2e 0a 20 20 2a  reusing pPg..  *
1d1e0 2a 0a 20 20 2a 2a 20 53 69 6d 69 6c 61 72 6c 79  *.  ** Similarly
1d1f0 2c 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68  , if the pager h
1d200 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72  as already enter
1d210 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ed the error sta
1d220 74 65 2c 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20  te, do not.  ** 
1d230 74 72 79 20 74 6f 20 77 72 69 74 65 20 74 68 65  try to write the
1d240 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 70 50 67   contents of pPg
1d250 20 74 6f 20 64 69 73 6b 2e 0a 20 20 2a 2f 0a 20   to disk..  */. 
1d260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1d270 43 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d  Code || (pPager-
1d280 3e 64 6f 4e 6f 74 53 79 6e 63 20 26 26 20 70 50  >doNotSync && pP
1d290 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 4e  g->flags&PGHDR_N
1d2a0 45 45 44 5f 53 59 4e 43 29 20 29 7b 0a 20 20 20  EED_SYNC) ){.   
1d2b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1d2c0 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 79 6e  K;.  }..  /* Syn
1d2d0 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
1d2e0 6c 65 20 69 66 20 72 65 71 75 69 72 65 64 2e 20  le if required. 
1d2f0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 66 6c  */.  if( pPg->fl
1d300 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53  ags&PGHDR_NEED_S
1d310 59 4e 43 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  YNC ){.    rc = 
1d320 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1d330 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  er);.    if( rc=
1d340 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50  =SQLITE_OK && pP
1d350 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26  ager->fullSync &
1d360 26 20 0a 20 20 20 20 20 20 21 28 70 50 61 67 65  & .      !(pPage
1d370 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
1d380 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
1d390 45 5f 4d 45 4d 4f 52 59 29 20 26 26 0a 20 20 20  E_MEMORY) &&.   
1d3a0 20 20 20 21 28 73 71 6c 69 74 65 33 4f 73 44 65     !(sqlite3OsDe
1d3b0 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
1d3c0 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 26  ics(pPager->fd)&
1d3d0 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41 46  SQLITE_IOCAP_SAF
1d3e0 45 5f 41 50 50 45 4e 44 29 0a 20 20 20 20 29 7b  E_APPEND).    ){
1d3f0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
1d400 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  Rec = 0;.      r
1d410 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
1d420 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
1d430 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
1d440 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
1d450 6f 66 20 74 68 69 73 20 70 61 67 65 20 69 73 20  of this page is 
1d460 6c 61 72 67 65 72 20 74 68 61 6e 20 74 68 65 20  larger than the 
1d470 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 0a  current size of.
1d480 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
1d490 65 20 69 6d 61 67 65 2c 20 69 74 20 6d 61 79 20  e image, it may 
1d4a0 6e 65 65 64 20 74 6f 20 62 65 20 77 72 69 74 74  need to be writt
1d4b0 65 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 6a 6f  en to the sub-jo
1d4c0 75 72 6e 61 6c 2e 0a 20 20 2a 2a 20 54 68 69 73  urnal..  ** This
1d4d0 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
1d4e0 63 61 6c 6c 20 74 6f 20 70 61 67 65 72 5f 77 72  call to pager_wr
1d4f0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 29 20 62  ite_pagelist() b
1d500 65 6c 6f 77 20 77 69 6c 6c 20 6e 6f 74 0a 20 20  elow will not.  
1d510 2a 2a 20 61 63 74 75 61 6c 6c 79 20 77 72 69 74  ** actually writ
1d520 65 20 64 61 74 61 20 74 6f 20 74 68 65 20 66 69  e data to the fi
1d530 6c 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  le in this case.
1d540 0a 20 20 2a 2a 0a 20 20 2a 2a 20 43 6f 6e 73 69  .  **.  ** Consi
1d550 64 65 72 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  der the followin
1d560 67 20 73 65 71 75 65 6e 63 65 20 6f 66 20 65 76  g sequence of ev
1d570 65 6e 74 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ents:.  **.  ** 
1d580 20 20 42 45 47 49 4e 3b 0a 20 20 2a 2a 20 20 20    BEGIN;.  **   
1d590 20 20 3c 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20    <journal page 
1d5a0 58 3e 0a 20 20 2a 2a 20 20 20 20 20 3c 6d 6f 64  X>.  **     <mod
1d5b0 69 66 79 20 70 61 67 65 20 58 3e 0a 20 20 2a 2a  ify page X>.  **
1d5c0 20 20 20 20 20 53 41 56 45 50 4f 49 4e 54 20 73       SAVEPOINT s
1d5d0 70 3b 0a 20 20 2a 2a 20 20 20 20 20 20 20 3c 73  p;.  **       <s
1d5e0 68 72 69 6e 6b 20 64 61 74 61 62 61 73 65 20 66  hrink database f
1d5f0 69 6c 65 20 74 6f 20 59 20 70 61 67 65 73 3e 0a  ile to Y pages>.
1d600 20 20 2a 2a 20 20 20 20 20 20 20 70 61 67 65 72    **       pager
1d610 53 74 72 65 73 73 28 70 61 67 65 20 58 29 0a 20  Stress(page X). 
1d620 20 2a 2a 20 20 20 20 20 52 4f 4c 4c 42 41 43 4b   **     ROLLBACK
1d630 20 54 4f 20 73 70 3b 0a 20 20 2a 2a 0a 20 20 2a   TO sp;.  **.  *
1d640 2a 20 49 66 20 28 58 3e 59 29 2c 20 74 68 65 6e  * If (X>Y), then
1d650 20 77 68 65 6e 20 70 61 67 65 72 53 74 72 65 73   when pagerStres
1d660 73 20 69 73 20 63 61 6c 6c 65 64 20 70 61 67 65  s is called page
1d670 20 58 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 77   X will not be w
1d680 72 69 74 74 65 6e 0a 20 20 2a 2a 20 6f 75 74 20  ritten.  ** out 
1d690 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1d6a0 66 69 6c 65 2c 20 62 75 74 20 77 69 6c 6c 20 62  file, but will b
1d6b0 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 74  e dropped from t
1d6c0 68 65 20 63 61 63 68 65 2e 20 54 68 65 6e 2c 0a  he cache. Then,.
1d6d0 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 74    ** following t
1d6e0 68 65 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  he "ROLLBACK TO 
1d6f0 73 70 22 20 73 74 61 74 65 6d 65 6e 74 2c 20 72  sp" statement, r
1d700 65 61 64 69 6e 67 20 70 61 67 65 20 58 20 77 69  eading page X wi
1d710 6c 6c 20 72 65 61 64 0a 20 20 2a 2a 20 64 61 74  ll read.  ** dat
1d720 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62  a from the datab
1d730 61 73 65 20 66 69 6c 65 2e 20 54 68 69 73 20 77  ase file. This w
1d740 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 70 79 20  ill be the copy 
1d750 6f 66 20 70 61 67 65 20 58 20 61 73 20 69 74 0a  of page X as it.
1d760 20 20 2a 2a 20 77 61 73 20 77 68 65 6e 20 74 68    ** was when th
1d770 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 73 74  e transaction st
1d780 61 72 74 65 64 2c 20 6e 6f 74 20 61 73 20 69 74  arted, not as it
1d790 20 77 61 73 20 77 68 65 6e 20 22 53 41 56 45 50   was when "SAVEP
1d7a0 4f 49 4e 54 20 73 70 22 0a 20 20 2a 2a 20 77 61  OINT sp".  ** wa
1d7b0 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20 2a 2a  s executed..  **
1d7c0 0a 20 20 2a 2a 20 54 68 65 20 73 6f 6c 75 74 69  .  ** The soluti
1d7d0 6f 6e 20 69 73 20 74 6f 20 77 72 69 74 65 20 74  on is to write t
1d7e0 68 65 20 63 75 72 72 65 6e 74 20 64 61 74 61 20  he current data 
1d7f0 66 6f 72 20 70 61 67 65 20 58 20 69 6e 74 6f 20  for page X into 
1d800 74 68 65 20 0a 20 20 2a 2a 20 73 75 62 2d 6a 6f  the .  ** sub-jo
1d810 75 72 6e 61 6c 20 66 69 6c 65 20 6e 6f 77 20 28  urnal file now (
1d820 69 66 20 69 74 20 69 73 20 6e 6f 74 20 61 6c 72  if it is not alr
1d830 65 61 64 79 20 74 68 65 72 65 29 2c 20 73 6f 20  eady there), so 
1d840 74 68 61 74 20 69 74 20 77 69 6c 6c 0a 20 20 2a  that it will.  *
1d850 2a 20 62 65 20 72 65 73 74 6f 72 65 64 20 74 6f  * be restored to
1d860 20 69 74 73 20 63 75 72 72 65 6e 74 20 76 61 6c   its current val
1d870 75 65 20 77 68 65 6e 20 74 68 65 20 22 52 4f 4c  ue when the "ROL
1d880 4c 42 41 43 4b 20 54 4f 20 73 70 22 20 69 73 20  LBACK TO sp" is 
1d890 0a 20 20 2a 2a 20 65 78 65 63 75 74 65 64 2e 0a  .  ** executed..
1d8a0 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53    */.  if( rc==S
1d8b0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 67 2d  QLITE_OK && pPg-
1d8c0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 64 62  >pgno>pPager->db
1d8d0 53 69 7a 65 20 26 26 20 73 75 62 6a 52 65 71 75  Size && subjRequ
1d8e0 69 72 65 73 50 61 67 65 28 70 50 67 29 20 29 7b  iresPage(pPg) ){
1d8f0 0a 20 20 20 20 72 63 20 3d 20 73 75 62 6a 6f 75  .    rc = subjou
1d900 72 6e 61 6c 50 61 67 65 28 70 50 67 29 3b 0a 20  rnalPage(pPg);. 
1d910 20 7d 0a 0a 20 20 2f 2a 20 57 72 69 74 65 20 74   }..  /* Write t
1d920 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1d930 68 65 20 70 61 67 65 20 6f 75 74 20 74 6f 20 74  he page out to t
1d940 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d950 2e 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53  . */.  if( rc==S
1d960 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1d970 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b  pPg->pDirty = 0;
1d980 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
1d990 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70  write_pagelist(p
1d9a0 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d  Pg);.  }..  /* M
1d9b0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
1d9c0 63 6c 65 61 6e 2e 20 2a 2f 0a 20 20 69 66 28 20  clean. */.  if( 
1d9d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1d9e0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
1d9f0 28 22 53 54 52 45 53 53 20 25 64 20 70 61 67 65  ("STRESS %d page
1da00 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
1da10 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1da20 6e 6f 29 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  no));.    sqlite
1da30 33 50 63 61 63 68 65 4d 61 6b 65 43 6c 65 61 6e  3PcacheMakeClean
1da40 28 70 50 67 29 3b 0a 20 20 7d 0a 0a 20 20 72 65  (pPg);.  }..  re
1da50 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1da60 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a  (pPager, rc);.}.
1da70 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
1da80 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
1da90 61 20 6e 65 77 20 50 61 67 65 72 20 6f 62 6a 65  a new Pager obje
1daa0 63 74 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  ct and put a poi
1dab0 6e 74 65 72 20 74 6f 20 69 74 0a 2a 2a 20 69 6e  nter to it.** in
1dac0 20 2a 70 70 50 61 67 65 72 2e 20 54 68 65 20 70   *ppPager. The p
1dad0 61 67 65 72 20 73 68 6f 75 6c 64 20 65 76 65 6e  ager should even
1dae0 74 75 61 6c 6c 79 20 62 65 20 66 72 65 65 64 20  tually be freed 
1daf0 62 79 20 70 61 73 73 69 6e 67 20 69 74 0a 2a 2a  by passing it.**
1db00 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72   to sqlite3Pager
1db10 43 6c 6f 73 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Close()..**.** T
1db20 68 65 20 7a 46 69 6c 65 6e 61 6d 65 20 61 72 67  he zFilename arg
1db30 75 6d 65 6e 74 20 69 73 20 74 68 65 20 70 61 74  ument is the pat
1db40 68 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  h to the databas
1db50 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 2e 0a  e file to open..
1db60 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
1db70 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72  is NULL then a r
1db80 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65  andomly-named te
1db90 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20  mporary file is 
1dba0 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75  created.** and u
1dbb0 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65 20  sed as the file 
1dbc0 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 54 65  to be cached. Te
1dbd0 6d 70 6f 72 61 72 79 20 66 69 6c 65 73 20 61 72  mporary files ar
1dbe0 65 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20  e be deleted.** 
1dbf0 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68  automatically wh
1dc00 65 6e 20 74 68 65 79 20 61 72 65 20 63 6c 6f 73  en they are clos
1dc10 65 64 2e 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  ed. If zFilename
1dc20 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
1dc30 68 65 6e 20 0a 2a 2a 20 61 6c 6c 20 69 6e 66 6f  hen .** all info
1dc40 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
1dc50 69 6e 20 63 61 63 68 65 2e 20 49 74 20 69 73 20  in cache. It is 
1dc60 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
1dc70 20 64 69 73 6b 2e 20 0a 2a 2a 20 54 68 69 73 20   disk. .** This 
1dc80 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
1dc90 6d 70 6c 65 6d 65 6e 74 20 61 6e 20 69 6e 2d 6d  mplement an in-m
1dca0 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
1dcb0 2a 2a 0a 2a 2a 20 54 68 65 20 6e 45 78 74 72 61  **.** The nExtra
1dcc0 20 70 61 72 61 6d 65 74 65 72 20 73 70 65 63 69   parameter speci
1dcd0 66 69 65 73 20 74 68 65 20 6e 75 6d 62 65 72 20  fies the number 
1dce0 6f 66 20 62 79 74 65 73 20 6f 66 20 73 70 61 63  of bytes of spac
1dcf0 65 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 61  e allocated.** a
1dd00 6c 6f 6e 67 20 77 69 74 68 20 65 61 63 68 20 70  long with each p
1dd10 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 54  age reference. T
1dd20 68 69 73 20 73 70 61 63 65 20 69 73 20 61 76 61  his space is ava
1dd30 69 6c 61 62 6c 65 20 74 6f 20 74 68 65 20 75 73  ilable to the us
1dd40 65 72 0a 2a 2a 20 76 69 61 20 74 68 65 20 73 71  er.** via the sq
1dd50 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
1dd60 72 61 28 29 20 41 50 49 2e 0a 2a 2a 0a 2a 2a 20  ra() API..**.** 
1dd70 54 68 65 20 66 6c 61 67 73 20 61 72 67 75 6d 65  The flags argume
1dd80 6e 74 20 69 73 20 75 73 65 64 20 74 6f 20 73 70  nt is used to sp
1dd90 65 63 69 66 79 20 70 72 6f 70 65 72 74 69 65 73  ecify properties
1dda0 20 74 68 61 74 20 61 66 66 65 63 74 20 74 68 65   that affect the
1ddb0 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 20 6f 66  .** operation of
1ddc0 20 74 68 65 20 70 61 67 65 72 2e 20 49 74 20 73   the pager. It s
1ddd0 68 6f 75 6c 64 20 62 65 20 70 61 73 73 65 64 20  hould be passed 
1dde0 73 6f 6d 65 20 62 69 74 77 69 73 65 20 63 6f 6d  some bitwise com
1ddf0 62 69 6e 61 74 69 6f 6e 0a 2a 2a 20 6f 66 20 74  bination.** of t
1de00 68 65 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f  he PAGER_OMIT_JO
1de10 55 52 4e 41 4c 20 61 6e 64 20 50 41 47 45 52 5f  URNAL and PAGER_
1de20 4e 4f 5f 52 45 41 44 4c 4f 43 4b 20 66 6c 61 67  NO_READLOCK flag
1de30 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 76 66 73  s..**.** The vfs
1de40 46 6c 61 67 73 20 70 61 72 61 6d 65 74 65 72 20  Flags parameter 
1de50 69 73 20 61 20 62 69 74 6d 61 73 6b 20 74 6f 20  is a bitmask to 
1de60 70 61 73 73 20 74 6f 20 74 68 65 20 66 6c 61 67  pass to the flag
1de70 73 20 70 61 72 61 6d 65 74 65 72 0a 2a 2a 20 6f  s parameter.** o
1de80 66 20 74 68 65 20 78 4f 70 65 6e 28 29 20 6d 65  f the xOpen() me
1de90 74 68 6f 64 20 6f 66 20 74 68 65 20 73 75 70 70  thod of the supp
1dea0 6c 69 65 64 20 56 46 53 20 77 68 65 6e 20 6f 70  lied VFS when op
1deb0 65 6e 69 6e 67 20 66 69 6c 65 73 2e 20 0a 2a 2a  ening files. .**
1dec0 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72  .** If the pager
1ded0 20 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63   object is alloc
1dee0 61 74 65 64 20 61 6e 64 20 74 68 65 20 73 70 65  ated and the spe
1def0 63 69 66 69 65 64 20 66 69 6c 65 20 6f 70 65 6e  cified file open
1df00 65 64 20 0a 2a 2a 20 73 75 63 63 65 73 73 66 75  ed .** successfu
1df10 6c 6c 79 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  lly, SQLITE_OK i
1df20 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  s returned and *
1df30 70 70 50 61 67 65 72 20 73 65 74 20 74 6f 20 70  ppPager set to p
1df40 6f 69 6e 74 20 74 6f 0a 2a 2a 20 74 68 65 20 6e  oint to.** the n
1df50 65 77 20 70 61 67 65 72 20 6f 62 6a 65 63 74 2e  ew pager object.
1df60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
1df70 75 72 73 2c 20 2a 70 70 50 61 67 65 72 20 69 73  urs, *ppPager is
1df80 20 73 65 74 20 74 6f 20 4e 55 4c 4c 0a 2a 2a 20   set to NULL.** 
1df90 61 6e 64 20 65 72 72 6f 72 20 63 6f 64 65 20 72  and error code r
1dfa0 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 66 75  eturned. This fu
1dfb0 6e 63 74 69 6f 6e 20 6d 61 79 20 72 65 74 75 72  nction may retur
1dfc0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 0a 2a  n SQLITE_NOMEM.*
1dfd0 2a 20 28 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63  * (sqlite3Malloc
1dfe0 28 29 20 69 73 20 75 73 65 64 20 74 6f 20 61 6c  () is used to al
1dff0 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 29 2c 20  locate memory), 
1e000 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 20  SQLITE_CANTOPEN 
1e010 6f 72 20 0a 2a 2a 20 76 61 72 69 6f 75 73 20 53  or .** various S
1e020 51 4c 49 54 45 5f 49 4f 5f 58 58 58 20 65 72 72  QLITE_IO_XXX err
1e030 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
1e040 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20  te3PagerOpen(.  
1e050 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
1e060 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  s,       /* The 
1e070 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79 73  virtual file sys
1e080 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  tem to use */.  
1e090 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c  Pager **ppPager,
1e0a0 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 55 54 3a           /* OUT:
1e0b0 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67 65   Return the Page
1e0c0 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72 65  r structure here
1e0d0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1e0e0 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f   *zFilename,   /
1e0f0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
1e100 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f  tabase file to o
1e110 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78  pen */.  int nEx
1e120 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20 20  tra,            
1e130 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65 73    /* Extra bytes
1e140 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68 20   append to each 
1e150 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a  in-memory page *
1e160 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 2c 20 20  /.  int flags,  
1e170 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1e180 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e  flags controllin
1e190 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20  g this file */. 
1e1a0 20 69 6e 74 20 76 66 73 46 6c 61 67 73 20 20 20   int vfsFlags   
1e1b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
1e1c0 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75 67  gs passed throug
1e1d0 68 20 74 6f 20 73 71 6c 69 74 65 33 5f 76 66 73  h to sqlite3_vfs
1e1e0 2e 78 4f 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20  .xOpen() */.){. 
1e1f0 20 75 38 20 2a 70 50 74 72 3b 0a 20 20 50 61 67   u8 *pPtr;.  Pag
1e200 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 20  er *pPager = 0; 
1e210 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72 20 6f        /* Pager o
1e220 62 6a 65 63 74 20 74 6f 20 61 6c 6c 6f 63 61 74  bject to allocat
1e230 65 20 61 6e 64 20 72 65 74 75 72 6e 20 2a 2f 0a  e and return */.
1e240 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1e250 45 5f 4f 4b 3b 20 20 20 20 20 20 2f 2a 20 52 65  E_OK;      /* Re
1e260 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
1e270 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b  nt tempFile = 0;
1e280 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e290 66 6f 72 20 74 65 6d 70 20 66 69 6c 65 73 20 28  for temp files (
1e2a0 69 6e 63 6c 2e 20 69 6e 2d 6d 65 6d 6f 72 79 20  incl. in-memory 
1e2b0 66 69 6c 65 73 29 20 2a 2f 0a 20 20 69 6e 74 20  files) */.  int 
1e2c0 6d 65 6d 44 62 20 3d 20 30 3b 20 20 20 20 20 20  memDb = 0;      
1e2d0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1e2e0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1e2f0 6d 6f 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 69  mory file */.  i
1e300 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b  nt readOnly = 0;
1e310 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
1e320 69 66 20 74 68 69 73 20 69 73 20 61 20 72 65 61  if this is a rea
1e330 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 2a 2f 0a 20  d-only file */. 
1e340 20 69 6e 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65   int journalFile
1e350 53 69 7a 65 3b 20 20 20 20 20 2f 2a 20 42 79 74  Size;     /* Byt
1e360 65 73 20 74 6f 20 61 6c 6c 6f 63 61 74 65 20 66  es to allocate f
1e370 6f 72 20 65 61 63 68 20 6a 6f 75 72 6e 61 6c 20  or each journal 
1e380 66 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 50  fd */.  char *zP
1e390 61 74 68 6e 61 6d 65 20 3d 20 30 3b 20 20 20 20  athname = 0;    
1e3a0 20 2f 2a 20 46 75 6c 6c 20 70 61 74 68 20 74 6f   /* Full path to
1e3b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
1e3c0 2f 0a 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d  /.  int nPathnam
1e3d0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  e = 0;       /* 
1e3e0 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
1e3f0 69 6e 20 7a 50 61 74 68 6e 61 6d 65 20 2a 2f 0a  in zPathname */.
1e400 20 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c    int useJournal
1e410 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
1e420 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d  R_OMIT_JOURNAL)=
1e430 3d 30 3b 20 2f 2a 20 46 61 6c 73 65 20 74 6f 20  =0; /* False to 
1e440 6f 6d 69 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  omit journal */.
1e450 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63 6b    int noReadlock
1e460 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45   = (flags & PAGE
1e470 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21 3d  R_NO_READLOCK)!=
1e480 30 3b 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 6f  0;  /* True to o
1e490 6d 69 74 20 72 65 61 64 2d 6c 6f 63 6b 20 2a 2f  mit read-lock */
1e4a0 0a 20 20 69 6e 74 20 70 63 61 63 68 65 53 69 7a  .  int pcacheSiz
1e4b0 65 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68  e = sqlite3Pcach
1e4c0 65 53 69 7a 65 28 29 3b 20 20 20 20 20 20 20 2f  eSize();       /
1e4d0 2a 20 42 79 74 65 73 20 74 6f 20 61 6c 6c 6f 63  * Bytes to alloc
1e4e0 61 74 65 20 66 6f 72 20 50 43 61 63 68 65 20 2a  ate for PCache *
1e4f0 2f 0a 20 20 75 31 36 20 73 7a 50 61 67 65 44 66  /.  u16 szPageDf
1e500 6c 74 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  lt = SQLITE_DEFA
1e510 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 20 20  ULT_PAGE_SIZE;  
1e520 2f 2a 20 44 65 66 61 75 6c 74 20 70 61 67 65 20  /* Default page 
1e530 73 69 7a 65 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69  size */..  /* Fi
1e540 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 75 63  gure out how muc
1e550 68 20 73 70 61 63 65 20 69 73 20 72 65 71 75 69  h space is requi
1e560 72 65 64 20 66 6f 72 20 65 61 63 68 20 6a 6f 75  red for each jou
1e570 72 6e 61 6c 20 66 69 6c 65 2d 68 61 6e 64 6c 65  rnal file-handle
1e580 0a 20 20 2a 2a 20 28 74 68 65 72 65 20 61 72 65  .  ** (there are
1e590 20 74 77 6f 20 6f 66 20 74 68 65 6d 2c 20 74 68   two of them, th
1e5a0 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61  e main journal a
1e5b0 6e 64 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  nd the sub-journ
1e5c0 61 6c 29 2e 20 54 68 69 73 0a 20 20 2a 2a 20 69  al). This.  ** i
1e5d0 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 70  s the maximum sp
1e5e0 61 63 65 20 72 65 71 75 69 72 65 64 20 66 6f 72  ace required for
1e5f0 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 6a 6f   an in-memory jo
1e600 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c  urnal file handl
1e610 65 20 0a 20 20 2a 2a 20 61 6e 64 20 61 20 72 65  e .  ** and a re
1e620 67 75 6c 61 72 20 6a 6f 75 72 6e 61 6c 20 66 69  gular journal fi
1e630 6c 65 2d 68 61 6e 64 6c 65 2e 20 4e 6f 74 65 20  le-handle. Note 
1e640 74 68 61 74 20 61 20 22 72 65 67 75 6c 61 72 20  that a "regular 
1e650 6a 6f 75 72 6e 61 6c 2d 68 61 6e 64 6c 65 22 0a  journal-handle".
1e660 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 20 77 72    ** may be a wr
1e670 61 70 70 65 72 20 63 61 70 61 62 6c 65 20 6f 66  apper capable of
1e680 20 63 61 63 68 69 6e 67 20 74 68 65 20 66 69 72   caching the fir
1e690 73 74 20 70 6f 72 74 69 6f 6e 20 6f 66 20 74 68  st portion of th
1e6a0 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
1e6b0 69 6c 65 20 69 6e 20 6d 65 6d 6f 72 79 20 74 6f  ile in memory to
1e6c0 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 61   implement the a
1e6d0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
1e6e0 6d 69 7a 61 74 69 6f 6e 20 28 73 65 65 20 0a 20  mization (see . 
1e6f0 20 2a 2a 20 73 6f 75 72 63 65 20 66 69 6c 65 20   ** source file 
1e700 6a 6f 75 72 6e 61 6c 2e 63 29 2e 0a 20 20 2a 2f  journal.c)..  */
1e710 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4a 6f  .  if( sqlite3Jo
1e720 75 72 6e 61 6c 53 69 7a 65 28 70 56 66 73 29 3e  urnalSize(pVfs)>
1e730 73 71 6c 69 74 65 33 4d 65 6d 4a 6f 75 72 6e 61  sqlite3MemJourna
1e740 6c 53 69 7a 65 28 29 20 29 7b 0a 20 20 20 20 6a  lSize() ){.    j
1e750 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65 20 3d  ournalFileSize =
1e760 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 53   sqlite3JournalS
1e770 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 7d 65 6c  ize(pVfs);.  }el
1e780 73 65 7b 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46  se{.    journalF
1e790 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  ileSize = sqlite
1e7a0 33 4d 65 6d 4a 6f 75 72 6e 61 6c 53 69 7a 65 28  3MemJournalSize(
1e7b0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 74  );.  }..  /* Set
1e7c0 20 74 68 65 20 6f 75 74 70 75 74 20 76 61 72 69   the output vari
1e7d0 61 62 6c 65 20 74 6f 20 4e 55 4c 4c 20 69 6e 20  able to NULL in 
1e7e0 63 61 73 65 20 61 6e 20 65 72 72 6f 72 20 6f 63  case an error oc
1e7f0 63 75 72 73 2e 20 2a 2f 0a 20 20 2a 70 70 50 61  curs. */.  *ppPa
1e800 67 65 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43  ger = 0;..  /* C
1e810 6f 6d 70 75 74 65 20 61 6e 64 20 73 74 6f 72 65  ompute and store
1e820 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
1e830 6d 65 20 69 6e 20 61 6e 20 61 6c 6c 6f 63 61 74  me in an allocat
1e840 65 64 20 62 75 66 66 65 72 20 70 6f 69 6e 74 65  ed buffer pointe
1e850 64 0a 20 20 2a 2a 20 74 6f 20 62 79 20 7a 50 61  d.  ** to by zPa
1e860 74 68 6e 61 6d 65 2c 20 6c 65 6e 67 74 68 20 6e  thname, length n
1e870 50 61 74 68 6e 61 6d 65 2e 20 4f 72 2c 20 69 66  Pathname. Or, if
1e880 20 74 68 69 73 20 69 73 20 61 20 74 65 6d 70 6f   this is a tempo
1e890 72 61 72 79 20 66 69 6c 65 2c 0a 20 20 2a 2a 20  rary file,.  ** 
1e8a0 6c 65 61 76 65 20 62 6f 74 68 20 6e 50 61 74 68  leave both nPath
1e8b0 6e 61 6d 65 20 61 6e 64 20 7a 50 61 74 68 6e 61  name and zPathna
1e8c0 6d 65 20 73 65 74 20 74 6f 20 30 2e 0a 20 20 2a  me set to 0..  *
1e8d0 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  /.  if( zFilenam
1e8e0 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
1e8f0 5d 20 29 7b 0a 20 20 20 20 6e 50 61 74 68 6e 61  ] ){.    nPathna
1e900 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74  me = pVfs->mxPat
1e910 68 6e 61 6d 65 2b 31 3b 0a 20 20 20 20 7a 50 61  hname+1;.    zPa
1e920 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
1e930 4d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65  Malloc(nPathname
1e940 2a 32 29 3b 0a 20 20 20 20 69 66 28 20 7a 50 61  *2);.    if( zPa
1e950 74 68 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20  thname==0 ){.   
1e960 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
1e970 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 23 69  _NOMEM;.    }.#i
1e980 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1e990 54 5f 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69  T_MEMORYDB.    i
1e9a0 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e  f( strcmp(zFilen
1e9b0 61 6d 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d  ame,":memory:")=
1e9c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44  =0 ){.      memD
1e9d0 62 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 50 61  b = 1;.      zPa
1e9e0 74 68 6e 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20  thname[0] = 0;. 
1e9f0 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
1ea00 20 20 20 20 7b 0a 20 20 20 20 20 20 72 63 20 3d      {.      rc =
1ea10 20 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61   sqlite3OsFullPa
1ea20 74 68 6e 61 6d 65 28 70 56 66 73 2c 20 7a 46 69  thname(pVfs, zFi
1ea30 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
1ea40 65 2c 20 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, zPathname);. 
1ea50 20 20 20 7d 0a 0a 20 20 20 20 6e 50 61 74 68 6e     }..    nPathn
1ea60 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 53 74 72  ame = sqlite3Str
1ea70 6c 65 6e 33 30 28 7a 50 61 74 68 6e 61 6d 65 29  len30(zPathname)
1ea80 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1ea90 4c 49 54 45 5f 4f 4b 20 26 26 20 6e 50 61 74 68  LITE_OK && nPath
1eaa0 6e 61 6d 65 2b 38 3e 70 56 66 73 2d 3e 6d 78 50  name+8>pVfs->mxP
1eab0 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  athname ){.     
1eac0 20 2f 2a 20 54 68 69 73 20 62 72 61 6e 63 68 20   /* This branch 
1ead0 69 73 20 74 61 6b 65 6e 20 77 68 65 6e 20 74 68  is taken when th
1eae0 65 20 6a 6f 75 72 6e 61 6c 20 70 61 74 68 20 72  e journal path r
1eaf0 65 71 75 69 72 65 64 20 62 79 0a 20 20 20 20 20  equired by.     
1eb00 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
1eb10 20 62 65 69 6e 67 20 6f 70 65 6e 65 64 20 77 69   being opened wi
1eb20 6c 6c 20 62 65 20 6d 6f 72 65 20 74 68 61 6e 20  ll be more than 
1eb30 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65  pVfs->mxPathname
1eb40 0a 20 20 20 20 20 20 2a 2a 20 62 79 74 65 73 20  .      ** bytes 
1eb50 69 6e 20 6c 65 6e 67 74 68 2e 20 54 68 69 73 20  in length. This 
1eb60 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62 61  means the databa
1eb70 73 65 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65  se cannot be ope
1eb80 6e 65 64 2c 0a 20 20 20 20 20 20 2a 2a 20 61 73  ned,.      ** as
1eb90 20 69 74 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   it will not be 
1eba0 70 6f 73 73 69 62 6c 65 20 74 6f 20 6f 70 65 6e  possible to open
1ebb0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1ebc0 65 20 6f 72 20 65 76 65 6e 0a 20 20 20 20 20 20  e or even.      
1ebd0 2a 2a 20 63 68 65 63 6b 20 66 6f 72 20 61 20 68  ** check for a h
1ebe0 6f 74 2d 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72  ot-journal befor
1ebf0 65 20 72 65 61 64 69 6e 67 2e 0a 20 20 20 20 20  e reading..     
1ec00 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d 20 53   */.      rc = S
1ec10 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
1ec20 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1ec30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1ec40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
1ec50 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
1ec60 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1ec70 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 41     }.  }..  /* A
1ec80 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
1ec90 6f 72 20 74 68 65 20 50 61 67 65 72 20 73 74 72  or the Pager str
1eca0 75 63 74 75 72 65 2c 20 50 43 61 63 68 65 20 6f  ucture, PCache o
1ecb0 62 6a 65 63 74 2c 20 74 68 65 0a 20 20 2a 2a 20  bject, the.  ** 
1ecc0 74 68 72 65 65 20 66 69 6c 65 20 64 65 73 63 72  three file descr
1ecd0 69 70 74 6f 72 73 2c 20 74 68 65 20 64 61 74 61  iptors, the data
1ece0 62 61 73 65 20 66 69 6c 65 20 6e 61 6d 65 20 61  base file name a
1ecf0 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  nd the journal .
1ed00 20 20 2a 2a 20 66 69 6c 65 20 6e 61 6d 65 2e 20    ** file name. 
1ed10 54 68 65 20 6c 61 79 6f 75 74 20 69 6e 20 6d 65  The layout in me
1ed20 6d 6f 72 79 20 69 73 20 61 73 20 66 6f 6c 6c 6f  mory is as follo
1ed30 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
1ed40 20 20 50 61 67 65 72 20 6f 62 6a 65 63 74 20 20    Pager object  
1ed50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed60 20 20 28 73 69 7a 65 6f 66 28 50 61 67 65 72 29    (sizeof(Pager)
1ed70 20 62 79 74 65 73 29 0a 20 20 2a 2a 20 20 20 20   bytes).  **    
1ed80 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74 20 20   PCache object  
1ed90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eda0 20 28 73 71 6c 69 74 65 33 50 63 61 63 68 65 53   (sqlite3PcacheS
1edb0 69 7a 65 28 29 20 62 79 74 65 73 29 0a 20 20 2a  ize() bytes).  *
1edc0 2a 20 20 20 20 20 44 61 74 61 62 61 73 65 20 66  *     Database f
1edd0 69 6c 65 20 68 61 6e 64 6c 65 20 20 20 20 20 20  ile handle      
1ede0 20 20 20 20 20 20 28 70 56 66 73 2d 3e 73 7a 4f        (pVfs->szO
1edf0 73 46 69 6c 65 20 62 79 74 65 73 29 0a 20 20 2a  sFile bytes).  *
1ee00 2a 20 20 20 20 20 53 75 62 2d 6a 6f 75 72 6e 61  *     Sub-journa
1ee10 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20 20 20  l file handle   
1ee20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46 69        (journalFi
1ee30 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20 20  leSize bytes).  
1ee40 2a 2a 20 20 20 20 20 4d 61 69 6e 20 6a 6f 75 72  **     Main jour
1ee50 6e 61 6c 20 66 69 6c 65 20 68 61 6e 64 6c 65 20  nal file handle 
1ee60 20 20 20 20 20 20 20 28 6a 6f 75 72 6e 61 6c 46         (journalF
1ee70 69 6c 65 53 69 7a 65 20 62 79 74 65 73 29 0a 20  ileSize bytes). 
1ee80 20 2a 2a 20 20 20 20 20 44 61 74 61 62 61 73 65   **     Database
1ee90 20 66 69 6c 65 20 6e 61 6d 65 20 20 20 20 20 20   file name      
1eea0 20 20 20 20 20 20 20 20 28 6e 50 61 74 68 6e 61          (nPathna
1eeb0 6d 65 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2a  me+1 bytes).  **
1eec0 20 20 20 20 20 4a 6f 75 72 6e 61 6c 20 66 69 6c       Journal fil
1eed0 65 20 6e 61 6d 65 20 20 20 20 20 20 20 20 20 20  e name          
1eee0 20 20 20 20 20 28 6e 50 61 74 68 6e 61 6d 65 2b       (nPathname+
1eef0 38 2b 31 20 62 79 74 65 73 29 0a 20 20 2a 2f 0a  8+1 bytes).  */.
1ef00 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 73    pPtr = (u8 *)s
1ef10 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f  qlite3MallocZero
1ef20 28 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50  (.    sizeof(*pP
1ef30 61 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20  ager) +         
1ef40 20 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63    /* Pager struc
1ef50 74 75 72 65 20 2a 2f 0a 20 20 20 20 70 63 61 63  ture */.    pcac
1ef60 68 65 53 69 7a 65 20 20 20 20 20 20 2b 20 20 20  heSize      +   
1ef70 20 20 20 20 20 20 20 20 2f 2a 20 50 43 61 63 68          /* PCach
1ef80 65 20 6f 62 6a 65 63 74 20 2a 2f 0a 20 20 20 20  e object */.    
1ef90 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 20  pVfs->szOsFile  
1efa0 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  +           /* T
1efb0 68 65 20 6d 61 69 6e 20 64 62 20 66 69 6c 65 20  he main db file 
1efc0 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e 61 6c 46 69  */.    journalFi
1efd0 6c 65 53 69 7a 65 20 2a 20 32 20 2b 20 20 20 20  leSize * 2 +    
1efe0 20 20 20 2f 2a 20 54 68 65 20 74 77 6f 20 6a 6f     /* The two jo
1eff0 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a  urnal files */ .
1f000 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
1f010 31 20 2b 20 20 20 20 20 20 20 20 20 20 20 20 20  1 +             
1f020 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 2a 2f 0a  /* zFilename */.
1f030 20 20 20 20 6e 50 61 74 68 6e 61 6d 65 20 2b 20      nPathname + 
1f040 38 20 2b 20 31 20 20 20 20 20 20 20 20 20 20 20  8 + 1           
1f050 2f 2a 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  /* zJournal */. 
1f060 20 29 3b 0a 20 20 69 66 28 20 21 70 50 74 72 20   );.  if( !pPtr 
1f070 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1f080 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  ree(zPathname);.
1f090 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1f0a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 70  E_NOMEM;.  }.  p
1f0b0 50 61 67 65 72 20 3d 20 20 20 20 20 20 20 20 20  Pager =         
1f0c0 20 20 20 20 20 28 50 61 67 65 72 2a 29 28 70 50       (Pager*)(pP
1f0d0 74 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  tr);.  pPager->p
1f0e0 50 43 61 63 68 65 20 3d 20 20 20 20 28 50 43 61  PCache =    (PCa
1f0f0 63 68 65 2a 29 28 70 50 74 72 20 2b 3d 20 73 69  che*)(pPtr += si
1f100 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 29 3b 0a  zeof(*pPager));.
1f110 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20 20    pPager->fd =  
1f120 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f130 28 70 50 74 72 20 2b 3d 20 70 63 61 63 68 65 53  (pPtr += pcacheS
1f140 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
1f150 73 6a 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f  sjfd = (sqlite3_
1f160 66 69 6c 65 2a 29 28 70 50 74 72 20 2b 3d 20 70  file*)(pPtr += p
1f170 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
1f180 20 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20    pPager->jfd = 
1f190 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
1f1a0 28 70 50 74 72 20 2b 3d 20 6a 6f 75 72 6e 61 6c  (pPtr += journal
1f1b0 46 69 6c 65 53 69 7a 65 29 3b 0a 20 20 70 50 61  FileSize);.  pPa
1f1c0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
1f1d0 20 20 20 20 28 63 68 61 72 2a 29 28 70 50 74 72      (char*)(pPtr
1f1e0 20 2b 3d 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53   += journalFileS
1f1f0 69 7a 65 29 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c  ize);..  /* Fill
1f200 20 69 6e 20 74 68 65 20 50 61 67 65 72 2e 7a 46   in the Pager.zF
1f210 69 6c 65 6e 61 6d 65 20 61 6e 64 20 50 61 67 65  ilename and Page
1f220 72 2e 7a 4a 6f 75 72 6e 61 6c 20 62 75 66 66 65  r.zJournal buffe
1f230 72 73 2c 20 69 66 20 72 65 71 75 69 72 65 64 2e  rs, if required.
1f240 20 2a 2f 0a 20 20 69 66 28 20 7a 50 61 74 68 6e   */.  if( zPathn
1f250 61 6d 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ame ){.    pPage
1f260 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 20 20  r->zJournal =   
1f270 28 63 68 61 72 2a 29 28 70 50 74 72 20 2b 3d 20  (char*)(pPtr += 
1f280 6e 50 61 74 68 6e 61 6d 65 20 2b 20 31 29 3b 0a  nPathname + 1);.
1f290 20 20 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65      memcpy(pPage
1f2a0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 50  r->zFilename, zP
1f2b0 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61  athname, nPathna
1f2c0 6d 65 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  me);.    memcpy(
1f2d0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1f2e0 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61  , zPathname, nPa
1f2f0 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 6d 65 6d  thname);.    mem
1f300 63 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f  cpy(&pPager->zJo
1f310 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  urnal[nPathname]
1f320 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c 20 38 29  , "-journal", 8)
1f330 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1f340 65 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20  ee(zPathname);. 
1f350 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66   }.  pPager->pVf
1f360 73 20 3d 20 70 56 66 73 3b 0a 20 20 70 50 61 67  s = pVfs;.  pPag
1f370 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
1f380 66 73 46 6c 61 67 73 3b 0a 0a 20 20 2f 2a 20 4f  fsFlags;..  /* O
1f390 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
1f3a0 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
1f3b0 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
1f3c0 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d  ename[0] && !mem
1f3d0 44 62 20 29 7b 0a 20 20 20 20 69 6e 74 20 66 6f  Db ){.    int fo
1f3e0 75 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ut = 0;         
1f3f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 56 46             /* VF
1f400 53 20 66 6c 61 67 73 20 72 65 74 75 72 6e 65 64  S flags returned
1f410 20 62 79 20 78 4f 70 65 6e 28 29 20 2a 2f 0a 20   by xOpen() */. 
1f420 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
1f430 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
1f440 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
1f450 50 61 67 65 72 2d 3e 66 64 2c 20 76 66 73 46 6c  Pager->fd, vfsFl
1f460 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  ags, &fout);.   
1f470 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75   readOnly = (fou
1f480 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  t&SQLITE_OPEN_RE
1f490 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 2f 2a  ADONLY);..    /*
1f4a0 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61 73   If the file was
1f4b0 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f 70   successfully op
1f4c0 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77 72  ened for read/wr
1f4d0 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20 20  ite access,.    
1f4e0 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64 65 66 61  ** choose a defa
1f4f0 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 6e  ult page size in
1f500 20 63 61 73 65 20 77 65 20 68 61 76 65 20 74 6f   case we have to
1f510 20 63 72 65 61 74 65 20 74 68 65 0a 20 20 20 20   create the.    
1f520 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1f530 2e 20 54 68 65 20 64 65 66 61 75 6c 74 20 70 61  . The default pa
1f540 67 65 20 73 69 7a 65 20 69 73 20 74 68 65 20 6d  ge size is the m
1f550 61 78 69 6d 75 6d 20 6f 66 3a 0a 20 20 20 20 2a  aximum of:.    *
1f560 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51  *.    **    + SQ
1f570 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47  LITE_DEFAULT_PAG
1f580 45 5f 53 49 5a 45 2c 0a 20 20 20 20 2a 2a 20 20  E_SIZE,.    **  
1f590 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65    + The value re
1f5a0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
1f5b0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a  3OsSectorSize().
1f5c0 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20      **    + The 
1f5d0 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69 7a  largest page siz
1f5e0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77 72  e that can be wr
1f5f0 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79  itten atomically
1f600 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
1f610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
1f620 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20  & !readOnly ){. 
1f630 20 20 20 20 20 73 65 74 53 65 63 74 6f 72 53 69       setSectorSi
1f640 7a 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ze(pPager);.    
1f650 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
1f660 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
1f670 45 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45  E<=SQLITE_MAX_DE
1f680 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 29  FAULT_PAGE_SIZE)
1f690 3b 0a 20 20 20 20 20 20 69 66 28 20 73 7a 50 61  ;.      if( szPa
1f6a0 67 65 44 66 6c 74 3c 70 50 61 67 65 72 2d 3e 73  geDflt<pPager->s
1f6b0 65 63 74 6f 72 53 69 7a 65 20 29 7b 0a 20 20 20  ectorSize ){.   
1f6c0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1f6d0 3e 73 65 63 74 6f 72 53 69 7a 65 3e 53 51 4c 49  >sectorSize>SQLI
1f6e0 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
1f6f0 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20  AGE_SIZE ){.    
1f700 20 20 20 20 20 20 73 7a 50 61 67 65 44 66 6c 74        szPageDflt
1f710 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
1f720 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
1f730 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
1f740 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67 65            szPage
1f750 44 66 6c 74 20 3d 20 28 75 31 36 29 70 50 61 67  Dflt = (u16)pPag
1f760 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 3b 0a  er->sectorSize;.
1f770 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f780 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
1f790 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
1f7a0 49 54 45 0a 20 20 20 20 20 20 7b 0a 20 20 20 20  ITE.      {.    
1f7b0 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
1f7c0 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1f7d0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1f7e0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20 20  ger->fd);.      
1f7f0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
1f800 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f    assert(SQLITE_
1f810 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d  IOCAP_ATOMIC512=
1f820 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20  =(512>>8));.    
1f830 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
1f840 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
1f850 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
1f860 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 53          assert(S
1f870 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
1f880 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35  T_PAGE_SIZE<=655
1f890 33 36 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  36);.        for
1f8a0 28 69 69 3d 73 7a 50 61 67 65 44 66 6c 74 3b 20  (ii=szPageDflt; 
1f8b0 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 44  ii<=SQLITE_MAX_D
1f8c0 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45  EFAULT_PAGE_SIZE
1f8d0 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20 20  ; ii=ii*2){.    
1f8e0 20 20 20 20 20 20 69 66 28 20 69 44 63 26 28 53        if( iDc&(S
1f8f0 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d  QLITE_IOCAP_ATOM
1f900 49 43 7c 28 69 69 3e 3e 38 29 29 20 29 7b 0a 20  IC|(ii>>8)) ){. 
1f910 20 20 20 20 20 20 20 20 20 20 20 73 7a 50 61 67             szPag
1f920 65 44 66 6c 74 20 3d 20 69 69 3b 0a 20 20 20 20  eDflt = ii;.    
1f930 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f940 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
1f950 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
1f960 20 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70      /* If a temp
1f970 6f 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65  orary file is re
1f980 71 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e  quested, it is n
1f990 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69  ot opened immedi
1f9a0 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e  ately..    ** In
1f9b0 20 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63   this case we ac
1f9c0 63 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74  cept the default
1f9d0 20 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64   page size and d
1f9e0 65 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20  elay actually.  
1f9f0 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65    ** opening the
1fa00 20 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20   file until the 
1fa10 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73  first call to Os
1fa20 57 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2a 0a  Write()..    **.
1fa30 20 20 20 20 2a 2a 20 54 68 69 73 20 62 72 61 6e      ** This bran
1fa40 63 68 20 69 73 20 61 6c 73 6f 20 72 75 6e 20 66  ch is also run f
1fa50 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  or an in-memory 
1fa60 64 61 74 61 62 61 73 65 2e 20 41 6e 20 69 6e 2d  database. An in-
1fa70 6d 65 6d 6f 72 79 0a 20 20 20 20 2a 2a 20 64 61  memory.    ** da
1fa80 74 61 62 61 73 65 20 69 73 20 74 68 65 20 73 61  tabase is the sa
1fa90 6d 65 20 61 73 20 61 20 74 65 6d 70 2d 66 69 6c  me as a temp-fil
1faa0 65 20 74 68 61 74 20 69 73 20 6e 65 76 65 72 20  e that is never 
1fab0 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 0a 20  written out to. 
1fac0 20 20 20 2a 2a 20 64 69 73 6b 20 61 6e 64 20 75     ** disk and u
1fad0 73 65 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ses an in-memory
1fae0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1faf0 6c 2e 0a 20 20 20 20 2a 2f 20 0a 20 20 20 20 74  l..    */ .    t
1fb00 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
1fb10 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1fb20 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1fb30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
1fb40 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 74  following call t
1fb50 6f 20 50 61 67 65 72 53 65 74 50 61 67 65 73 69  o PagerSetPagesi
1fb60 7a 65 28 29 20 73 65 72 76 65 73 20 74 6f 20 73  ze() serves to s
1fb70 65 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  et the value of 
1fb80 0a 20 20 2a 2a 20 50 61 67 65 72 2e 70 61 67 65  .  ** Pager.page
1fb90 53 69 7a 65 20 61 6e 64 20 74 6f 20 61 6c 6c 6f  Size and to allo
1fba0 63 61 74 65 20 74 68 65 20 50 61 67 65 72 2e 70  cate the Pager.p
1fbb0 54 6d 70 53 70 61 63 65 20 62 75 66 66 65 72 2e  TmpSpace buffer.
1fbc0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
1fbd0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fbe0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1fbf0 3e 6d 65 6d 44 62 3d 3d 30 20 29 3b 0a 20 20 20  >memDb==0 );.   
1fc00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1fc10 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
1fc20 61 67 65 72 2c 20 26 73 7a 50 61 67 65 44 66 6c  ager, &szPageDfl
1fc30 74 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  t);.    testcase
1fc40 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1fc50 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
1fc60 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  an error occured
1fc70 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74 68   in either of th
1fc80 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c 20  e blocks above, 
1fc90 66 72 65 65 20 74 68 65 20 0a 20 20 2a 2a 20 50  free the .  ** P
1fca0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
1fcb0 6e 64 20 63 6c 6f 73 65 20 74 68 65 20 66 69 6c  nd close the fil
1fcc0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63  e..  */.  if( rc
1fcd0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1fce0 20 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67     assert( !pPag
1fcf0 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 29 3b  er->pTmpSpace );
1fd00 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
1fd10 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ose(pPager->fd);
1fd20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1fd30 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
1fd40 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
1fd50 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1fd60 68 65 20 50 43 61 63 68 65 20 6f 62 6a 65 63 74  he PCache object
1fd70 2e 20 2a 2f 0a 20 20 6e 45 78 74 72 61 20 3d 20  . */.  nExtra = 
1fd80 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
1fd90 6e 45 78 74 72 61 29 3b 0a 20 20 73 71 6c 69 74  nExtra);.  sqlit
1fda0 65 33 50 63 61 63 68 65 4f 70 65 6e 28 73 7a 50  e3PcacheOpen(szP
1fdb0 61 67 65 44 66 6c 74 2c 20 6e 45 78 74 72 61 2c  ageDflt, nExtra,
1fdc0 20 21 6d 65 6d 44 62 2c 0a 20 20 20 20 20 20 20   !memDb,.       
1fdd0 20 20 20 20 20 20 20 20 20 20 20 20 20 21 6d 65               !me
1fde0 6d 44 62 3f 70 61 67 65 72 53 74 72 65 73 73 3a  mDb?pagerStress:
1fdf0 30 2c 20 28 76 6f 69 64 20 2a 29 70 50 61 67 65  0, (void *)pPage
1fe00 72 2c 20 70 50 61 67 65 72 2d 3e 70 50 43 61 63  r, pPager->pPCac
1fe10 68 65 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41  he);..  PAGERTRA
1fe20 43 45 28 28 22 4f 50 45 4e 20 25 64 20 25 73 5c  CE(("OPEN %d %s\
1fe30 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44  n", FILEHANDLEID
1fe40 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50  (pPager->fd), pP
1fe50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29  ager->zFilename)
1fe60 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f  );.  IOTRACE(("O
1fe70 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50  PEN %p %s\n", pP
1fe80 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ager, pPager->zF
1fe90 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 70 50 61  ilename))..  pPa
1fea0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
1feb0 3d 20 28 75 38 29 75 73 65 4a 6f 75 72 6e 61 6c  = (u8)useJournal
1fec0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65  ;.  pPager->noRe
1fed0 61 64 6c 6f 63 6b 20 3d 20 28 6e 6f 52 65 61 64  adlock = (noRead
1fee0 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
1fef0 29 20 3f 31 3a 30 3b 0a 20 20 2f 2a 20 70 50 61  ) ?1:0;.  /* pPa
1ff00 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
1ff10 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
1ff20 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
1ff30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
1ff40 2d 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20  ->nRef = 0; */. 
1ff50 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 56   pPager->dbSizeV
1ff60 61 6c 69 64 20 3d 20 28 75 38 29 6d 65 6d 44 62  alid = (u8)memDb
1ff70 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
1ff80 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a  tmtSize = 0; */.
1ff90 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
1ffa0 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f 0a 20  tJSize = 0; */. 
1ffb0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50 61 67   /* pPager->nPag
1ffc0 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  e = 0; */.  pPag
1ffd0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
1ffe0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
1fff0 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
20000 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
20010 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65  NLOCK; */.  asse
20020 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
20030 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f  e == (tempFile ?
20040 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
20050 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29   : PAGER_UNLOCK)
20060 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
20070 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
20080 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
20090 69 6c 65 20 3d 20 28 75 38 29 74 65 6d 70 46 69  ile = (u8)tempFi
200a0 6c 65 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65  le;.  assert( te
200b0 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f  mpFile==PAGER_LO
200c0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
200d0 20 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74   .          || t
200e0 65 6d 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c  empFile==PAGER_L
200f0 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55  OCKINGMODE_EXCLU
20100 53 49 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74  SIVE );.  assert
20110 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ( PAGER_LOCKINGM
20120 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31  ODE_EXCLUSIVE==1
20130 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   );.  pPager->ex
20140 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 28 75  clusiveMode = (u
20150 38 29 74 65 6d 70 46 69 6c 65 3b 20 0a 20 20 70  8)tempFile; .  p
20160 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
20170 6e 74 44 6f 6e 65 20 3d 20 70 50 61 67 65 72 2d  ntDone = pPager-
20180 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
20190 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 28 75 38  ger->memDb = (u8
201a0 29 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  )memDb;.  pPager
201b0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 28 75 38  ->readOnly = (u8
201c0 29 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20  )readOnly;.  /* 
201d0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
201e0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
201f0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 28 70 50 61  r->noSync = (pPa
20200 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
20210 20 21 75 73 65 4a 6f 75 72 6e 61 6c 29 20 3f 31   !useJournal) ?1
20220 3a 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  :0;.  pPager->fu
20230 6c 6c 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d  llSync = pPager-
20240 3e 6e 6f 53 79 6e 63 20 3f 30 3a 31 3b 0a 20 20  >noSync ?0:1;.  
20250 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
20260 67 73 20 3d 20 53 51 4c 49 54 45 5f 53 59 4e 43  gs = SQLITE_SYNC
20270 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50  _NORMAL;.  /* pP
20280 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30  ager->pFirst = 0
20290 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
202a0 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
202b0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
202c0 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 20 2a  er->pLast = 0; *
202d0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  /.  pPager->nExt
202e0 72 61 20 3d 20 6e 45 78 74 72 61 3b 0a 20 20 70  ra = nExtra;.  p
202f0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 69  Pager->journalSi
20300 7a 65 4c 69 6d 69 74 20 3d 20 53 51 4c 49 54 45  zeLimit = SQLITE
20310 5f 44 45 46 41 55 4c 54 5f 4a 4f 55 52 4e 41 4c  _DEFAULT_JOURNAL
20320 5f 53 49 5a 45 5f 4c 49 4d 49 54 3b 0a 20 20 61  _SIZE_LIMIT;.  a
20330 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70 50  ssert( isOpen(pP
20340 61 67 65 72 2d 3e 66 64 29 20 7c 7c 20 74 65 6d  ager->fd) || tem
20350 70 46 69 6c 65 20 29 3b 0a 20 20 73 65 74 53 65  pFile );.  setSe
20360 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
20370 3b 0a 20 20 69 66 28 20 6d 65 6d 44 62 20 29 7b  ;.  if( memDb ){
20380 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
20390 72 6e 61 6c 4d 6f 64 65 20 3d 20 50 41 47 45 52  rnalMode = PAGER
203a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4d 45 4d  _JOURNALMODE_MEM
203b0 4f 52 59 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  ORY;.  }.  /* pP
203c0 61 67 65 72 2d 3e 78 42 75 73 79 48 61 6e 64 6c  ager->xBusyHandl
203d0 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
203e0 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
203f0 64 6c 65 72 41 72 67 20 3d 20 30 3b 20 2a 2f 0a  dlerArg = 0; */.
20400 20 20 2f 2a 20 6d 65 6d 73 65 74 28 70 50 61 67    /* memset(pPag
20410 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
20420 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
20430 73 68 29 29 3b 20 2a 2f 0a 20 20 2a 70 70 50 61  sh)); */.  *ppPa
20440 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
20450 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
20460 3b 0a 7d 0a 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  ;.}..../*.** Thi
20470 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
20480 6c 6c 65 64 20 61 66 74 65 72 20 74 72 61 6e 73  lled after trans
20490 69 74 69 6f 6e 69 6e 67 20 66 72 6f 6d 20 50 41  itioning from PA
204a0 47 45 52 5f 55 4e 4c 4f 43 4b 20 74 6f 0a 2a 2a  GER_UNLOCK to.**
204b0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 73 74   PAGER_SHARED st
204c0 61 74 65 2e 20 49 74 20 74 65 73 74 73 20 69 66  ate. It tests if
204d0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
204e0 6a 6f 75 72 6e 61 6c 20 70 72 65 73 65 6e 74 20  journal present 
204f0 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6c 65 2d 73  in.** the file-s
20500 79 73 74 65 6d 20 66 6f 72 20 74 68 65 20 67 69  ystem for the gi
20510 76 65 6e 20 70 61 67 65 72 2e 20 41 20 68 6f 74  ven pager. A hot
20520 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20   journal is one 
20530 74 68 61 74 20 0a 2a 2a 20 6e 65 65 64 73 20 74  that .** needs t
20540 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
20550 2e 20 41 63 63 6f 72 64 69 6e 67 20 74 6f 20 74  . According to t
20560 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20  his function, a 
20570 68 6f 74 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  hot-journal.** f
20580 69 6c 65 20 65 78 69 73 74 73 20 69 66 20 74 68  ile exists if th
20590 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 72 65  e following thre
205a0 65 20 63 72 69 74 65 72 69 61 20 61 72 65 20 6d  e criteria are m
205b0 65 74 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68  et:.**.**   * Th
205c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  e journal file e
205d0 78 69 73 74 73 20 69 6e 20 74 68 65 20 66 69 6c  xists in the fil
205e0 65 20 73 79 73 74 65 6d 2c 20 61 6e 64 0a 2a 2a  e system, and.**
205f0 20 20 20 2a 20 4e 6f 20 70 72 6f 63 65 73 73 20     * No process 
20600 68 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44  holds a RESERVED
20610 20 6f 72 20 67 72 65 61 74 65 72 20 6c 6f 63 6b   or greater lock
20620 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
20630 20 66 69 6c 65 2c 20 61 6e 64 0a 2a 2a 20 20 20   file, and.**   
20640 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 66  * The database f
20650 69 6c 65 20 69 74 73 65 6c 66 20 69 73 20 67 72  ile itself is gr
20660 65 61 74 65 72 20 74 68 61 6e 20 30 20 62 79 74  eater than 0 byt
20670 65 73 20 69 6e 20 73 69 7a 65 2e 0a 2a 2a 0a 2a  es in size..**.*
20680 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e 74  * If the current
20690 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74   size of the dat
206a0 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30 20  abase file is 0 
206b0 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  but a journal fi
206c0 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74 68  le.** exists, th
206d0 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20 61  at is probably a
206e0 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c 65  n old journal le
206f0 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20 70  ft over from a p
20700 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73 65  rior.** database
20710 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 6e   with the same n
20720 61 6d 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ame. In this cas
20730 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  e the journal fi
20740 6c 65 20 69 73 0a 2a 2a 20 6a 75 73 74 20 64 65  le is.** just de
20750 6c 65 74 65 64 20 75 73 69 6e 67 20 4f 73 44 65  leted using OsDe
20760 6c 65 74 65 2c 20 2a 70 45 78 69 73 74 73 20 69  lete, *pExists i
20770 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53  s set to 0 and S
20780 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72  QLITE_OK.** is r
20790 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  eturned..**.** T
207a0 68 69 73 20 72 6f 75 74 69 6e 65 20 64 6f 65 73  his routine does
207b0 20 6e 6f 74 20 6f 70 65 6e 20 74 68 65 20 6a 6f   not open the jo
207c0 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20 65 78  urnal file to ex
207d0 61 6d 69 6e 65 20 69 74 73 0a 2a 2a 20 63 6f 6e  amine its.** con
207e0 74 65 6e 74 2e 20 20 48 65 6e 63 65 2c 20 74 68  tent.  Hence, th
207f0 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20  e journal might 
20800 63 6f 6e 74 61 69 6e 20 74 68 65 20 6e 61 6d 65  contain the name
20810 20 6f 66 20 61 20 6d 61 73 74 65 72 0a 2a 2a 20   of a master.** 
20820 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
20830 74 20 68 61 73 20 62 65 65 6e 20 64 65 6c 65 74  t has been delet
20840 65 64 2c 20 61 6e 64 20 68 65 6e 63 65 20 6e 6f  ed, and hence no
20850 74 20 62 65 20 68 6f 74 2e 20 20 4f 72 0a 2a 2a  t be hot.  Or.**
20860 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74   the header of t
20870 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74  he journal might
20880 20 62 65 20 7a 65 72 6f 65 64 20 6f 75 74 2e 20   be zeroed out. 
20890 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   This routine.**
208a0 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 63 6f 76   does not discov
208b0 65 72 20 74 68 65 73 65 20 63 61 73 65 73 20 6f  er these cases o
208c0 66 20 61 20 6e 6f 6e 2d 68 6f 74 20 6a 6f 75 72  f a non-hot jour
208d0 6e 61 6c 20 2d 20 69 66 20 74 68 65 0a 2a 2a 20  nal - if the.** 
208e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
208f0 73 74 73 20 61 6e 64 20 69 73 20 6e 6f 74 20 65  sts and is not e
20900 6d 70 74 79 20 74 68 69 73 20 72 6f 75 74 69 6e  mpty this routin
20910 65 20 61 73 73 75 6d 65 73 20 69 74 0a 2a 2a 20  e assumes it.** 
20920 69 73 20 68 6f 74 2e 20 20 54 68 65 20 70 61 67  is hot.  The pag
20930 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 20 72 6f  er_playback() ro
20940 75 74 69 6e 65 20 77 69 6c 6c 20 64 69 73 63 6f  utine will disco
20950 76 65 72 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  ver that the.** 
20960 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
20970 6e 6f 74 20 72 65 61 6c 6c 79 20 68 6f 74 20 61  not really hot a
20980 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f 70 2e 0a 2a  nd will no-op..*
20990 2a 0a 2a 2a 20 49 66 20 61 20 68 6f 74 2d 6a 6f  *.** If a hot-jo
209a0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 66 6f  urnal file is fo
209b0 75 6e 64 20 74 6f 20 65 78 69 73 74 2c 20 2a 70  und to exist, *p
209c0 45 78 69 73 74 73 20 69 73 20 73 65 74 20 74 6f  Exists is set to
209d0 20 31 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54   1 and .** SQLIT
209e0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 49  E_OK returned. I
209f0 66 20 6e 6f 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  f no hot-journal
20a00 20 66 69 6c 65 20 69 73 20 70 72 65 73 65 6e 74   file is present
20a10 2c 20 2a 70 45 78 69 73 74 73 20 69 73 0a 2a 2a  , *pExists is.**
20a20 20 73 65 74 20 74 6f 20 30 20 61 6e 64 20 53 51   set to 0 and SQ
20a30 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
20a40 2e 20 49 66 20 61 6e 20 49 4f 20 65 72 72 6f 72  . If an IO error
20a50 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 72   occurs while tr
20a60 79 69 6e 67 0a 2a 2a 20 74 6f 20 64 65 74 65 72  ying.** to deter
20a70 6d 69 6e 65 20 77 68 65 74 68 65 72 20 6f 72 20  mine whether or 
20a80 6e 6f 74 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  not a hot-journa
20a90 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 74  l file exists, t
20aa0 68 65 20 49 4f 20 65 72 72 6f 72 0a 2a 2a 20 63  he IO error.** c
20ab0 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
20ac0 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
20ad0 20 2a 70 45 78 69 73 74 73 20 69 73 20 75 6e 64   *pExists is und
20ae0 65 66 69 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  efined..*/.stati
20af0 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
20b00 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
20b10 72 2c 20 69 6e 74 20 2a 70 45 78 69 73 74 73 29  r, int *pExists)
20b20 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
20b30 2a 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70  * const pVfs = p
20b40 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69  Pager->pVfs;.  i
20b50 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
20b60 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
20b70 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
20b80 20 69 6e 74 20 65 78 69 73 74 73 20 3d 20 30 3b   int exists = 0;
20b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
20ba0 2a 20 54 72 75 65 20 69 66 20 61 20 6a 6f 75 72  * True if a jour
20bb0 6e 61 6c 20 66 69 6c 65 20 69 73 20 70 72 65 73  nal file is pres
20bc0 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 6c 6f 63  ent */.  int loc
20bd0 6b 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ked = 0;        
20be0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
20bf0 66 20 73 6f 6d 65 20 70 72 6f 63 65 73 73 20 68  f some process h
20c00 6f 6c 64 73 20 61 20 52 45 53 45 52 56 45 44 20  olds a RESERVED 
20c10 6c 6f 63 6b 20 2a 2f 0a 0a 20 20 61 73 73 65 72  lock */..  asser
20c20 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
20c30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
20c40 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
20c50 20 20 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e    assert( isOpen
20c60 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 3b 0a  (pPager->fd) );.
20c70 0a 20 20 2a 70 45 78 69 73 74 73 20 3d 20 30 3b  .  *pExists = 0;
20c80 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
20c90 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 70 50  sAccess(pVfs, pP
20ca0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
20cb0 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
20cc0 49 53 54 53 2c 20 26 65 78 69 73 74 73 29 3b 0a  ISTS, &exists);.
20cd0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
20ce0 5f 4f 4b 20 26 26 20 65 78 69 73 74 73 20 29 7b  _OK && exists ){
20cf0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
20d00 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64  3OsCheckReserved
20d10 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
20d20 20 26 6c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 69   &locked);.    i
20d30 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20d40 20 26 26 20 21 6c 6f 63 6b 65 64 20 29 7b 0a 20   && !locked ){. 
20d50 20 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 0a       int nPage;.
20d60 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20d70 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
20d80 28 70 50 61 67 65 72 2c 20 26 6e 50 61 67 65 29  (pPager, &nPage)
20d90 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
20da0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20db0 20 20 20 20 69 66 28 20 6e 50 61 67 65 3d 3d 30      if( nPage==0
20dc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
20dd0 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
20de0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
20df0 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
20e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
20e10 20 20 20 2a 70 45 78 69 73 74 73 20 3d 20 31 3b     *pExists = 1;
20e20 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20e30 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
20e40 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
20e50 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74  ** Read the cont
20e60 65 6e 74 20 66 6f 72 20 70 61 67 65 20 70 50 67  ent for page pPg
20e70 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74 61   out of the data
20e80 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 69 6e  base file and in
20e90 74 6f 20 0a 2a 2a 20 70 50 67 2d 3e 70 44 61 74  to .** pPg->pDat
20ea0 61 2e 20 41 20 73 68 61 72 65 64 20 6c 6f 63 6b  a. A shared lock
20eb0 20 6f 72 20 67 72 65 61 74 65 72 20 6d 75 73 74   or greater must
20ec0 20 62 65 20 68 65 6c 64 20 6f 6e 20 74 68 65 20   be held on the 
20ed0 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65  database.** file
20ee0 20 62 65 66 6f 72 65 20 74 68 69 73 20 66 75 6e   before this fun
20ef0 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2e  ction is called.
20f00 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 67 65 20 31  .**.** If page 1
20f10 20 69 73 20 72 65 61 64 2c 20 74 68 65 6e 20 74   is read, then t
20f20 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
20f30 72 2e 64 62 46 69 6c 65 56 65 72 73 5b 5d 20 69  r.dbFileVers[] i
20f40 73 20 73 65 74 20 74 6f 0a 2a 2a 20 74 68 65 20  s set to.** the 
20f50 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
20f60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
20f70 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  e..**.** If an I
20f80 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20  O error occurs, 
20f90 74 68 65 6e 20 74 68 65 20 49 4f 20 65 72 72 6f  then the IO erro
20fa0 72 20 69 73 20 72 65 74 75 72 6e 65 64 20 74 6f  r is returned to
20fb0 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 20   the caller..** 
20fc0 4f 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54  Otherwise, SQLIT
20fd0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
20fe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
20ff0 72 65 61 64 44 62 50 61 67 65 28 50 67 48 64 72  readDbPage(PgHdr
21000 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
21010 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
21020 50 61 67 65 72 3b 20 2f 2a 20 50 61 67 65 72 20  Pager; /* Pager 
21030 6f 62 6a 65 63 74 20 61 73 73 6f 63 69 61 74 65  object associate
21040 64 20 77 69 74 68 20 70 61 67 65 20 70 50 67 20  d with page pPg 
21050 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  */.  Pgno pgno =
21060 20 70 50 67 2d 3e 70 67 6e 6f 3b 20 20 20 20 20   pPg->pgno;     
21070 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72    /* Page number
21080 20 74 6f 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e   to read */.  in
21090 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
210a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
210b0 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 69  turn code */.  i
210c0 36 34 20 69 4f 66 66 73 65 74 3b 20 20 20 20 20  64 iOffset;     
210d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42              /* B
210e0 79 74 65 20 6f 66 66 73 65 74 20 6f 66 20 66 69  yte offset of fi
210f0 6c 65 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 20  le to read from 
21100 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  */..  assert( pP
21110 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
21120 45 52 5f 53 48 41 52 45 44 20 26 26 20 21 4d 45  ER_SHARED && !ME
21130 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 21 69  MDB );..  if( !i
21140 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
21150 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ) ){.    assert(
21160 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
21170 65 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  e );.    return 
21180 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
21190 52 54 5f 52 45 41 44 3b 0a 20 20 7d 0a 20 20 69  RT_READ;.  }.  i
211a0 4f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31  Offset = (pgno-1
211b0 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
211c0 61 67 65 53 69 7a 65 3b 0a 20 20 72 63 20 3d 20  ageSize;.  rc = 
211d0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
211e0 61 67 65 72 2d 3e 66 64 2c 20 70 50 67 2d 3e 70  ager->fd, pPg->p
211f0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
21200 67 65 53 69 7a 65 2c 20 69 4f 66 66 73 65 74 29  geSize, iOffset)
21210 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ;.  if( pgno==1 
21220 29 7b 0a 20 20 20 20 75 38 20 2a 64 62 46 69 6c  ){.    u8 *dbFil
21230 65 56 65 72 73 20 3d 20 26 28 28 75 38 2a 29 70  eVers = &((u8*)p
21240 50 67 2d 3e 70 44 61 74 61 29 5b 32 34 5d 3b 0a  Pg->pData)[24];.
21250 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
21260 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
21270 64 62 46 69 6c 65 56 65 72 73 2c 20 73 69 7a 65  dbFileVers, size
21280 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
21290 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a 20 20 43  eVers));.  }.  C
212a0 4f 44 45 43 31 28 70 50 61 67 65 72 2c 20 70 50  ODEC1(pPager, pP
212b0 67 2d 3e 70 44 61 74 61 2c 20 70 67 6e 6f 2c 20  g->pData, pgno, 
212c0 33 29 3b 0a 0a 20 20 50 41 47 45 52 5f 49 4e 43  3);..  PAGER_INC
212d0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
212e0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
212f0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
21300 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
21310 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
21320 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
21330 67 6e 6f 29 29 3b 0a 20 20 50 41 47 45 52 54 52  gno));.  PAGERTR
21340 41 43 45 28 28 22 46 45 54 43 48 20 25 64 20 70  ACE(("FETCH %d p
21350 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
21360 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
21370 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
21380 67 65 72 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65  ger), pgno, page
21390 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29  r_pagehash(pPg))
213a0 29 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  );..  return rc;
213b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
213c0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
213d0 64 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 75  d whenever the u
213e0 70 70 65 72 20 6c 61 79 65 72 20 72 65 71 75 65  pper layer reque
213f0 73 74 73 20 61 20 64 61 74 61 62 61 73 65 0a 2a  sts a database.*
21400 2a 20 70 61 67 65 20 69 73 20 72 65 71 75 65 73  * page is reques
21410 74 65 64 2c 20 62 65 66 6f 72 65 20 74 68 65 20  ted, before the 
21420 63 61 63 68 65 20 69 73 20 63 68 65 63 6b 65 64  cache is checked
21430 20 66 6f 72 20 61 20 73 75 69 74 61 62 6c 65 20   for a suitable 
21440 70 61 67 65 0a 2a 2a 20 6f 72 20 61 6e 79 20 64  page.** or any d
21450 61 74 61 20 69 73 20 72 65 61 64 20 66 72 6f 6d  ata is read from
21460 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 49   the database. I
21470 74 20 70 65 72 66 6f 72 6d 73 20 74 68 65 20 66  t performs the f
21480 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 74 77 6f 20  ollowing.** two 
21490 66 75 6e 63 74 69 6f 6e 73 3a 0a 2a 2a 0a 2a 2a  functions:.**.**
214a0 20 20 20 31 29 20 49 66 20 74 68 65 20 70 61 67     1) If the pag
214b0 65 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  er is currently 
214c0 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  in PAGER_UNLOCK 
214d0 73 74 61 74 65 20 28 6e 6f 20 6c 6f 63 6b 20 68  state (no lock h
214e0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 6f 6e 20 74  eld.**      on t
214f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21500 29 2c 20 74 68 65 6e 20 61 6e 20 61 74 74 65 6d  ), then an attem
21510 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20 6f 62  pt is made to ob
21520 74 61 69 6e 20 61 0a 2a 2a 20 20 20 20 20 20 53  tain a.**      S
21530 48 41 52 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  HARED lock on th
21540 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
21550 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74   Immediately aft
21560 65 72 20 6f 62 74 61 69 6e 69 6e 67 0a 2a 2a 20  er obtaining.** 
21570 20 20 20 20 20 74 68 65 20 53 48 41 52 45 44 20       the SHARED 
21580 6c 6f 63 6b 2c 20 74 68 65 20 66 69 6c 65 2d 73  lock, the file-s
21590 79 73 74 65 6d 20 69 73 20 63 68 65 63 6b 65 64  ystem is checked
215a0 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e   for a hot-journ
215b0 61 6c 2c 0a 2a 2a 20 20 20 20 20 20 77 68 69 63  al,.**      whic
215c0 68 20 69 73 20 70 6c 61 79 65 64 20 62 61 63 6b  h is played back
215d0 20 69 66 20 70 72 65 73 65 6e 74 2e 20 46 6f 6c   if present. Fol
215e0 6c 6f 77 69 6e 67 20 61 6e 79 20 68 6f 74 2d 6a  lowing any hot-j
215f0 6f 75 72 6e 61 6c 20 0a 2a 2a 20 20 20 20 20 20  ournal .**      
21600 72 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 20 63 6f  rollback, the co
21610 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 63 61  ntents of the ca
21620 63 68 65 20 61 72 65 20 76 61 6c 69 64 61 74 65  che are validate
21630 64 20 62 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a  d by checking.**
21640 20 20 20 20 20 20 74 68 65 20 27 63 68 61 6e 67        the 'chang
21650 65 2d 63 6f 75 6e 74 65 72 27 20 66 69 65 6c 64  e-counter' field
21660 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
21670 20 66 69 6c 65 20 68 65 61 64 65 72 20 61 6e 64   file header and
21680 0a 2a 2a 20 20 20 20 20 20 64 69 73 63 61 72 64  .**      discard
21690 65 64 20 69 66 20 74 68 65 79 20 61 72 65 20 66  ed if they are f
216a0 6f 75 6e 64 20 74 6f 20 62 65 20 69 6e 76 61 6c  ound to be inval
216b0 69 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 29 20 49  id..**.**   2) I
216c0 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 72  f the pager is r
216d0 75 6e 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73  unning in exclus
216e0 69 76 65 2d 6d 6f 64 65 2c 20 61 6e 64 20 74 68  ive-mode, and th
216f0 65 72 65 20 61 72 65 20 63 75 72 72 65 6e 74 6c  ere are currentl
21700 79 0a 2a 2a 20 20 20 20 20 20 6e 6f 20 6f 75 74  y.**      no out
21710 73 74 61 6e 64 69 6e 67 20 72 65 66 65 72 65 6e  standing referen
21720 63 65 73 20 74 6f 20 61 6e 79 20 70 61 67 65 73  ces to any pages
21730 2c 20 61 6e 64 20 69 73 20 69 6e 20 74 68 65 20  , and is in the 
21740 65 72 72 6f 72 20 73 74 61 74 65 2c 0a 2a 2a 20  error state,.** 
21750 20 20 20 20 20 74 68 65 6e 20 61 6e 20 61 74 74       then an att
21760 65 6d 70 74 20 69 73 20 6d 61 64 65 20 74 6f 20  empt is made to 
21770 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72 20  clear the error 
21780 73 74 61 74 65 20 62 79 20 64 69 73 63 61 72 64  state by discard
21790 69 6e 67 0a 2a 2a 20 20 20 20 20 20 74 68 65 20  ing.**      the 
217a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
217b0 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 72  page cache and r
217c0 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 61 6e 79 20  olling back any 
217d0 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  open journal.** 
217e0 20 20 20 20 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a       file..**.**
217f0 20 49 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f   If the operatio
21800 6e 20 64 65 73 63 72 69 62 65 64 20 62 79 20 28  n described by (
21810 32 29 20 61 62 6f 76 65 20 69 73 20 6e 6f 74 20  2) above is not 
21820 61 74 74 65 6d 70 74 65 64 2c 20 61 6e 64 20 69  attempted, and i
21830 66 20 74 68 65 0a 2a 2a 20 70 61 67 65 72 20 69  f the.** pager i
21840 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73 74  s in an error st
21850 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e 20 53  ate other than S
21860 51 4c 49 54 45 5f 46 55 4c 4c 20 77 68 65 6e 20  QLITE_FULL when 
21870 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2c 0a  this is called,.
21880 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ** the error sta
21890 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
218a0 20 72 65 74 75 72 6e 65 64 2e 20 49 74 20 69 73   returned. It is
218b0 20 70 65 72 6d 69 74 74 65 64 20 74 6f 20 72 65   permitted to re
218c0 61 64 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  ad the.** databa
218d0 73 65 20 77 68 65 6e 20 69 6e 20 53 51 4c 49 54  se when in SQLIT
218e0 45 5f 46 55 4c 4c 20 65 72 72 6f 72 20 73 74 61  E_FULL error sta
218f0 74 65 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77  te..**.** Otherw
21900 69 73 65 2c 20 69 66 20 65 76 65 72 79 74 68 69  ise, if everythi
21910 6e 67 20 69 73 20 73 75 63 63 65 73 73 66 75 6c  ng is successful
21920 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  , SQLITE_OK is r
21930 65 74 75 72 6e 65 64 2e 20 49 66 20 61 6e 0a 2a  eturned. If an.*
21940 2a 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72  * IO error occur
21950 73 20 77 68 69 6c 65 20 6c 6f 63 6b 69 6e 67 20  s while locking 
21960 74 68 65 20 64 61 74 61 62 61 73 65 2c 20 63 68  the database, ch
21970 65 63 6b 69 6e 67 20 66 6f 72 20 61 20 68 6f 74  ecking for a hot
21980 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65  -journal.** file
21990 20 6f 72 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b   or rolling back
219a0 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c   a journal file,
219b0 20 74 68 65 20 49 4f 20 65 72 72 6f 72 20 63 6f   the IO error co
219c0 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
219d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
219e0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61  gerSharedLock(Pa
219f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
21a00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21a10 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
21a20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
21a30 65 20 2a 2f 0a 20 20 69 6e 74 20 69 73 45 72 72  e */.  int isErr
21a40 6f 72 52 65 73 65 74 20 3d 20 30 3b 20 20 20 20  orReset = 0;    
21a50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
21a60 65 20 69 66 20 72 65 63 6f 76 65 72 69 6e 67 20  e if recovering 
21a70 66 72 6f 6d 20 65 72 72 6f 72 20 73 74 61 74 65  from error state
21a80 20 2a 2f 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   */..  /* If thi
21a90 73 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70  s database is op
21aa0 65 6e 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69  ened for exclusi
21ab0 76 65 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e  ve access, has n
21ac0 6f 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20  o outstanding . 
21ad0 20 2a 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e   ** page referen
21ae0 63 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e  ces and is in an
21af0 20 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 74 68   error-state, th
21b00 69 73 20 69 73 20 61 20 63 68 61 6e 63 65 20 74  is is a chance t
21b10 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65  o clear.  ** the
21b20 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20   error. Discard 
21b30 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
21b40 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
21b50 61 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20  and treat any.  
21b60 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  ** open journal 
21b70 66 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f  file as a hot-jo
21b80 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  urnal..  */.  if
21b90 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
21ba0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
21bb0 65 20 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33  e .   && sqlite3
21bc0 50 63 61 63 68 65 52 65 66 43 6f 75 6e 74 28 70  PcacheRefCount(p
21bd0 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3d  Pager->pPCache)=
21be0 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  =0 && pPager->er
21bf0 72 43 6f 64 65 20 0a 20 20 29 7b 0a 20 20 20 20  rCode .  ){.    
21c00 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65  if( isOpen(pPage
21c10 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
21c20 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 3d 20   isErrorReset = 
21c30 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
21c40 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53  ger->errCode = S
21c50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 70 61  QLITE_OK;.    pa
21c60 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
21c70 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  );.  }..  /* If 
21c80 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74 69  the pager is sti
21c90 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20 73  ll in an error s
21ca0 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72 6f  tate, do not pro
21cb0 63 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72 20  ceed. The error 
21cc0 0a 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c 6c  .  ** state will
21cd0 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 73   be cleared at s
21ce0 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68 65  ome point in the
21cf0 20 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c 6c   future when all
21d00 20 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66 65   page .  ** refe
21d10 72 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70 70  rences are dropp
21d20 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68 65  ed and the cache
21d30 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64 65   can be discarde
21d40 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
21d50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
21d60 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
21d70 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
21d80 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
21d90 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
21da0 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
21db0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
21dc0 4f 43 4b 20 7c 7c 20 69 73 45 72 72 6f 72 52 65  OCK || isErrorRe
21dd0 73 65 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  set ){.    sqlit
21de0 65 33 5f 76 66 73 20 2a 20 63 6f 6e 73 74 20 70  e3_vfs * const p
21df0 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
21e00 66 73 3b 0a 20 20 20 20 69 6e 74 20 69 73 48 6f  fs;.    int isHo
21e10 74 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  tJournal = 0;.  
21e20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
21e30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
21e40 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
21e50 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
21e60 43 61 63 68 65 29 3d 3d 30 20 29 3b 0a 20 20 20  Cache)==0 );.   
21e70 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
21e80 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20  Readlock ){.    
21e90 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
21ea0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
21eb0 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
21ec0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
21ed0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21ee0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21ef0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
21f00 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20  UNLOCK );.      
21f10 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65    return pager_e
21f20 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
21f30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
21f40 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e  lse if( pPager->
21f50 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
21f60 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61  OCK ){.      pPa
21f70 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
21f80 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 7d  ER_SHARED;.    }
21f90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
21fa0 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52  ger->state>=SHAR
21fb0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 20 20  ED_LOCK );..    
21fc0 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
21fd0 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
21fe0 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
21ff0 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
22000 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
22010 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
22020 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
22030 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
22040 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
22050 2f 0a 20 20 20 20 69 66 28 20 21 69 73 45 72 72  /.    if( !isErr
22060 6f 72 52 65 73 65 74 20 29 7b 0a 20 20 20 20 20  orReset ){.     
22070 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72   rc = hasHotJour
22080 6e 61 6c 28 70 50 61 67 65 72 2c 20 26 69 73 48  nal(pPager, &isH
22090 6f 74 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  otJournal);.    
220a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
220b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
220c0 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
220d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
220e0 28 20 69 73 45 72 72 6f 72 52 65 73 65 74 20 7c  ( isErrorReset |
220f0 7c 20 69 73 48 6f 74 4a 6f 75 72 6e 61 6c 20 29  | isHotJournal )
22100 7b 0a 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61  {.      /* Get a
22110 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
22120 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22130 20 66 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70   file. At this p
22140 6f 69 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20  oint it is.     
22150 20 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68   ** important th
22160 61 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f  at a RESERVED lo
22170 63 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e  ck is not obtain
22180 65 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f  ed on the way to
22190 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 45 58   the.      ** EX
221a0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
221b0 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
221c0 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
221d0 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  open the.      *
221e0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
221f0 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
22200 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
22210 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
22220 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
22230 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
22240 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
22250 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
22260 6f 6c 6c 69 6e 67 20 74 68 65 20 0a 20 20 20 20  olling the .    
22270 20 20 2a 2a 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c    ** hot-journal
22280 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20   back..      ** 
22290 0a 20 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73  .      ** Becaus
222a0 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61  e the intermedia
222b0 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  te RESERVED lock
222c0 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65   is not requeste
222d0 64 2c 20 61 6e 79 0a 20 20 20 20 20 20 2a 2a 20  d, any.      ** 
222e0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 61 74  other process at
222f0 74 65 6d 70 74 69 6e 67 20 74 6f 20 61 63 63 65  tempting to acce
22300 73 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ss the database 
22310 66 69 6c 65 20 77 69 6c 6c 20 67 65 74 20 74 6f  file will get to
22320 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69 73 20   .      ** this 
22330 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64  point in the cod
22340 65 20 61 6e 64 20 66 61 69 6c 20 74 6f 20 6f 62  e and fail to ob
22350 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58 43  tain its own EXC
22360 4c 55 53 49 56 45 20 6c 6f 63 6b 20 0a 20 20 20  LUSIVE lock .   
22370 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74     ** on the dat
22380 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
22390 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
223a0 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43  Pager->state<EXC
223b0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
223c0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
223d0 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72  te3OsLock(pPager
223e0 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
223f0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69  LOCK);.        i
22400 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
22410 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63   ){.          rc
22420 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70   = pager_error(p
22430 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20  Pager, rc);.    
22440 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65        goto faile
22450 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
22460 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
22470 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
22480 53 49 56 45 3b 0a 20 20 20 20 20 20 7d 0a 20 0a  SIVE;.      }. .
22490 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
224a0 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
224b0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
224c0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
224d0 20 69 6e 20 0a 20 20 20 20 20 20 2a 2a 20 65 78   in .      ** ex
224e0 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20 6d  clusive-access m
224f0 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64 65 73  ode the file des
22500 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62 65 20  criptor will be 
22510 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a 20 20  kept open and.  
22520 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20      ** possibly 
22530 75 73 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73  used for a trans
22540 61 63 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e  action later on.
22550 20 4f 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73   On some systems
22560 2c 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 4f  , the.      ** O
22570 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  sTruncate() call
22580 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69   used in exclusi
22590 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61  ve-access mode a
225a0 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20  lso requires.   
225b0 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72 69     ** a read/wri
225c0 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e 0a  te file handle..
225d0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
225e0 66 28 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65  f( !isOpen(pPage
225f0 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 20  r->jfd) ){.     
22600 20 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 20 20     int res;.    
22610 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
22620 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 70 50  OsAccess(pVfs,pP
22630 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53  ager->zJournal,S
22640 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49  QLITE_ACCESS_EXI
22650 53 54 53 2c 26 72 65 73 29 3b 0a 20 20 20 20 20  STS,&res);.     
22660 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
22670 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
22680 20 20 69 66 28 20 72 65 73 20 29 7b 0a 20 20 20    if( res ){.   
22690 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75           int fou
226a0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  t = 0;.         
226b0 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54     int f = SQLIT
226c0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
226d0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49  |SQLITE_OPEN_MAI
226e0 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20  N_JOURNAL;.     
226f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
22700 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
22710 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
22720 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
22730 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  en(pVfs, pPager-
22740 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65  >zJournal, pPage
22750 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74  r->jfd, f, &fout
22760 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
22770 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
22780 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e 28 70  E_OK || isOpen(p
22790 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b 0a 20  Pager->jfd) );. 
227a0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72             if( r
227b0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
227c0 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
227d0 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
227e0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
227f0 53 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b  SQLITE_CANTOPEN;
22800 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
22810 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
22820 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
22830 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22850 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65         /* If the
22860 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
22870 74 20 65 78 69 73 74 2c 20 74 68 61 74 20 6d 65  t exist, that me
22880 61 6e 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ans some other p
22890 72 6f 63 65 73 73 0a 20 20 20 20 20 20 20 20 20  rocess.         
228a0 20 20 20 2a 2a 20 68 61 73 20 61 6c 72 65 61 64     ** has alread
228b0 79 20 72 6f 6c 6c 65 64 20 69 74 20 62 61 63 6b  y rolled it back
228c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
228d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59  rc = SQLITE_BUSY
228e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
228f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
22900 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22910 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22920 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
22930 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
22940 2a 20 54 4f 44 4f 3a 20 57 68 79 20 61 72 65 20  * TODO: Why are 
22950 74 68 65 73 65 20 63 6c 65 61 72 65 64 20 68 65  these cleared he
22960 72 65 3f 20 49 73 20 69 74 20 6e 65 63 65 73 73  re? Is it necess
22970 61 72 79 3f 20 2a 2f 0a 20 20 20 20 20 20 70 50  ary? */.      pP
22980 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
22990 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
229a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
229b0 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
229c0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
229d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61 67 65  = 0;.      pPage
229e0 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
229f0 30 3b 0a 20 0a 20 20 20 20 20 20 2f 2a 20 50 6c  0;. .      /* Pl
22a00 61 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74  ayback and delet
22a10 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  e the journal.  
22a20 44 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73  Drop the databas
22a30 65 20 77 72 69 74 65 0a 20 20 20 20 20 20 2a 2a  e write.      **
22a40 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75   lock and reacqu
22a50 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63  ire the read loc
22a60 6b 2e 20 50 75 72 67 65 20 74 68 65 20 63 61 63  k. Purge the cac
22a70 68 65 20 62 65 66 6f 72 65 0a 20 20 20 20 20 20  he before.      
22a80 2a 2a 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  ** playing back 
22a90 74 68 65 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20  the hot-journal 
22aa0 73 6f 20 74 68 61 74 20 77 65 20 64 6f 6e 27 74  so that we don't
22ab0 20 65 6e 64 20 75 70 20 77 69 74 68 0a 20 20 20   end up with.   
22ac0 20 20 20 2a 2a 20 61 6e 20 69 6e 63 6f 6e 73 69     ** an inconsi
22ad0 73 74 65 6e 74 20 63 61 63 68 65 2e 0a 20 20 20  stent cache..   
22ae0 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 63 20 3d     */.      rc =
22af0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
22b00 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
22b10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
22b20 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
22b30 63 20 3d 20 70 61 67 65 72 5f 65 72 72 6f 72 28  c = pager_error(
22b40 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
22b50 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
22b60 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22b70 61 73 73 65 72 74 28 20 28 70 50 61 67 65 72 2d  assert( (pPager-
22b80 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
22b90 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 20 20  ARED).          
22ba0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 65 78 63   || (pPager->exc
22bb0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
22bc0 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45  ager->state>PAGE
22bd0 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20  R_SHARED).      
22be0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  );.    }..    if
22bf0 28 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50  ( sqlite3PcacheP
22c00 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d  agecount(pPager-
22c10 3e 70 50 43 61 63 68 65 29 3e 30 20 29 7b 0a 20  >pPCache)>0 ){. 
22c20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61 72       /* The shar
22c30 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73 74  ed-lock has just
22c40 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20 6f   been acquired o
22c50 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
22c60 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64  ile.      ** and
22c70 20 74 68 65 72 65 20 61 72 65 20 61 6c 72 65 61   there are alrea
22c80 64 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  dy pages in the 
22c90 63 61 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72  cache (from a pr
22ca0 65 76 69 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20  evious.      ** 
22cb0 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
22cc0 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
22cd0 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
22ce0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
22cf0 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
22d00 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
22d10 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
22d20 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
22d30 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20      ** cache..  
22d40 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
22d50 44 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  Database changes
22d60 20 69 73 20 64 65 74 65 63 74 65 64 20 62 79 20   is detected by 
22d70 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35 20 62 79  looking at 15 by
22d80 74 65 73 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20  tes beginning.  
22d90 20 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74      ** at offset
22da0 20 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c   24 into the fil
22db0 65 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20  e.  The first 4 
22dc0 6f 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65  of these 16 byte
22dd0 73 20 61 72 65 0a 20 20 20 20 20 20 2a 2a 20 61  s are.      ** a
22de0 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72 20   32-bit counter 
22df0 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65 6e  that is incremen
22e00 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63 68  ted with each ch
22e10 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20 20  ange.  The.     
22e20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20   ** other bytes 
22e30 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20  change randomly 
22e40 77 69 74 68 20 65 61 63 68 20 66 69 6c 65 20 63  with each file c
22e50 68 61 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20  hange when.     
22e60 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
22e70 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 2a 2a 20  n use..      ** 
22e80 0a 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20  .      ** There 
22e90 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79  is a vanishingly
22ea0 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68   small chance th
22eb0 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c  at a change will
22ec0 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 2a   not be .      *
22ed0 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68 65  * detected.  The
22ee0 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75 6e   chance of an un
22ef0 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65 20  detected change 
22f00 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61 74  is so small that
22f10 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61 6e  .      ** it can
22f20 20 62 65 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20   be neglected.. 
22f30 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 63 68       */.      ch
22f40 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73 69  ar dbFileVers[si
22f50 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
22f60 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20 20  ileVers)];.     
22f70 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
22f80 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 30  ecount(pPager, 0
22f90 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50  );..      if( pP
22fa0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
22fb0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50  .        rc = pP
22fc0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
22fd0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
22fe0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ed;.      }..   
22ff0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
23000 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
23010 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ;.      if( pPag
23020 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
23030 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
23040 28 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e  ("CKVERS %p %d\n
23050 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f  ", pPager, sizeo
23060 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b  f(dbFileVers)));
23070 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
23080 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
23090 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65 56  er->fd, &dbFileV
230a0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
230b0 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20 20  leVers), 24);.  
230c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
230d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
230e0 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
230f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23100 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23110 20 6d 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65   memset(dbFileVe
23120 72 73 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62  rs, 0, sizeof(db
23130 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20  FileVers));.    
23140 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
23150 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
23160 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
23170 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
23180 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
23190 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72 65          pager_re
231a0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
231b0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
231c0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
231d0 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20  xclusiveMode || 
231e0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
231f0 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
23200 20 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69   }.. failed:.  i
23210 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23220 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72   ){.    /* pager
23230 5f 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e  _unlock() is a n
23240 6f 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69  o-op for exclusi
23250 76 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d  ve mode and in-m
23260 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e  emory databases.
23270 20 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e   */.    pager_un
23280 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
23290 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
232a0 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72  ../*.** If the r
232b0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 68  eference count h
232c0 61 73 20 72 65 61 63 68 65 64 20 7a 65 72 6f 2c  as reached zero,
232d0 20 72 6f 6c 6c 62 61 63 6b 20 61 6e 79 20 61 63   rollback any ac
232e0 74 69 76 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74  tive.** transact
232f0 69 6f 6e 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ion and unlock t
23300 68 65 20 70 61 67 65 72 2e 0a 2a 2f 20 0a 73 74  he pager..*/ .st
23310 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 55  atic void pagerU
23320 6e 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 50 61  nlockIfUnused(Pa
23330 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
23340 69 66 28 20 73 71 6c 69 74 65 33 50 63 61 63 68  if( sqlite3Pcach
23350 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65 72  eRefCount(pPager
23360 2d 3e 70 50 43 61 63 68 65 29 3d 3d 30 20 29 7b  ->pPCache)==0 ){
23370 0a 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b  .    pagerUnlock
23380 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67  AndRollback(pPag
23390 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  er);.  }.}../*.*
233a0 2a 20 44 72 6f 70 20 61 20 70 61 67 65 20 66 72  * Drop a page fr
233b0 6f 6d 20 74 68 65 20 63 61 63 68 65 20 75 73 69  om the cache usi
233c0 6e 67 20 73 71 6c 69 74 65 33 50 63 61 63 68 65  ng sqlite3Pcache
233d0 44 72 6f 70 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  Drop()..**.** If
233e0 20 74 68 69 73 20 6d 65 61 6e 73 20 74 68 65 72   this means ther
233f0 65 20 61 72 65 20 6e 6f 77 20 6e 6f 20 70 61 67  e are now no pag
23400 65 73 20 77 69 74 68 20 72 65 66 65 72 65 6e 63  es with referenc
23410 65 73 20 74 6f 20 74 68 65 6d 2c 20 61 20 72 6f  es to them, a ro
23420 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63 63 75 72 73  llback.** occurs
23430 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e   and the lock on
23440 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
23450 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 73 74 61   removed..*/.sta
23460 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 44 72  tic void pagerDr
23470 6f 70 50 61 67 65 28 44 62 50 61 67 65 20 2a 70  opPage(DbPage *p
23480 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
23490 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
234a0 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 50 63 61  er;.  sqlite3Pca
234b0 63 68 65 44 72 6f 70 28 70 50 67 29 3b 0a 20 20  cheDrop(pPg);.  
234c0 70 61 67 65 72 55 6e 6c 6f 63 6b 49 66 55 6e 75  pagerUnlockIfUnu
234d0 73 65 64 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a  sed(pPager);.}..
234e0 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20  /*.** Acquire a 
234f0 72 65 66 65 72 65 6e 63 65 20 74 6f 20 70 61 67  reference to pag
23500 65 20 6e 75 6d 62 65 72 20 70 67 6e 6f 20 69 6e  e number pgno in
23510 20 70 61 67 65 72 20 70 50 61 67 65 72 20 28 61   pager pPager (a
23520 20 70 61 67 65 0a 2a 2a 20 72 65 66 65 72 65 6e   page.** referen
23530 63 65 20 68 61 73 20 74 79 70 65 20 44 62 50 61  ce has type DbPa
23540 67 65 2a 29 2e 20 49 66 20 74 68 65 20 72 65 71  ge*). If the req
23550 75 65 73 74 65 64 20 72 65 66 65 72 65 6e 63 65  uested reference
23560 20 69 73 20 0a 2a 2a 20 73 75 63 63 65 73 73 66   is .** successf
23570 75 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 69  ully obtained, i
23580 74 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 2a  t is copied to *
23590 70 70 50 61 67 65 20 61 6e 64 20 53 51 4c 49 54  ppPage and SQLIT
235a0 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
235b0 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
235c0 6f 6e 20 63 61 6c 6c 73 20 70 61 67 65 72 53 68  on calls pagerSh
235d0 61 72 65 64 4c 6f 63 6b 28 29 20 74 6f 20 6f 62  aredLock() to ob
235e0 74 61 69 6e 20 61 20 53 48 41 52 45 44 20 6c 6f  tain a SHARED lo
235f0 63 6b 20 6f 6e 0a 2a 2a 20 74 68 65 20 64 61 74  ck on.** the dat
23600 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 73 75  abase file if su
23610 63 68 20 61 20 6c 6f 63 6b 20 6f 72 20 67 72 65  ch a lock or gre
23620 61 74 65 72 20 69 73 20 6e 6f 74 20 61 6c 72 65  ater is not alre
23630 61 64 79 20 68 65 6c 64 2e 0a 2a 2a 20 54 68 69  ady held..** Thi
23640 73 20 6d 61 79 20 63 61 75 73 65 20 68 6f 74 2d  s may cause hot-
23650 6a 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b  journal rollback
23660 20 6f 72 20 61 20 63 61 63 68 65 20 70 75 72 67   or a cache purg
23670 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 0a  e. See comments.
23680 2a 2a 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f  ** above functio
23690 6e 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63  n pagerSharedLoc
236a0 6b 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73 2e  k() for details.
236b0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
236c0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
236d0 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 63  already in the c
236e0 61 63 68 65 2c 20 69 74 20 69 73 20 72 65 74 75  ache, it is retu
236f0 72 6e 65 64 2e 20 0a 2a 2a 20 4f 74 68 65 72 77  rned. .** Otherw
23700 69 73 65 2c 20 61 20 6e 65 77 20 70 61 67 65 20  ise, a new page 
23710 6f 62 6a 65 63 74 20 69 73 20 61 6c 6c 6f 63 61  object is alloca
23720 74 65 64 20 61 6e 64 20 70 6f 70 75 6c 61 74 65  ted and populate
23730 64 20 77 69 74 68 20 64 61 74 61 0a 2a 2a 20 72  d with data.** r
23740 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ead from the dat
23750 61 62 61 73 65 20 66 69 6c 65 2e 20 49 6e 20 73  abase file. In s
23760 6f 6d 65 20 63 61 73 65 73 2c 20 74 68 65 20 70  ome cases, the p
23770 63 61 63 68 65 20 6d 6f 64 75 6c 65 20 6d 61 79  cache module may
23780 0a 2a 2a 20 63 68 6f 6f 73 65 20 6e 6f 74 20 74  .** choose not t
23790 6f 20 61 6c 6c 6f 63 61 74 65 20 61 20 6e 65 77  o allocate a new
237a0 20 70 61 67 65 20 6f 62 6a 65 63 74 20 61 6e 64   page object and
237b0 20 6d 61 79 20 72 65 75 73 65 20 61 6e 20 65 78   may reuse an ex
237c0 69 73 74 69 6e 67 0a 2a 2a 20 6f 62 6a 65 63 74  isting.** object
237d0 20 77 69 74 68 20 6e 6f 20 6f 75 74 73 74 61 6e   with no outstan
237e0 64 69 6e 67 20 72 65 66 65 72 65 6e 63 65 73 2e  ding references.
237f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 74 72 61  .**.** The extra
23800 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
23810 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
23820 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  ys initialized t
23830 6f 20 7a 65 72 6f 73 20 74 68 65 20 0a 2a 2a 20  o zeros the .** 
23840 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
23850 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
23860 20 6d 65 6d 6f 72 79 2e 20 49 66 20 74 68 65 20   memory. If the 
23870 70 61 67 65 20 72 65 71 75 65 73 74 65 64 20 69  page requested i
23880 73 20 0a 2a 2a 20 61 6c 72 65 61 64 79 20 69 6e  s .** already in
23890 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20   the cache when 
238a0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
238b0 20 63 61 6c 6c 65 64 2c 20 74 68 65 6e 20 74 68   called, then th
238c0 65 20 65 78 74 72 61 0a 2a 2a 20 64 61 74 61 20  e extra.** data 
238d0 69 73 20 6c 65 66 74 20 61 73 20 69 74 20 77 61  is left as it wa
238e0 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 20  s when the page 
238f0 6f 62 6a 65 63 74 20 77 61 73 20 6c 61 73 74 20  object was last 
23900 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
23910 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61 67  he database imag
23920 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
23930 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
23940 70 61 67 65 20 6f 72 20 69 66 20 61 20 0a 2a 2a  page or if a .**
23950 20 6e 6f 6e 2d 7a 65 72 6f 20 76 61 6c 75 65 20   non-zero value 
23960 69 73 20 70 61 73 73 65 64 20 61 73 20 74 68 65  is passed as the
23970 20 6e 6f 43 6f 6e 74 65 6e 74 20 70 61 72 61 6d   noContent param
23980 65 74 65 72 20 61 6e 64 20 74 68 65 20 0a 2a 2a  eter and the .**
23990 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
239a0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 73  is not already s
239b0 74 6f 72 65 64 20 69 6e 20 74 68 65 20 63 61 63  tored in the cac
239c0 68 65 2c 20 74 68 65 6e 20 6e 6f 20 0a 2a 2a 20  he, then no .** 
239d0 61 63 74 75 61 6c 20 64 69 73 6b 20 72 65 61 64  actual disk read
239e0 20 6f 63 63 75 72 73 2e 20 49 6e 20 74 68 69 73   occurs. In this
239f0 20 63 61 73 65 20 74 68 65 20 6d 65 6d 6f 72 79   case the memory
23a00 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 0a 2a   image of the .*
23a10 2a 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  * page is initia
23a20 6c 69 7a 65 64 20 74 6f 20 61 6c 6c 20 7a 65 72  lized to all zer
23a30 6f 73 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  os. .**.** If no
23a40 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75 65 2c  Content is true,
23a50 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 77   it means that w
23a60 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
23a70 6f 75 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  out the contents
23a80 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61 67 65 2e  .** of the page.
23a90 20 54 68 69 73 20 6f 63 63 75 72 73 20 69 6e 20   This occurs in 
23aa0 74 77 6f 20 73 65 70 65 72 61 74 65 20 73 63 65  two seperate sce
23ab0 6e 61 72 69 6f 73 3a 0a 2a 2a 0a 2a 2a 20 20 20  narios:.**.**   
23ac0 61 29 20 57 68 65 6e 20 72 65 61 64 69 6e 67 20  a) When reading 
23ad0 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
23ae0 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 64   page from the d
23af0 61 74 61 62 61 73 65 2c 20 61 6e 64 0a 2a 2a 0a  atabase, and.**.
23b00 2a 2a 20 20 20 62 29 20 57 68 65 6e 20 61 20 73  **   b) When a s
23b10 61 76 65 70 6f 69 6e 74 20 69 73 20 62 65 69 6e  avepoint is bein
23b20 67 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 6e  g rolled back an
23b30 64 20 77 65 20 6e 65 65 64 20 74 6f 20 6c 6f 61  d we need to loa
23b40 64 0a 2a 2a 20 20 20 20 20 20 61 20 6e 65 77 20  d.**      a new 
23b50 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 63 61  page into the ca
23b60 63 68 65 20 74 6f 20 70 6f 70 75 6c 61 74 65 20  che to populate 
23b70 77 69 74 68 20 74 68 65 20 64 61 74 61 20 72 65  with the data re
23b80 61 64 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d 20  ad.**      from 
23b90 74 68 65 20 73 61 76 65 70 6f 69 6e 74 20 6a 6f  the savepoint jo
23ba0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
23bb0 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72 75  noContent is tru
23bc0 65 2c 20 74 68 65 6e 20 74 68 65 20 64 61 74 61  e, then the data
23bd0 20 72 65 74 75 72 6e 65 64 20 69 73 20 7a 65 72   returned is zer
23be0 6f 65 64 20 69 6e 73 74 65 61 64 20 6f 66 0a 2a  oed instead of.*
23bf0 2a 20 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f  * being read fro
23c00 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  m the database. 
23c10 41 64 64 69 74 69 6f 6e 61 6c 6c 79 2c 20 74 68  Additionally, th
23c20 65 20 62 69 74 73 20 63 6f 72 72 65 73 70 6f 6e  e bits correspon
23c30 64 69 6e 67 0a 2a 2a 20 74 6f 20 70 67 6e 6f 20  ding.** to pgno 
23c40 69 6e 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  in Pager.pInJour
23c50 6e 61 6c 20 28 62 69 74 76 65 63 20 6f 66 20 70  nal (bitvec of p
23c60 61 67 65 73 20 61 6c 72 65 61 64 79 20 77 72 69  ages already wri
23c70 74 74 65 6e 20 74 6f 20 74 68 65 0a 2a 2a 20 6a  tten to the.** j
23c80 6f 75 72 6e 61 6c 20 66 69 6c 65 29 20 61 6e 64  ournal file) and
23c90 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
23ca0 69 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74  int.pInSavepoint
23cb0 20 62 69 74 76 65 63 73 20 6f 66 20 61 6e 79 20   bitvecs of any 
23cc0 6f 70 65 6e 0a 2a 2a 20 73 61 76 65 70 6f 69 6e  open.** savepoin
23cd0 74 73 20 61 72 65 20 73 65 74 2e 20 54 68 69 73  ts are set. This
23ce0 20 6d 65 61 6e 73 20 69 66 20 74 68 65 20 70 61   means if the pa
23cf0 67 65 20 69 73 20 6d 61 64 65 20 77 72 69 74 61  ge is made writa
23d00 62 6c 65 20 61 74 20 61 6e 79 0a 2a 2a 20 70 6f  ble at any.** po
23d10 69 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75 72  int in the futur
23d20 65 2c 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20  e, using a call 
23d30 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  to sqlite3PagerW
23d40 72 69 74 65 28 29 2c 20 69 74 73 20 63 6f 6e 74  rite(), its cont
23d50 65 6e 74 73 0a 2a 2a 20 77 69 6c 6c 20 6e 6f 74  ents.** will not
23d60 20 62 65 20 6a 6f 75 72 6e 61 6c 65 64 2e 20 54   be journaled. T
23d70 68 69 73 20 73 61 76 65 73 20 49 4f 2e 0a 2a 2a  his saves IO..**
23d80 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
23d90 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
23da0 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
23db0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
23dc0 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
23dd0 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
23de0 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
23df0 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
23e00 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
23e10 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
23e20 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
23e30 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
23e40 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
23e50 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
23e60 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
23e70 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
23e80 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
23e90 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
23ea0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
23eb0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
23ec0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
23ed0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
23ee0 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
23ef0 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
23f00 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
23f10 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
23f20 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
23f30 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
23f40 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
23f50 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
23f60 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
23f70 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
23f80 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
23f90 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
23fa0 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
23fb0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
23fc0 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
23fd0 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  iles..*/.int sql
23fe0 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
23ff0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
24000 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
24010 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
24020 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
24030 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
24040 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
24050 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
24060 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
24070 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
24080 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
24090 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
240a0 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
240b0 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
240c0 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
240d0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
240e0 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
240f0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
24100 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73  .  int rc;..  as
24110 73 65 72 74 28 20 61 73 73 65 72 74 5f 70 61 67  sert( assert_pag
24120 65 72 5f 73 74 61 74 65 28 70 50 61 67 65 72 29  er_state(pPager)
24130 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
24140 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
24150 45 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20  ER_UNLOCK .     
24160 20 20 7c 7c 20 73 71 6c 69 74 65 33 50 63 61 63    || sqlite3Pcac
24170 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67 65  heRefCount(pPage
24180 72 2d 3e 70 50 43 61 63 68 65 29 3e 30 20 0a 20  r->pPCache)>0 . 
24190 20 20 20 20 20 20 7c 7c 20 70 67 6e 6f 3d 3d 31        || pgno==1
241a0 0a 20 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  .  );..  /* The 
241b0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
241c0 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
241d0 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
241e0 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a  PT if a page.  *
241f0 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
24200 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a   than this, or z
24210 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65  ero, is requeste
24220 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  d..  */.  if( pg
24230 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
24240 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20  O || pgno==0 || 
24250 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno==PAGER_MJ_P
24260 47 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20  GNO(pPager) ){. 
24270 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
24280 5f 43 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20  _CORRUPT_BKPT;. 
24290 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75   }..  /* Make su
242a0 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68  re we have not h
242b0 69 74 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20  it any critical 
242c0 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20  errors..  */ .  
242d0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
242e0 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d  0 );.  *ppPage =
242f0 20 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69   0;..  /* If thi
24300 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70  s is the first p
24310 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68  age accessed, th
24320 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20  en get a SHARED 
24330 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65  lock.  ** on the
24340 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
24350 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28  pagerSharedLock(
24360 29 20 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20  ) is a no-op if 
24370 0a 20 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65  .  ** a database
24380 20 6c 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79   lock is already
24390 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63   held..  */.  rc
243a0 20 3d 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f   = pagerSharedLo
243b0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ck(pPager);.  if
243c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
243d0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
243e0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
243f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
24400 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a  AGER_UNLOCK );..
24410 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 63    rc = sqlite3Pc
24420 61 63 68 65 46 65 74 63 68 28 70 50 61 67 65 72  acheFetch(pPager
24430 2d 3e 70 50 43 61 63 68 65 2c 20 70 67 6e 6f 2c  ->pPCache, pgno,
24440 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28   1, &pPg);.  if(
24450 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
24460 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
24470 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
24480 50 67 2d 3e 70 67 6e 6f 3d 3d 70 67 6e 6f 20 29  Pg->pgno==pgno )
24490 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
244a0 3e 70 50 61 67 65 72 3d 3d 70 50 61 67 65 72 20  >pPager==pPager 
244b0 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 3d 3d  || pPg->pPager==
244c0 30 20 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  0 );.  if( pPg->
244d0 70 50 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20  pPager==0 ){.   
244e0 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 63 61   /* The pager ca
244f0 63 68 65 20 68 61 73 20 63 72 65 61 74 65 64 20  che has created 
24500 61 20 6e 65 77 20 70 61 67 65 2e 20 49 74 73 20  a new page. Its 
24510 63 6f 6e 74 65 6e 74 20 6e 65 65 64 73 20 74 6f  content needs to
24520 20 0a 20 20 20 20 2a 2a 20 62 65 20 69 6e 69 74   .    ** be init
24530 69 61 6c 69 7a 65 64 2e 0a 20 20 20 20 2a 2f 0a  ialized..    */.
24540 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20      int nMax;.  
24550 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
24560 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20 20  ger->nMiss);.   
24570 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
24580 50 61 67 65 72 3b 0a 0a 20 20 20 20 72 63 20 3d  Pager;..    rc =
24590 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
245a0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c 20 26  ecount(pPager, &
245b0 6e 4d 61 78 29 3b 0a 20 20 20 20 69 66 28 20 72  nMax);.    if( r
245c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
245d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
245e0 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20  erUnref(pPg);.  
245f0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
24600 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 6e 4d     }..    if( nM
24610 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c 20  ax<(int)pgno || 
24620 4d 45 4d 44 42 20 7c 7c 20 6e 6f 43 6f 6e 74 65  MEMDB || noConte
24630 6e 74 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  nt ){.      if( 
24640 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50  pgno>pPager->mxP
24650 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  gno ){.        s
24660 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
24670 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72  (pPg);.        r
24680 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
24690 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  L;.      }.     
246a0 20 69 66 28 20 6e 6f 43 6f 6e 74 65 6e 74 20 29   if( noContent )
246b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 61 69  {.        /* Fai
246c0 6c 75 72 65 20 74 6f 20 73 65 74 20 74 68 65 20  lure to set the 
246d0 62 69 74 73 20 69 6e 20 74 68 65 20 49 6e 4a 6f  bits in the InJo
246e0 75 72 6e 61 6c 20 62 69 74 2d 76 65 63 74 6f 72  urnal bit-vector
246f0 73 20 69 73 20 62 65 6e 69 67 6e 2e 0a 20 20 20  s is benign..   
24700 20 20 20 20 20 2a 2a 20 49 74 20 6d 65 72 65 6c       ** It merel
24710 79 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20  y means that we 
24720 6d 69 67 68 74 20 64 6f 20 73 6f 6d 65 20 65 78  might do some ex
24730 74 72 61 20 77 6f 72 6b 20 74 6f 20 6a 6f 75 72  tra work to jour
24740 6e 61 6c 20 61 20 0a 20 20 20 20 20 20 20 20 2a  nal a .        *
24750 2a 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  * page that does
24760 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
24770 6a 6f 75 72 6e 61 6c 65 64 2e 20 20 4e 65 76 65  journaled.  Neve
24780 72 74 68 65 6c 65 73 73 2c 20 62 65 20 73 75 72  rtheless, be sur
24790 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f  e .        ** to
247a0 20 74 65 73 74 20 74 68 65 20 63 61 73 65 20 77   test the case w
247b0 68 65 72 65 20 61 20 6d 61 6c 6c 6f 63 20 65 72  here a malloc er
247c0 72 6f 72 20 6f 63 63 75 72 73 20 77 68 69 6c 65  ror occurs while
247d0 20 74 72 79 69 6e 67 20 74 6f 20 73 65 74 20 0a   trying to set .
247e0 20 20 20 20 20 20 20 20 2a 2a 20 61 20 62 69 74          ** a bit
247f0 20 69 6e 20 61 20 62 69 74 20 76 65 63 74 6f 72   in a bit vector
24800 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
24810 20 20 20 20 20 73 71 6c 69 74 65 33 42 65 67 69       sqlite3Begi
24820 6e 42 65 6e 69 67 6e 4d 61 6c 6c 6f 63 28 29 3b  nBenignMalloc();
24830 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 6e  .        if( pgn
24840 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
24850 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
24860 20 20 20 54 45 53 54 4f 4e 4c 59 28 20 72 63 20     TESTONLY( rc 
24870 3d 20 29 20 73 71 6c 69 74 65 33 42 69 74 76 65  = ) sqlite3Bitve
24880 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
24890 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
248a0 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
248b0 73 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e  se( rc==SQLITE_N
248c0 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20  OMEM );.        
248d0 7d 0a 20 20 20 20 20 20 20 20 54 45 53 54 4f 4e  }.        TESTON
248e0 4c 59 28 20 72 63 20 3d 20 29 20 61 64 64 54 6f  LY( rc = ) addTo
248f0 53 61 76 65 70 6f 69 6e 74 42 69 74 76 65 63 73  SavepointBitvecs
24900 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
24910 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
24920 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
24930 45 4d 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EM );.        sq
24940 6c 69 74 65 33 45 6e 64 42 65 6e 69 67 6e 4d 61  lite3EndBenignMa
24950 6c 6c 6f 63 28 29 3b 0a 20 20 20 20 20 20 7d 65  lloc();.      }e
24960 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  lse{.        mem
24970 73 65 74 28 70 50 67 2d 3e 70 44 61 74 61 2c 20  set(pPg->pData, 
24980 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
24990 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ize);.      }.  
249a0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45      IOTRACE(("ZE
249b0 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  RO %p %d\n", pPa
249c0 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20  ger, pgno));.   
249d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73   }else{.      as
249e0 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
249f0 72 3d 3d 70 50 61 67 65 72 20 29 3b 0a 20 20 20  r==pPager );.   
24a00 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
24a10 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69  ge(pPg);.      i
24a20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
24a30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49   && rc!=SQLITE_I
24a40 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20  OERR_SHORT_READ 
24a50 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72  ){.        pager
24a60 44 72 6f 70 50 61 67 65 28 70 50 67 29 3b 0a 20  DropPage(pPg);. 
24a70 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
24a80 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
24a90 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
24aa0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50  ECK_PAGES.    pP
24ab0 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
24ac0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
24ad0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73  );.#endif.  }els
24ae0 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65  e{.    /* The re
24af0 71 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20  quested page is 
24b00 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
24b10 65 2e 20 2a 2f 0a 20 20 20 20 50 41 47 45 52 5f  e. */.    PAGER_
24b20 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
24b30 74 29 3b 0a 20 20 7d 0a 0a 20 20 2a 70 70 50 61  t);.  }..  *ppPa
24b40 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75  ge = pPg;.  retu
24b50 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
24b60 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
24b70 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
24b80 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
24b90 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
24ba0 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
24bb0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
24bc0 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
24bd0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
24be0 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
24bf0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
24c00 63 61 63 68 65 2e 20 41 6c 73 6f 2c 20 72 65 74  cache. Also, ret
24c10 75 72 6e 20 30 20 69 66 20 74 68 65 20 0a 2a 2a  urn 0 if the .**
24c20 20 70 61 67 65 72 20 69 73 20 69 6e 20 50 41 47   pager is in PAG
24c30 45 52 5f 55 4e 4c 4f 43 4b 20 73 74 61 74 65 20  ER_UNLOCK state 
24c40 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69  when this functi
24c50 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a 2a  on is called,.**
24c60 20 6f 72 20 69 66 20 74 68 65 20 70 61 67 65 72   or if the pager
24c70 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 20   is in an error 
24c80 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e  state other than
24c90 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 0a 2a 2a   SQLITE_FULL..**
24ca0 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  .** See also sql
24cb0 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e 20  ite3PagerGet(). 
24cc0 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
24cd0 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
24ce0 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
24cf0 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69 73  te3PagerGet() is
24d00 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
24d10 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
24d20 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
24d30 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
24d40 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
24d50 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
24d60 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
24d70 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
24d80 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
24d90 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
24da0 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
24db0 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
24dc0 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20  ened..*/.DbPage 
24dd0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f  *sqlite3PagerLoo
24de0 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
24df0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
24e00 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30 3b   PgHdr *pPg = 0;
24e10 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
24e20 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  r!=0 );.  assert
24e30 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20  ( pgno!=0 );..  
24e40 69 66 28 20 28 70 50 61 67 65 72 2d 3e 73 74 61  if( (pPager->sta
24e50 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
24e60 29 0a 20 20 20 26 26 20 28 70 50 61 67 65 72 2d  ).   && (pPager-
24e70 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
24e80 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  _OK || pPager->e
24e90 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46  rrCode==SQLITE_F
24ea0 55 4c 4c 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  ULL).  ){.    sq
24eb0 6c 69 74 65 33 50 63 61 63 68 65 46 65 74 63 68  lite3PcacheFetch
24ec0 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65  (pPager->pPCache
24ed0 2c 20 70 67 6e 6f 2c 20 30 2c 20 26 70 50 67 29  , pgno, 0, &pPg)
24ee0 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
24ef0 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pPg;.}../*.** Re
24f00 6c 65 61 73 65 20 61 20 70 61 67 65 20 72 65 66  lease a page ref
24f10 65 72 65 6e 63 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  erence..**.** If
24f20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
24f30 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
24f40 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65   page drop to ze
24f50 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20  ro, then the.** 
24f60 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f  page is added to
24f70 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20   the LRU list.  
24f80 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e  When all referen
24f90 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73  ces to all pages
24fa0 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64  .** are released
24fb0 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  , a rollback occ
24fc0 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b  urs and the lock
24fd0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
24fe0 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a   is.** removed..
24ff0 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
25000 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67 65  agerUnref(DbPage
25010 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
25020 67 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  g ){.    Pager *
25030 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
25040 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  ager;.    sqlite
25050 33 50 63 61 63 68 65 52 65 6c 65 61 73 65 28 70  3PcacheRelease(p
25060 50 67 29 3b 0a 20 20 20 20 70 61 67 65 72 55 6e  Pg);.    pagerUn
25070 6c 6f 63 6b 49 66 55 6e 75 73 65 64 28 70 50 61  lockIfUnused(pPa
25080 67 65 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ger);.  }.}../*.
25090 2a 2a 20 49 66 20 74 68 65 20 6d 61 69 6e 20 6a  ** If the main j
250a0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20  ournal file has 
250b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 6f 70 65  already been ope
250c0 6e 65 64 2c 20 65 6e 73 75 72 65 20 74 68 61 74  ned, ensure that
250d0 20 74 68 65 0a 2a 2a 20 73 75 62 2d 6a 6f 75 72   the.** sub-jour
250e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6f 70 65 6e  nal file is open
250f0 20 74 6f 6f 2e 20 49 66 20 74 68 65 20 6d 61 69   too. If the mai
25100 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74  n journal is not
25110 20 6f 70 65 6e 2c 0a 2a 2a 20 74 68 69 73 20 66   open,.** this f
25120 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
25130 6f 70 2e 0a 2a 2a 0a 2a 2a 20 53 51 4c 49 54 45  op..**.** SQLITE
25140 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
25150 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 67 6f  if everything go
25160 65 73 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20  es according to 
25170 70 6c 61 6e 2e 20 0a 2a 2a 20 41 6e 20 53 51 4c  plan. .** An SQL
25180 49 54 45 5f 49 4f 45 52 52 5f 58 58 58 20 65 72  ITE_IOERR_XXX er
25190 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
251a0 72 6e 65 64 20 69 66 20 61 20 63 61 6c 6c 20 74  rned if a call t
251b0 6f 20 0a 2a 2a 20 73 71 6c 69 74 65 33 4f 73 4f  o .** sqlite3OsO
251c0 70 65 6e 28 29 20 66 61 69 6c 73 2e 0a 2a 2f 0a  pen() fails..*/.
251d0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 65 6e 53  static int openS
251e0 75 62 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20  ubJournal(Pager 
251f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
25200 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
25210 20 20 69 66 28 20 69 73 4f 70 65 6e 28 70 50 61    if( isOpen(pPa
25220 67 65 72 2d 3e 6a 66 64 29 20 26 26 20 21 69 73  ger->jfd) && !is
25230 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66  Open(pPager->sjf
25240 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  d) ){.    if( pP
25250 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
25260 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
25270 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b 0a 20  MODE_MEMORY ){. 
25280 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65 6d 4a       sqlite3MemJ
25290 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61 67 65  ournalOpen(pPage
252a0 72 2d 3e 73 6a 66 64 29 3b 0a 20 20 20 20 7d 65  r->sjfd);.    }e
252b0 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  lse{.      rc = 
252c0 70 61 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50  pagerOpentemp(pP
252d0 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 6a  ager, pPager->sj
252e0 66 64 2c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  fd, SQLITE_OPEN_
252f0 53 55 42 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  SUBJOURNAL);.   
25300 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
25310 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  rc;.}../*.** Thi
25320 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
25330 6c 6c 65 64 20 61 74 20 74 68 65 20 73 74 61 72  lled at the star
25340 74 20 6f 66 20 65 76 65 72 79 20 77 72 69 74 65  t of every write
25350 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2a   transaction..**
25360 20 54 68 65 72 65 20 6d 75 73 74 20 61 6c 72 65   There must alre
25370 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
25380 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  D or EXCLUSIVE l
25390 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
253a0 61 73 65 20 0a 2a 2a 20 66 69 6c 65 20 77 68 65  ase .** file whe
253b0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
253c0 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
253d0 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
253e0 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
253f0 70 50 61 67 65 72 20 61 6e 64 20 77 72 69 74 65  pPager and write
25400 20 61 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65   a journal heade
25410 72 0a 2a 2a 20 74 6f 20 74 68 65 20 73 74 61 72  r.** to the star
25420 74 20 6f 66 20 69 74 2e 20 49 66 20 74 68 65 72  t of it. If ther
25430 65 20 61 72 65 20 61 63 74 69 76 65 20 73 61 76  e are active sav
25440 65 70 6f 69 6e 74 73 2c 20 6f 70 65 6e 20 74 68  epoints, open th
25450 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 0a 2a 2a  e sub-journal.**
25460 20 61 73 20 77 65 6c 6c 2e 20 54 68 69 73 20 66   as well. This f
25470 75 6e 63 74 69 6f 6e 20 69 73 20 6f 6e 6c 79 20  unction is only 
25480 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 6a 6f  used when the jo
25490 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 62 65  urnal file is be
254a0 69 6e 67 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 74  ing .** opened t
254b0 6f 20 77 72 69 74 65 20 61 20 72 6f 6c 6c 62 61  o write a rollba
254c0 63 6b 20 6c 6f 67 20 66 6f 72 20 61 20 74 72 61  ck log for a tra
254d0 6e 73 61 63 74 69 6f 6e 2e 20 49 74 20 69 73 20  nsaction. It is 
254e0 6e 6f 74 20 75 73 65 64 20 0a 2a 2a 20 77 68 65  not used .** whe
254f0 6e 20 6f 70 65 6e 69 6e 67 20 61 20 68 6f 74 20  n opening a hot 
25500 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 6f 20  journal file to 
25510 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 0a 2a 2a  roll it back..**
25520 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
25530 61 6c 20 66 69 6c 65 20 69 73 20 61 6c 72 65 61  al file is alrea
25540 64 79 20 6f 70 65 6e 20 28 61 73 20 69 74 20 6d  dy open (as it m
25550 61 79 20 62 65 20 69 6e 20 65 78 63 6c 75 73 69  ay be in exclusi
25560 76 65 20 6d 6f 64 65 29 2c 0a 2a 2a 20 74 68 65  ve mode),.** the
25570 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  n this function 
25580 6a 75 73 74 20 77 72 69 74 65 73 20 61 20 6a 6f  just writes a jo
25590 75 72 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20  urnal header to 
255a0 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
255b0 0a 2a 2a 20 61 6c 72 65 61 64 79 20 6f 70 65 6e  .** already open
255c0 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 68   file. .**.** Wh
255d0 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
255e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
255f0 20 6f 70 65 6e 65 64 20 62 79 20 74 68 69 73 20   opened by this 
25600 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 0a 2a 2a  function, the.**
25610 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72 6e 61   Pager.pInJourna
25620 6c 20 62 69 74 76 65 63 20 73 74 72 75 63 74 75  l bitvec structu
25630 72 65 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 2e  re is allocated.
25640 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
25650 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79  LITE_OK if every
25660 74 68 69 6e 67 20 69 73 20 73 75 63 63 65 73 73  thing is success
25670 66 75 6c 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ful. Otherwise, 
25680 72 65 74 75 72 6e 20 0a 2a 2a 20 53 51 4c 49 54  return .** SQLIT
25690 45 5f 4e 4f 4d 45 4d 20 69 66 20 74 68 65 20 61  E_NOMEM if the a
256a0 74 74 65 6d 70 74 20 74 6f 20 61 6c 6c 6f 63 61  ttempt to alloca
256b0 74 65 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75 72  te Pager.pInJour
256c0 6e 61 6c 20 66 61 69 6c 73 2c 20 6f 72 20 0a 2a  nal fails, or .*
256d0 2a 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f  * an IO error co
256e0 64 65 20 69 66 20 6f 70 65 6e 69 6e 67 20 6f 72  de if opening or
256f0 20 77 72 69 74 69 6e 67 20 74 68 65 20 6a 6f 75   writing the jou
25700 72 6e 61 6c 20 66 69 6c 65 20 66 61 69 6c 73 2e  rnal file fails.
25710 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
25720 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
25730 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
25740 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
25750 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20  ITE_OK;         
25760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25770 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
25780 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
25790 20 63 6f 6e 73 74 20 70 56 66 73 20 3d 20 70 50   const pVfs = pP
257a0 61 67 65 72 2d 3e 70 56 66 73 3b 20 20 20 2f 2a  ager->pVfs;   /*
257b0 20 4c 6f 63 61 6c 20 63 61 63 68 65 20 6f 66 20   Local cache of 
257c0 76 66 73 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 0a  vfs pointer */..
257d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
257e0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
257f0 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73  ESERVED );.  ass
25800 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65  ert( pPager->use
25810 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73 73  Journal );.  ass
25820 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
25830 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
25840 0a 20 20 2f 2a 20 49 66 20 61 6c 72 65 61 64 79  .  /* If already
25850 20 69 6e 20 74 68 65 20 65 72 72 6f 72 20 73 74   in the error st
25860 61 74 65 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ate, this functi
25870 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 20 2a  on is a no-op. *
25880 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
25890 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
258a0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
258b0 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  rCode;.  }..  /*
258c0 20 54 4f 44 4f 3a 20 49 73 20 69 74 20 72 65 61   TODO: Is it rea
258d0 6c 6c 79 20 70 6f 73 73 69 62 6c 65 20 74 6f 20  lly possible to 
258e0 67 65 74 20 68 65 72 65 20 77 69 74 68 20 64 62  get here with db
258f0 53 69 7a 65 56 61 6c 69 64 3d 3d 30 3f 20 49 66  SizeValid==0? If
25900 20 6e 6f 74 2c 0a 20 20 2a 2a 20 74 68 65 20 63   not,.  ** the c
25910 61 6c 6c 20 74 6f 20 50 61 67 65 72 50 61 67 65  all to PagerPage
25920 63 6f 75 6e 74 28 29 20 63 61 6e 20 62 65 20 72  count() can be r
25930 65 6d 6f 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 74  emoved..  */.  t
25940 65 73 74 63 61 73 65 28 20 70 50 61 67 65 72 2d  estcase( pPager-
25950 3e 64 62 53 69 7a 65 56 61 6c 69 64 3d 3d 30 20  >dbSizeValid==0 
25960 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
25970 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
25980 72 2c 20 30 29 3b 0a 0a 20 20 70 50 61 67 65 72  r, 0);..  pPager
25990 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->pInJournal = s
259a0 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
259b0 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
259c0 65 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  e);.  if( pPager
259d0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->pInJournal==0 
259e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
259f0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
25a00 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a  .  /* Open the j
25a10 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 69  ournal file if i
25a20 74 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  t is not already
25a30 20 6f 70 65 6e 2e 20 2a 2f 0a 20 20 69 66 28 20   open. */.  if( 
25a40 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e  !isOpen(pPager->
25a50 6a 66 64 29 20 29 7b 0a 20 20 20 20 69 66 28 20  jfd) ){.    if( 
25a60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
25a70 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
25a80 41 4c 4d 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 7b  ALMODE_MEMORY ){
25a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4d 65  .      sqlite3Me
25aa0 6d 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 70 50 61  mJournalOpen(pPa
25ab0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d  ger->jfd);.    }
25ac0 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73  else{.      cons
25ad0 74 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 20 20  t int flags =   
25ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25af0 2f 2a 20 56 46 53 20 66 6c 61 67 73 20 74 6f 20  /* VFS flags to 
25b00 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  open journal fil
25b10 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 53 51 4c  e */.        SQL
25b20 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
25b30 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45  TE|SQLITE_OPEN_E
25b40 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45 5f  XCLUSIVE|SQLITE_
25b50 4f 50 45 4e 5f 43 52 45 41 54 45 7c 0a 20 20 20  OPEN_CREATE|.   
25b60 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 74 65       (pPager->te
25b70 6d 70 46 69 6c 65 20 3f 20 0a 20 20 20 20 20 20  mpFile ? .      
25b80 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
25b90 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53  _DELETEONCLOSE|S
25ba0 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f  QLITE_OPEN_TEMP_
25bb0 4a 4f 55 52 4e 41 4c 29 3a 0a 20 20 20 20 20 20  JOURNAL):.      
25bc0 20 20 20 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e      (SQLITE_OPEN
25bd0 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 0a 20  _MAIN_JOURNAL). 
25be0 20 20 20 20 20 20 20 29 3b 0a 23 69 66 64 65 66         );.#ifdef
25bf0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
25c00 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
25c10 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
25c20 75 72 6e 61 6c 4f 70 65 6e 28 0a 20 20 20 20 20  urnalOpen(.     
25c30 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
25c40 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
25c50 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
25c60 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
25c70 70 50 61 67 65 72 29 0a 20 20 20 20 20 20 29 3b  pPager).      );
25c80 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
25c90 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28  = sqlite3OsOpen(
25ca0 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
25cb0 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e  ournal, pPager->
25cc0 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  jfd, flags, 0);.
25cd0 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
25ce0 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
25cf0 49 54 45 5f 4f 4b 20 7c 7c 20 69 73 4f 70 65 6e  ITE_OK || isOpen
25d00 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 3b  (pPager->jfd) );
25d10 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 57 72 69 74  .  }...  /* Writ
25d20 65 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  e the first jour
25d30 6e 61 6c 20 68 65 61 64 65 72 20 74 6f 20 74 68  nal header to th
25d40 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
25d50 6e 64 20 6f 70 65 6e 20 0a 20 20 2a 2a 20 74 68  nd open .  ** th
25d60 65 20 73 75 62 2d 6a 6f 75 72 6e 61 6c 20 69 66  e sub-journal if
25d70 20 6e 65 63 65 73 73 61 72 79 2e 0a 20 20 2a 2f   necessary..  */
25d80 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
25d90 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
25da0 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 61 6c  ODO: Check if al
25db0 6c 20 6f 66 20 74 68 65 73 65 20 61 72 65 20 72  l of these are r
25dc0 65 61 6c 6c 79 20 72 65 71 75 69 72 65 64 2e 20  eally required. 
25dd0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  */.    pPager->d
25de0 62 4f 72 69 67 53 69 7a 65 20 3d 20 70 50 61 67  bOrigSize = pPag
25df0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20  er->dbSize;.    
25e00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
25e10 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20  tarted = 0;.    
25e20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
25e30 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
25e40 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  ->nRec = 0;.    
25e50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
25e60 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ff = 0;.    pPag
25e70 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
25e80 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
25e90 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
25ea0 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75     rc = writeJou
25eb0 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
25ec0 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
25ed0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 50 61 67  QLITE_OK && pPag
25ee0 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74 20 29  er->nSavepoint )
25ef0 7b 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e 53  {.    rc = openS
25f00 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ubJournal(pPager
25f10 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
25f20 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
25f30 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
25f40 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
25f50 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  pInJournal);.   
25f60 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
25f70 6e 61 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  nal = 0;.  }.  r
25f80 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
25f90 2a 2a 20 42 65 67 69 6e 20 61 20 77 72 69 74 65  ** Begin a write
25fa0 2d 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 6e 20  -transaction on 
25fb0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
25fc0 67 65 72 20 6f 62 6a 65 63 74 2e 20 49 66 20 61  ger object. If a
25fd0 20 0a 2a 2a 20 77 72 69 74 65 2d 74 72 61 6e 73   .** write-trans
25fe0 61 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  action has alrea
25ff0 64 79 20 62 65 65 6e 20 6f 70 65 6e 65 64 2c 20  dy been opened, 
26000 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  this function is
26010 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
26020 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 61 72  If the exFlag ar
26030 67 75 6d 65 6e 74 20 69 73 20 66 61 6c 73 65 2c  gument is false,
26040 20 74 68 65 6e 20 61 63 71 75 69 72 65 20 61 74   then acquire at
26050 20 6c 65 61 73 74 20 61 20 52 45 53 45 52 56 45   least a RESERVE
26060 44 0a 2a 2a 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  D.** lock on the
26070 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
26080 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
26090 65 2c 20 74 68 65 6e 20 61 63 71 75 69 72 65 20  e, then acquire 
260a0 61 74 20 6c 65 61 73 74 0a 2a 2a 20 61 6e 20 45  at least.** an E
260b0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49  XCLUSIVE lock. I
260c0 66 20 73 75 63 68 20 61 20 6c 6f 63 6b 20 69 73  f such a lock is
260d0 20 61 6c 72 65 61 64 79 20 68 65 6c 64 2c 20 6e   already held, n
260e0 6f 20 6c 6f 63 6b 69 6e 67 20 0a 2a 2a 20 66 75  o locking .** fu
260f0 6e 63 74 69 6f 6e 73 20 6e 65 65 64 20 62 65 20  nctions need be 
26100 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  called..**.** If
26110 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74   this is not a t
26120 65 6d 70 6f 72 61 72 79 20 6f 72 20 69 6e 2d 6d  emporary or in-m
26130 65 6d 6f 72 79 20 66 69 6c 65 20 61 6e 64 2c 20  emory file and, 
26140 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
26150 20 69 73 20 0a 2a 2a 20 6f 70 65 6e 65 64 20 69   is .** opened i
26160 66 20 69 74 20 68 61 73 20 6e 6f 74 20 62 65 65  f it has not bee
26170 6e 20 61 6c 72 65 61 64 79 2e 20 46 6f 72 20 61  n already. For a
26180 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2c   temporary file,
26190 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 0a 2a 2a   the opening .**
261a0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
261b0 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
261c0 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
261d0 61 6e 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74  an actual need t
261e0 6f 20 0a 2a 2a 20 77 72 69 74 65 20 74 6f 20 74  o .** write to t
261f0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 54 4f 44 4f  he journal. TODO
26200 3a 20 57 68 79 20 68 61 6e 64 6c 65 20 74 65 6d  : Why handle tem
26210 70 6f 72 61 72 79 20 66 69 6c 65 73 20 64 69 66  porary files dif
26220 66 65 72 65 6e 74 6c 79 3f 0a 2a 2a 0a 2a 2a 20  ferently?.**.** 
26230 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
26240 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 28 6f  ile is opened (o
26250 72 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  r if it is alrea
26260 64 79 20 6f 70 65 6e 29 2c 20 74 68 65 6e 20 61  dy open), then a
26270 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64  .** journal-head
26280 65 72 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  er is written to
26290 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 69 74   the start of it
262a0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
262b0 50 61 67 65 72 42 65 67 69 6e 28 50 61 67 65 72  PagerBegin(Pager
262c0 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 78   *pPager, int ex
262d0 46 6c 61 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  Flag){.  int rc 
262e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61  = SQLITE_OK;.  a
262f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
26300 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
26310 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  CK );.  if( pPag
26320 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
26330 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
26340 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
26350 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
26360 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d      assert( !MEM
26370 44 42 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  DB && !pPager->t
26380 65 6d 70 46 69 6c 65 20 29 3b 0a 0a 20 20 20 20  empFile );..    
26390 2f 2a 20 4f 62 74 61 69 6e 20 61 20 52 45 53 45  /* Obtain a RESE
263a0 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
263b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
263c0 49 66 20 74 68 65 20 65 78 46 6c 61 67 20 70 61  If the exFlag pa
263d0 72 61 6d 65 74 65 72 0a 20 20 20 20 2a 2a 20 69  rameter.    ** i
263e0 73 20 74 72 75 65 2c 20 74 68 65 6e 20 69 6d 6d  s true, then imm
263f0 65 64 69 61 74 65 6c 79 20 75 70 67 72 61 64 65  ediately upgrade
26400 20 74 68 69 73 20 74 6f 20 61 6e 20 45 58 43 4c   this to an EXCL
26410 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68 65 0a  USIVE lock. The.
26420 20 20 20 20 2a 2a 20 62 75 73 79 2d 68 61 6e 64      ** busy-hand
26430 6c 65 72 20 63 61 6c 6c 62 61 63 6b 20 63 61 6e  ler callback can
26440 20 62 65 20 75 73 65 64 20 77 68 65 6e 20 75 70   be used when up
26450 67 72 61 64 69 6e 67 20 74 6f 20 74 68 65 20 45  grading to the E
26460 58 43 4c 55 53 49 56 45 0a 20 20 20 20 2a 2a 20  XCLUSIVE.    ** 
26470 6c 6f 63 6b 2c 20 62 75 74 20 6e 6f 74 20 77 68  lock, but not wh
26480 65 6e 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65  en obtaining the
26490 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2e 0a   RESERVED lock..
264a0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
264b0 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
264c0 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
264d0 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66  ED_LOCK);.    if
264e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
264f0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
26500 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
26510 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 69  ESERVED;.      i
26520 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  f( exFlag ){.   
26530 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
26540 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
26550 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
26560 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  OCK);.      }.  
26570 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
26580 68 65 20 72 65 71 75 69 72 65 64 20 6c 6f 63 6b  he required lock
26590 73 20 77 65 72 65 20 73 75 63 63 65 73 73 66 75  s were successfu
265a0 6c 6c 79 20 6f 62 74 61 69 6e 65 64 2c 20 6f 70  lly obtained, op
265b0 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  en the journal. 
265c0 20 20 20 2a 2a 20 66 69 6c 65 20 61 6e 64 20 77     ** file and w
265d0 72 69 74 65 20 74 68 65 20 66 69 72 73 74 20 6a  rite the first j
265e0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 74 6f  ournal-header to
265f0 20 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   it..    */.    
26600 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
26610 4b 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65  K && pPager->use
26620 4a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 26 26 20  Journal.     && 
26630 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
26640 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
26650 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20  ALMODE_OFF .    
26660 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
26670 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
26680 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
26690 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73 4f 70    }else if( isOp
266a0 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20  en(pPager->jfd) 
266b0 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
266c0 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20  alOff==0 ){.    
266d0 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e 73 20  /* This happens 
266e0 77 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 77  when the pager w
266f0 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76 65 2d  as in exclusive-
26700 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68 65 20  access mode the 
26710 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69 6d 65  last.    ** time
26720 20 61 20 28 72 65 61 64 20 6f 72 20 77 72 69 74   a (read or writ
26730 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  e) transaction w
26740 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20  as successfully 
26750 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20 2a 2a  concluded.    **
26760 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65 63 74   by this connect
26770 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f 66 20  ion. Instead of 
26780 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a 6f 75  deleting the jou
26790 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77 61 73  rnal file it was
267a0 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20 6f 70   .    ** kept op
267b0 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20 77 61  en and either wa
267c0 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30  s truncated to 0
267d0 20 62 79 74 65 73 20 6f 72 20 69 74 73 20 68 65   bytes or its he
267e0 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a 2a 20  ader was.    ** 
267f0 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
26800 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f 0a 20   zeros..    */. 
26810 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
26820 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20  r->nRec==0 );.  
26830 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
26840 2d 3e 64 62 4f 72 69 67 53 69 7a 65 3d 3d 30 20  ->dbOrigSize==0 
26850 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
26860 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
26870 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d  l==0 );.    rc =
26880 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
26890 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  nal(pPager);.  }
268a0 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  ..  PAGERTRACE((
268b0 22 54 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c  "TRANSACTION %d\
268c0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
268d0 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72 74 28  er)));.  assert(
268e0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
268f0 3e 6a 66 64 29 20 7c 7c 20 70 50 61 67 65 72 2d  >jfd) || pPager-
26900 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c  >journalOff>0 ||
26910 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26920 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
26930 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 73  ../*.** Mark a s
26940 69 6e 67 6c 65 20 64 61 74 61 20 70 61 67 65 20  ingle data page 
26950 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68  as writeable. Th
26960 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
26970 6e 20 69 6e 74 6f 20 74 68 65 20 0a 2a 2a 20 6d  n into the .** m
26980 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 73  ain journal or s
26990 75 62 2d 6a 6f 75 72 6e 61 6c 20 61 73 20 72 65  ub-journal as re
269a0 71 75 69 72 65 64 2e 20 49 66 20 74 68 65 20 70  quired. If the p
269b0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
269c0 6e 74 6f 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68  nto.** one of th
269d0 65 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68 65 20  e journals, the 
269e0 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 62 69  corresponding bi
269f0 74 20 69 73 20 73 65 74 20 69 6e 20 74 68 65 20  t is set in the 
26a00 0a 2a 2a 20 50 61 67 65 72 2e 70 49 6e 4a 6f 75  .** Pager.pInJou
26a10 72 6e 61 6c 20 62 69 74 76 65 63 20 61 6e 64 20  rnal bitvec and 
26a20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f 69  the PagerSavepoi
26a30 6e 74 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20  nt.pInSavepoint 
26a40 62 69 74 76 65 63 73 0a 2a 2a 20 6f 66 20 61 6e  bitvecs.** of an
26a50 79 20 6f 70 65 6e 20 73 61 76 65 70 6f 69 6e 74  y open savepoint
26a60 73 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  s as appropriate
26a70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
26a80 70 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64  pager_write(PgHd
26a90 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20  r *pPg){.  void 
26aa0 2a 70 44 61 74 61 20 3d 20 70 50 67 2d 3e 70 44  *pData = pPg->pD
26ab0 61 74 61 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ata;.  Pager *pP
26ac0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
26ad0 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  er;.  int rc = S
26ae0 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
26af0 43 68 65 63 6b 20 66 6f 72 20 65 72 72 6f 72 73  Check for errors
26b00 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
26b10 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a  er->errCode ){ .
26b20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
26b30 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
26b40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
26b50 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
26b60 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
26b70 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
26b80 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
26b90 74 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f  ter );..  CHECK_
26ba0 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a  PAGE(pPg);..  /*
26bb0 20 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   Mark the page a
26bc0 73 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65  s dirty.  If the
26bd0 20 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64   page has alread
26be0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20  y been written. 
26bf0 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e   ** to the journ
26c00 61 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72  al then we can r
26c10 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
26c20 2e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ..  */.  sqlite3
26c30 50 63 61 63 68 65 4d 61 6b 65 44 69 72 74 79 28  PcacheMakeDirty(
26c40 70 50 67 29 3b 0a 20 20 69 66 28 20 70 61 67 65  pPg);.  if( page
26c50 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29 20 26  InJournal(pPg) &
26c60 26 20 21 73 75 62 6a 52 65 71 75 69 72 65 73 50  & !subjRequiresP
26c70 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
26c80 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
26c90 65 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  ed = 1;.  }else{
26ca0 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
26cb0 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
26cc0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
26cd0 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
26ce0 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
26cf0 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
26d00 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
26d10 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
26d20 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
26d30 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
26d40 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
26d50 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
26d60 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
26d70 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20  l exists and.   
26d80 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
26d90 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
26da0 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
26db0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
26dc0 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
26dd0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26de0 50 61 67 65 72 42 65 67 69 6e 28 70 50 61 67 65  PagerBegin(pPage
26df0 72 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  r, 0);.    if( r
26e00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26e10 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
26e20 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
26e30 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
26e40 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
26e50 20 29 3b 0a 20 20 20 20 69 66 28 20 21 69 73 4f   );.    if( !isO
26e60 70 65 6e 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  pen(pPager->jfd)
26e70 20 26 26 20 70 50 61 67 65 72 2d 3e 75 73 65 4a   && pPager->useJ
26e80 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 20  ournal.         
26e90 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
26ea0 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
26eb0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29  OURNALMODE_OFF )
26ec0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
26ed0 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28  er_open_journal(
26ee0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
26ef0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
26f00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
26f10 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
26f20 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31 3b 0a  dbModified = 1;.
26f30 20 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72    .    /* The tr
26f40 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
26f50 6c 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64  l now exists and
26f60 20 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52   we have a RESER
26f70 56 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a  VED or an.    **
26f80 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
26f90 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  on the main data
26fa0 62 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74  base file.  Writ
26fb0 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
26fc0 67 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65  ge to.    ** the
26fd0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
26fe0 72 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f  rnal if it is no
26ff0 74 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e  t there already.
27000 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
27010 21 70 61 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70  !pageInJournal(p
27020 50 67 29 20 26 26 20 69 73 4f 70 65 6e 28 70 50  Pg) && isOpen(pP
27030 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b 0a 20 20  ager->jfd) ){.  
27040 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
27050 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
27060 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
27070 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20 20   u32 cksum;.    
27080 20 20 20 20 63 68 61 72 20 2a 70 44 61 74 61 32      char *pData2
27090 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 65  ;..        /* We
270a0 20 73 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72   should never wr
270b0 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ite to the journ
270c0 61 6c 20 66 69 6c 65 20 74 68 65 20 70 61 67 65  al file the page
270d0 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a   that.        **
270e0 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
270f0 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
27100 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
27110 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
27120 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20       ** that we 
27130 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20  do not. */.     
27140 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
27150 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50  pgno!=PAGER_MJ_P
27160 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20  GNO(pPager) );. 
27170 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
27180 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
27190 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
271a0 20 37 29 3b 0a 20 20 20 20 20 20 20 20 63 6b 73   7);.        cks
271b0 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d  um = pager_cksum
271c0 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44  (pPager, (u8*)pD
271d0 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 72  ata2);.        r
271e0 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
271f0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
27200 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c  ger->journalOff,
27210 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
27220 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27230 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27240 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
27250 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
27260 6a 66 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61  jfd, pData2, pPa
27270 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20  ger->pageSize,. 
27280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27290 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
272a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
272b0 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  + 4);.          
272c0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
272d0 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61  ff += pPager->pa
272e0 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20 20 20  geSize+4;.      
272f0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
27300 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27310 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
27320 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
27330 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
27340 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73  >journalOff, cks
27350 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  um);.          p
27360 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
27370 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  f += 4;.        
27380 7d 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  }.        IOTRAC
27390 45 28 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25  E(("JOUT %p %d %
273a0 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
273b0 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20  r, pPg->pgno, . 
273c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
273d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
273e0 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
273f0 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
27400 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
27410 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f  e3_pager_writej_
27420 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  count);.        
27430 50 41 47 45 52 54 52 41 43 45 28 28 22 4a 4f 55  PAGERTRACE(("JOU
27440 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 20  RNAL %d page %d 
27450 6e 65 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68  needSync=%d hash
27460 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20  (%08x)\n",.     
27470 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
27480 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
27490 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  no, .           
274a0 20 20 28 28 70 50 67 2d 3e 66 6c 61 67 73 26 50    ((pPg->flags&P
274b0 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f  GHDR_NEED_SYNC)?
274c0 31 3a 30 29 2c 20 70 61 67 65 72 5f 70 61 67 65  1:0), pager_page
274d0 68 61 73 68 28 70 50 67 29 29 29 3b 0a 0a 20 20  hash(pPg)));..  
274e0 20 20 20 20 20 20 2f 2a 20 45 76 65 6e 20 69 66        /* Even if
274f0 20 61 6e 20 49 4f 20 6f 72 20 64 69 73 6b 66 75   an IO or diskfu
27500 6c 6c 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65  ll error occurre
27510 64 20 77 68 69 6c 65 20 6a 6f 75 72 6e 61 6c 6c  d while journall
27520 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20  ing the.        
27530 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 62  ** page in the b
27540 6c 6f 63 6b 20 61 62 6f 76 65 2c 20 73 65 74 20  lock above, set 
27550 74 68 65 20 6e 65 65 64 2d 73 79 6e 63 20 66 6c  the need-sync fl
27560 61 67 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ag for the page.
27570 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 74 68 65  .        ** Othe
27580 72 77 69 73 65 2c 20 77 68 65 6e 20 74 68 65 20  rwise, when the 
27590 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
275a0 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 74 68 65 20  olled back, the 
275b0 6c 6f 67 69 63 20 69 6e 0a 20 20 20 20 20 20 20  logic in.       
275c0 20 2a 2a 20 70 6c 61 79 62 61 63 6b 5f 6f 6e 65   ** playback_one
275d0 5f 70 61 67 65 28 29 20 77 69 6c 6c 20 74 68 69  _page() will thi
275e0 6e 6b 20 74 68 61 74 20 74 68 65 20 70 61 67 65  nk that the page
275f0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 73   needs to be res
27600 74 6f 72 65 64 0a 20 20 20 20 20 20 20 20 2a 2a  tored.        **
27610 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
27620 20 66 69 6c 65 2e 20 41 6e 64 20 69 66 20 61 6e   file. And if an
27630 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
27640 20 77 68 69 6c 65 20 64 6f 69 6e 67 20 73 6f 2c   while doing so,
27650 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e  .        ** then
27660 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 61 79 20   corruption may 
27670 66 6f 6c 6c 6f 77 2e 0a 20 20 20 20 20 20 20 20  follow..        
27680 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
27690 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
276a0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67 2d  {.          pPg-
276b0 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48 44 52 5f  >flags |= PGHDR_
276c0 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20 20 20 20  NEED_SYNC;.     
276d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65       pPager->nee
276e0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
276f0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
27700 20 41 6e 20 65 72 72 6f 72 20 68 61 73 20 6f 63   An error has oc
27710 63 75 72 65 64 20 77 72 69 74 69 6e 67 20 74 6f  cured writing to
27720 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
27730 65 2e 20 54 68 65 20 0a 20 20 20 20 20 20 20 20  e. The .        
27740 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  ** transaction w
27750 69 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61  ill be rolled ba
27760 63 6b 20 62 79 20 74 68 65 20 6c 61 79 65 72 20  ck by the layer 
27770 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a  above..        *
27780 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  /.        if( rc
27790 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
277a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
277b0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  rc;.        }.. 
277c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
277d0 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61  Rec++;.        a
277e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
277f0 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
27800 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
27810 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70 50  ite3BitvecSet(pP
27820 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
27830 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
27840 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
27850 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
27860 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
27870 72 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rt( rc==SQLITE_O
27880 4b 20 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f  K || rc==SQLITE_
27890 4e 4f 4d 45 4d 20 29 3b 0a 20 20 20 20 20 20 20  NOMEM );.       
278a0 20 72 63 20 7c 3d 20 61 64 64 54 6f 53 61 76 65   rc |= addToSave
278b0 70 6f 69 6e 74 42 69 74 76 65 63 73 28 70 50 61  pointBitvecs(pPa
278c0 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  ger, pPg->pgno);
278d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
278e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
278f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
27900 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  rc==SQLITE_NOMEM
27910 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
27920 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
27930 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
27940 20 20 20 20 20 20 20 20 69 66 28 20 21 70 50 61          if( !pPa
27950 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
27960 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ted && !pPager->
27970 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  noSync ){.      
27980 20 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c      pPg->flags |
27990 3d 20 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e  = PGHDR_NEED_SYN
279a0 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  C;.          pPa
279b0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
279c0 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
279d0 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28       PAGERTRACE(
279e0 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
279f0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
27a00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
27a10 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
27a20 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 0a  er), pPg->pgno,.
27a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
27a40 28 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44  (pPg->flags&PGHD
27a50 52 5f 4e 45 45 44 5f 53 59 4e 43 29 3f 31 3a 30  R_NEED_SYNC)?1:0
27a60 29 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  )));.      }.   
27a70 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
27a80 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
27a90 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e  urnal is open an
27aa0 64 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  d the page is no
27ab0 74 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20  t in it,.    ** 
27ac0 74 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63  then write the c
27ad0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74  urrent page to t
27ae0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
27af0 72 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74  rnal.  Note that
27b00 0a 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74  .    ** the stat
27b10 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f  ement journal fo
27b20 72 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f  rmat differs fro
27b30 6d 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a  m the standard j
27b40 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20  ournal format.  
27b50 20 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20    ** in that it 
27b60 6f 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73  omits the checks
27b70 75 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64  ums and the head
27b80 65 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  er..    */.    i
27b90 66 28 20 73 75 62 6a 52 65 71 75 69 72 65 73 50  f( subjRequiresP
27ba0 61 67 65 28 70 50 67 29 20 29 7b 0a 20 20 20 20  age(pPg) ){.    
27bb0 20 20 72 63 20 3d 20 73 75 62 6a 6f 75 72 6e 61    rc = subjourna
27bc0 6c 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20  lPage(pPg);.    
27bd0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
27be0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
27bf0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
27c00 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
27c10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
27c20 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
27c30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
27c40 69 7a 65 3c 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  ize<pPg->pgno ){
27c50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
27c60 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
27c70 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
27c80 3e 64 62 53 69 7a 65 3d 3d 28 50 41 47 45 52 5f  >dbSize==(PAGER_
27c90 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 2d  MJ_PGNO(pPager)-
27ca0 31 29 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  1) ){.      pPag
27cb0 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20  er->dbSize++;.  
27cc0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
27cd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
27ce0 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
27cf0 73 20 77 72 69 74 65 61 62 6c 65 2e 20 54 68 69  s writeable. Thi
27d00 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62  s routine must b
27d10 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20  e called before 
27d20 0a 2a 2a 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  .** making chang
27d30 65 73 20 74 6f 20 61 20 70 61 67 65 2e 20 54 68  es to a page. Th
27d40 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 68  e caller must ch
27d50 65 63 6b 20 74 68 65 20 72 65 74 75 72 6e 20 76  eck the return v
27d60 61 6c 75 65 20 0a 2a 2a 20 6f 66 20 74 68 69 73  alue .** of this
27d70 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 62 65   function and be
27d80 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 20   careful not to 
27d90 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
27da0 64 61 74 61 20 75 6e 6c 65 73 73 20 0a 2a 2a 20  data unless .** 
27db0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  this routine ret
27dc0 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
27dd0 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
27de0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
27df0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
27e00 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
27e10 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
27e20 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
27e30 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
27e40 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
27e50 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
27e60 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
27e70 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
27e80 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
27e90 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
27ea0 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
27eb0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
27ec0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
27ed0 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
27ee0 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f  **.** If an erro
27ef0 72 20 6f 63 63 75 72 73 2c 20 53 51 4c 49 54 45  r occurs, SQLITE
27f00 5f 4e 4f 4d 45 4d 20 6f 72 20 61 6e 20 49 4f 20  _NOMEM or an IO 
27f10 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
27f20 74 75 72 6e 65 64 0a 2a 2a 20 61 73 20 61 70 70  turned.** as app
27f30 72 6f 70 72 69 61 74 65 2e 20 4f 74 68 65 72 77  ropriate. Otherw
27f40 69 73 65 2c 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  ise, SQLITE_OK..
27f50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
27f60 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
27f70 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
27f80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
27f90 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
27fa0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
27fb0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
27fc0 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
27fd0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
27fe0 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
27ff0 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
28000 65 53 69 7a 65 29 3b 0a 0a 20 20 69 66 28 20 6e  eSize);..  if( n
28010 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
28020 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
28030 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
28040 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
28050 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
28060 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
28070 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
28080 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
28090 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
280a0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
280b0 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
280c0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
280d0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
280e0 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
280f0 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
28100 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
28110 20 69 6e 74 20 69 69 3b 20 20 20 20 20 20 20 20   int ii;        
28120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
28130 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
28140 20 20 69 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d    int needSync =
28150 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54   0;         /* T
28160 72 75 65 20 69 66 20 61 6e 79 20 70 61 67 65 20  rue if any page 
28170 68 61 73 20 50 47 48 44 52 5f 4e 45 45 44 5f 53  has PGHDR_NEED_S
28180 59 4e 43 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 53  YNC */..    /* S
28190 65 74 20 74 68 65 20 64 6f 4e 6f 74 53 79 6e 63  et the doNotSync
281a0 20 66 6c 61 67 20 74 6f 20 31 2e 20 54 68 69 73   flag to 1. This
281b0 20 69 73 20 62 65 63 61 75 73 65 20 77 65 20 63   is because we c
281c0 61 6e 6e 6f 74 20 61 6c 6c 6f 77 20 61 20 6a 6f  annot allow a jo
281d0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 68 65 61  urnal.    ** hea
281e0 64 65 72 20 74 6f 20 62 65 20 77 72 69 74 74 65  der to be writte
281f0 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 61  n between the pa
28200 67 65 73 20 6a 6f 75 72 6e 61 6c 65 64 20 62 79  ges journaled by
28210 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a   this function..
28220 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72      */.    asser
28230 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20  t( !MEMDB );.   
28240 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
28250 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b  >doNotSync==0 );
28260 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
28270 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20  otSync = 1;..   
28280 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61   /* This trick a
28290 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68  ssumes that both
282a0 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61   the page-size a
282b0 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61  nd sector-size a
282c0 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74  re.    ** an int
282d0 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e  eger power of 2.
282e0 20 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c   It sets variabl
282f0 65 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65  e pg1 to the ide
28300 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f  ntifier.    ** o
28310 66 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  f the first page
28320 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
28330 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
28340 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31  ..    */.    pg1
28350 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31   = ((pPg->pgno-1
28360 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65  ) & ~(nPagePerSe
28370 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20  ctor-1)) + 1;.. 
28380 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50     sqlite3PagerP
28390 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2c  agecount(pPager,
283a0 20 28 69 6e 74 20 2a 29 26 6e 50 61 67 65 43 6f   (int *)&nPageCo
283b0 75 6e 74 29 3b 0a 20 20 20 20 69 66 28 20 70 50  unt);.    if( pP
283c0 67 2d 3e 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75  g->pgno>nPageCou
283d0 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67  nt ){.      nPag
283e0 65 20 3d 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d  e = (pPg->pgno -
283f0 20 70 67 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c   pg1)+1;.    }el
28400 73 65 20 69 66 28 20 28 70 67 31 2b 6e 50 61 67  se if( (pg1+nPag
28410 65 50 65 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50  ePerSector-1)>nP
28420 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20  ageCount ){.    
28430 20 20 6e 50 61 67 65 20 3d 20 6e 50 61 67 65 43    nPage = nPageC
28440 6f 75 6e 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20  ount+1-pg1;.    
28450 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 50 61  }else{.      nPa
28460 67 65 20 3d 20 6e 50 61 67 65 50 65 72 53 65 63  ge = nPagePerSec
28470 74 6f 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  tor;.    }.    a
28480 73 73 65 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a  ssert(nPage>0);.
28490 20 20 20 20 61 73 73 65 72 74 28 70 67 31 3c 3d      assert(pg1<=
284a0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
284b0 61 73 73 65 72 74 28 28 70 67 31 2b 6e 50 61 67  assert((pg1+nPag
284c0 65 29 3e 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a  e)>pPg->pgno);..
284d0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69      for(ii=0; ii
284e0 3c 6e 50 61 67 65 20 26 26 20 72 63 3d 3d 53 51  <nPage && rc==SQ
284f0 4c 49 54 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a  LITE_OK; ii++){.
28500 20 20 20 20 20 20 50 67 6e 6f 20 70 67 20 3d 20        Pgno pg = 
28510 70 67 31 2b 69 69 3b 0a 20 20 20 20 20 20 50 67  pg1+ii;.      Pg
28520 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  Hdr *pPage;.    
28530 20 20 69 66 28 20 70 67 3d 3d 70 50 67 2d 3e 70    if( pg==pPg->p
28540 67 6e 6f 20 7c 7c 20 21 73 71 6c 69 74 65 33 42  gno || !sqlite3B
28550 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
28560 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
28570 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
28580 20 70 67 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47   pg!=PAGER_MJ_PG
28590 4e 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  NO(pPager) ){.  
285a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
285b0 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
285c0 67 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29  ger, pg, &pPage)
285d0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
285e0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
285f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
28600 3d 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50  = pager_write(pP
28610 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
28620 20 20 69 66 28 20 70 50 61 67 65 2d 3e 66 6c 61    if( pPage->fla
28630 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
28640 4e 43 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NC ){.          
28650 20 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31      needSync = 1
28660 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
28670 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
28680 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
28690 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
286a0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
286b0 55 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  Unref(pPage);.  
286c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
286d0 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20    }.      }else 
286e0 69 66 28 20 28 70 50 61 67 65 20 3d 20 70 61 67  if( (pPage = pag
286f0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
28700 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a 20 20 20  , pg))!=0 ){.   
28710 20 20 20 20 20 69 66 28 20 70 50 61 67 65 2d 3e       if( pPage->
28720 66 6c 61 67 73 26 50 47 48 44 52 5f 4e 45 45 44  flags&PGHDR_NEED
28730 5f 53 59 4e 43 20 29 7b 0a 20 20 20 20 20 20 20  _SYNC ){.       
28740 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
28750 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28760 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
28770 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20  nref(pPage);.   
28780 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
28790 2f 2a 20 49 66 20 74 68 65 20 50 47 48 44 52 5f  /* If the PGHDR_
287a0 4e 45 45 44 5f 53 59 4e 43 20 66 6c 61 67 20 69  NEED_SYNC flag i
287b0 73 20 73 65 74 20 66 6f 72 20 61 6e 79 20 6f 66  s set for any of
287c0 20 74 68 65 20 6e 50 61 67 65 20 70 61 67 65 73   the nPage pages
287d0 20 0a 20 20 20 20 2a 2a 20 73 74 61 72 74 69 6e   .    ** startin
287e0 67 20 61 74 20 70 67 31 2c 20 74 68 65 6e 20 69  g at pg1, then i
287f0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 65  t needs to be se
28800 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65  t for all of the
28810 6d 2e 20 42 65 63 61 75 73 65 0a 20 20 20 20 2a  m. Because.    *
28820 2a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 79  * writing to any
28830 20 6f 66 20 74 68 65 73 65 20 6e 50 61 67 65 20   of these nPage 
28840 70 61 67 65 73 20 6d 61 79 20 64 61 6d 61 67 65  pages may damage
28850 20 74 68 65 20 6f 74 68 65 72 73 2c 20 74 68 65   the others, the
28860 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
28870 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e 74 61 69  file must contai
28880 6e 20 73 79 6e 63 28 29 65 64 20 63 6f 70 69 65  n sync()ed copie
28890 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74 68 65 6d  s of all of them
288a0 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72 65 20 61  .    ** before a
288b0 6e 79 20 6f 66 20 74 68 65 6d 20 63 61 6e 20 62  ny of them can b
288c0 65 20 77 72 69 74 74 65 6e 20 6f 75 74 20 74 6f  e written out to
288d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
288e0 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
288f0 66 28 20 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  f( needSync ){. 
28900 20 20 20 20 20 61 73 73 65 72 74 28 20 21 4d 45       assert( !ME
28910 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 6e  MDB && pPager->n
28920 6f 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  oSync==0 );.    
28930 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
28940 50 61 67 65 20 26 26 20 6e 65 65 64 53 79 6e 63  Page && needSync
28950 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
28960 20 50 67 48 64 72 20 2a 70 50 61 67 65 20 3d 20   PgHdr *pPage = 
28970 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
28980 67 65 72 2c 20 70 67 31 2b 69 69 29 3b 0a 20 20  ger, pg1+ii);.  
28990 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 20        if( pPage 
289a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  ){.          pPa
289b0 67 65 2d 3e 66 6c 61 67 73 20 7c 3d 20 50 47 48  ge->flags |= PGH
289c0 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a 20 20  DR_NEED_SYNC;.  
289d0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
289e0 61 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29  agerUnref(pPage)
289f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
28a00 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
28a10 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e  (pPager->needSyn
28a20 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 61  c);.    }..    a
28a30 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
28a40 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a 20  oNotSync==1 );. 
28a50 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74     pPager->doNot
28a60 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  Sync = 0;.  }els
28a70 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
28a80 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65 29  r_write(pDbPage)
28a90 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
28aa0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
28ab0 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 70  rn TRUE if the p
28ac0 61 67 65 20 67 69 76 65 6e 20 69 6e 20 74 68 65  age given in the
28ad0 20 61 72 67 75 6d 65 6e 74 20 77 61 73 20 70 72   argument was pr
28ae0 65 76 69 6f 75 73 6c 79 20 70 61 73 73 65 64 0a  eviously passed.
28af0 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ** to sqlite3Pag
28b00 65 72 57 72 69 74 65 28 29 2e 20 20 49 6e 20 6f  erWrite().  In o
28b10 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 74 75  ther words, retu
28b20 72 6e 20 54 52 55 45 20 69 66 20 69 74 20 69 73  rn TRUE if it is
28b30 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65   ok.** to change
28b40 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b50 74 68 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  the page..*/.#if
28b60 6e 64 65 66 20 4e 44 45 42 55 47 0a 69 6e 74 20  ndef NDEBUG.int 
28b70 73 71 6c 69 74 65 33 50 61 67 65 72 49 73 77 72  sqlite3PagerIswr
28b80 69 74 65 61 62 6c 65 28 44 62 50 61 67 65 20 2a  iteable(DbPage *
28b90 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  pPg){.  return p
28ba0 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f  Pg->flags&PGHDR_
28bb0 44 49 52 54 59 3b 0a 7d 0a 23 65 6e 64 69 66 0a  DIRTY;.}.#endif.
28bc0 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f  ./*.** A call to
28bd0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65   this routine te
28be0 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74 68  lls the pager th
28bf0 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  at it is not nec
28c00 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69  essary to.** wri
28c10 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69  te the informati
28c20 6f 6e 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62  on on page pPg b
28c30 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c  ack to the disk,
28c40 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20   even though.** 
28c50 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74 20  that page might 
28c60 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72  be marked as dir
28c70 74 79 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e  ty.  This happen
28c80 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  s, for example, 
28c90 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70 61 67 65  when.** the page
28ca0 20 68 61 73 20 62 65 65 6e 20 61 64 64 65 64 20   has been added 
28cb0 61 73 20 61 20 6c 65 61 66 20 6f 66 20 74 68 65  as a leaf of the
28cc0 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 73 6f   freelist and so
28cd0 20 69 74 73 0a 2a 2a 20 63 6f 6e 74 65 6e 74 20   its.** content 
28ce0 6e 6f 20 6c 6f 6e 67 65 72 20 6d 61 74 74 65 72  no longer matter
28cf0 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65  s..**.** The ove
28d00 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20  rlying software 
28d10 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73  layer calls this
28d20 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c   routine when al
28d30 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a  l of the data.**
28d40 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61   on the given pa
28d50 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20 54 68  ge is unused. Th
28d60 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
28d70 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
28d80 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
28d90 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
28da0 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
28db0 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
28dc0 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
28dd0 69 6f 6e 20 63 61 6e 20 71 75 61 64 72 75 70 6c  ion can quadrupl
28de0 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c  e the speed of l
28df0 61 72 67 65 20 0a 2a 2a 20 44 45 4c 45 54 45 20  arge .** DELETE 
28e00 6f 70 65 72 61 74 69 6f 6e 73 2e 0a 2a 2f 0a 76  operations..*/.v
28e10 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
28e20 44 6f 6e 74 57 72 69 74 65 28 50 67 48 64 72 20  DontWrite(PgHdr 
28e30 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
28e40 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
28e50 61 67 65 72 3b 0a 20 20 69 66 28 20 28 70 50 67  ager;.  if( (pPg
28e60 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44 49  ->flags&PGHDR_DI
28e70 52 54 59 29 20 26 26 20 70 50 61 67 65 72 2d 3e  RTY) && pPager->
28e80 6e 53 61 76 65 70 6f 69 6e 74 3d 3d 30 20 29 7b  nSavepoint==0 ){
28e90 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 28  .    PAGERTRACE(
28ea0 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
28eb0 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
28ec0 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49  Pg->pgno, PAGERI
28ed0 44 28 70 50 61 67 65 72 29 29 29 3b 0a 20 20 20  D(pPager)));.   
28ee0 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e   IOTRACE(("CLEAN
28ef0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
28f00 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20  r, pPg->pgno)). 
28f10 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
28f20 20 50 47 48 44 52 5f 44 4f 4e 54 5f 57 52 49 54   PGHDR_DONT_WRIT
28f30 45 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  E;.#ifdef SQLITE
28f40 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
28f50 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
28f60 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
28f70 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
28f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
28f90 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
28fa0 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
28fb0 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 64  e value of the d
28fc0 61 74 61 62 61 73 65 20 66 69 6c 65 20 0a 2a 2a  atabase file .**
28fd0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
28fe0 20 73 74 6f 72 65 64 20 61 73 20 61 20 34 2d 62   stored as a 4-b
28ff0 79 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69  yte big-endian i
29000 6e 74 65 67 65 72 20 73 74 61 72 74 69 6e 67 20  nteger starting 
29010 61 74 20 0a 2a 2a 20 62 79 74 65 20 6f 66 66 73  at .** byte offs
29020 65 74 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  et 24 of the pag
29030 65 72 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 49  er file..**.** I
29040 66 20 74 68 65 20 69 73 44 69 72 65 63 74 20 66  f the isDirect f
29050 6c 61 67 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  lag is zero, the
29060 6e 20 74 68 69 73 20 69 73 20 64 6f 6e 65 20 62  n this is done b
29070 79 20 63 61 6c 6c 69 6e 67 20 0a 2a 2a 20 73 71  y calling .** sq
29080 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
29090 29 20 6f 6e 20 70 61 67 65 20 31 2c 20 74 68 65  ) on page 1, the
290a0 6e 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20  n modifying the 
290b0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a  contents of the.
290c0 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 20 49 6e  ** page data. In
290d0 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20 66   this case the f
290e0 69 6c 65 20 77 69 6c 6c 20 62 65 20 75 70 64 61  ile will be upda
290f0 74 65 64 20 77 68 65 6e 20 74 68 65 20 63 75 72  ted when the cur
29100 72 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  rent.** transact
29110 69 6f 6e 20 69 73 20 63 6f 6d 6d 69 74 74 65 64  ion is committed
29120 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 73 44 69  ..**.** The isDi
29130 72 65 63 74 20 66 6c 61 67 20 6d 61 79 20 6f 6e  rect flag may on
29140 6c 79 20 62 65 20 6e 6f 6e 2d 7a 65 72 6f 20 69  ly be non-zero i
29150 66 20 74 68 65 20 6c 69 62 72 61 72 79 20 77 61  f the library wa
29160 73 20 63 6f 6d 70 69 6c 65 64 0a 2a 2a 20 77 69  s compiled.** wi
29170 74 68 20 74 68 65 20 53 51 4c 49 54 45 5f 45 4e  th the SQLITE_EN
29180 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54  ABLE_ATOMIC_WRIT
29190 45 20 6d 61 63 72 6f 20 64 65 66 69 6e 65 64 2e  E macro defined.
291a0 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 0a 2a   In this case,.*
291b0 2a 20 69 66 20 69 73 44 69 72 65 63 74 20 69 73  * if isDirect is
291c0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
291d0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
291e0 65 20 69 73 20 75 70 64 61 74 65 64 20 64 69 72  e is updated dir
291f0 65 63 74 6c 79 0a 2a 2a 20 62 79 20 77 72 69 74  ectly.** by writ
29200 69 6e 67 20 61 6e 20 75 70 64 61 74 65 64 20 76  ing an updated v
29210 65 72 73 69 6f 6e 20 6f 66 20 70 61 67 65 20 31  ersion of page 1
29220 20 75 73 69 6e 67 20 61 20 63 61 6c 6c 20 74 6f   using a call to
29230 20 74 68 65 20 0a 2a 2a 20 73 71 6c 69 74 65 33   the .** sqlite3
29240 4f 73 57 72 69 74 65 28 29 20 66 75 6e 63 74 69  OsWrite() functi
29250 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
29260 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  t pager_incr_cha
29270 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72  ngecounter(Pager
29280 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73   *pPager, int is
29290 44 69 72 65 63 74 4d 6f 64 65 29 7b 0a 20 20 69  DirectMode){.  i
292a0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
292b0 4b 3b 0a 0a 20 20 2f 2a 20 44 65 63 6c 61 72 65  K;..  /* Declare
292c0 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 7a 65 20   and initialize 
292d0 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
292e0 20 27 69 73 44 69 72 65 63 74 27 2e 20 49 66 20   'isDirect'. If 
292f0 74 68 65 0a 20 20 2a 2a 20 61 74 6f 6d 69 63 2d  the.  ** atomic-
29300 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69  write optimizati
29310 6f 6e 20 69 73 20 65 6e 61 62 6c 65 64 20 69 6e  on is enabled in
29320 20 74 68 69 73 20 62 75 69 6c 64 2c 20 74 68 65   this build, the
29330 6e 20 69 73 44 69 72 65 63 74 0a 20 20 2a 2a 20  n isDirect.  ** 
29340 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
29350 6f 20 74 68 65 20 76 61 6c 75 65 20 70 61 73 73  o the value pass
29360 65 64 20 61 73 20 74 68 65 20 69 73 44 69 72 65  ed as the isDire
29370 63 74 4d 6f 64 65 20 70 61 72 61 6d 65 74 65 72  ctMode parameter
29380 0a 20 20 2a 2a 20 74 6f 20 74 68 69 73 20 66 75  .  ** to this fu
29390 6e 63 74 69 6f 6e 2e 20 4f 74 68 65 72 77 69 73  nction. Otherwis
293a0 65 2c 20 69 74 20 69 73 20 61 6c 77 61 79 73 20  e, it is always 
293b0 73 65 74 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 2a  set to zero..  *
293c0 2a 0a 20 20 2a 2a 20 54 68 65 20 69 64 65 61 20  *.  ** The idea 
293d0 69 73 20 74 68 61 74 20 69 66 20 74 68 65 20 61  is that if the a
293e0 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69  tomic-write opti
293f0 6d 69 7a 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a  mization is not.
29400 20 20 2a 2a 20 65 6e 61 62 6c 65 64 20 61 74 20    ** enabled at 
29410 63 6f 6d 70 69 6c 65 20 74 69 6d 65 2c 20 74 68  compile time, th
29420 65 20 63 6f 6d 70 69 6c 65 72 20 63 61 6e 20 6f  e compiler can o
29430 6d 69 74 20 74 68 65 20 74 65 73 74 73 20 6f 66  mit the tests of
29440 0a 20 20 2a 2a 20 27 69 73 44 69 72 65 63 74 27  .  ** 'isDirect'
29450 20 62 65 6c 6f 77 2c 20 61 73 20 77 65 6c 6c 20   below, as well 
29460 61 73 20 74 68 65 20 62 6c 6f 63 6b 20 65 6e 63  as the block enc
29470 6c 6f 73 65 64 20 69 6e 20 74 68 65 0a 20 20 2a  losed in the.  *
29480 2a 20 22 69 66 28 20 69 73 44 69 72 65 63 74 20  * "if( isDirect 
29490 29 22 20 63 6f 6e 64 69 74 69 6f 6e 2e 0a 20 20  )" condition..  
294a0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
294b0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
294c0 57 52 49 54 45 0a 20 20 63 6f 6e 73 74 20 69 6e  WRITE.  const in
294d0 74 20 69 73 44 69 72 65 63 74 20 3d 20 30 3b 0a  t isDirect = 0;.
294e0 20 20 61 73 73 65 72 74 28 20 69 73 44 69 72 65    assert( isDire
294f0 63 74 4d 6f 64 65 3d 3d 30 20 29 3b 0a 20 20 55  ctMode==0 );.  U
29500 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
29510 69 73 44 69 72 65 63 74 4d 6f 64 65 29 3b 0a 23  isDirectMode);.#
29520 65 6c 73 65 0a 20 20 63 6f 6e 73 74 20 69 6e 74  else.  const int
29530 20 69 73 44 69 72 65 63 74 20 3d 20 69 73 44 69   isDirect = isDi
29540 72 65 63 74 4d 6f 64 65 3b 0a 23 65 6e 64 69 66  rectMode;.#endif
29550 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
29560 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
29570 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 69  _RESERVED );.  i
29580 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61 6e  f( !pPager->chan
29590 67 65 43 6f 75 6e 74 44 6f 6e 65 20 26 26 20 70  geCountDone && p
295a0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20  Pager->dbSize>0 
295b0 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
295c0 67 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20  gHdr;           
295d0 20 20 20 20 20 2f 2a 20 52 65 66 65 72 65 6e 63       /* Referenc
295e0 65 20 74 6f 20 70 61 67 65 20 31 20 2a 2f 0a 20  e to page 1 */. 
295f0 20 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f     u32 change_co
29600 75 6e 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  unter;          
29610 20 2f 2a 20 49 6e 69 74 69 61 6c 20 76 61 6c 75   /* Initial valu
29620 65 20 6f 66 20 63 68 61 6e 67 65 2d 63 6f 75 6e  e of change-coun
29630 74 65 72 20 66 69 65 6c 64 20 2a 2f 0a 0a 20 20  ter field */..  
29640 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
29650 72 2d 3e 74 65 6d 70 46 69 6c 65 20 26 26 20 69  r->tempFile && i
29660 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e 66 64  sOpen(pPager->fd
29670 29 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 4f 70 65  ) );..    /* Ope
29680 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65 20  n page 1 of the 
29690 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e 67  file for writing
296a0 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 71  . */.    rc = sq
296b0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50  lite3PagerGet(pP
296c0 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64 72  ager, 1, &pPgHdr
296d0 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
296e0 50 67 48 64 72 3d 3d 30 20 7c 7c 20 72 63 3d 3d  PgHdr==0 || rc==
296f0 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 0a 20 20  SQLITE_OK );..  
29700 20 20 2f 2a 20 49 66 20 70 61 67 65 20 6f 6e 65    /* If page one
29710 20 77 61 73 20 66 65 74 63 68 65 64 20 73 75 63   was fetched suc
29720 63 65 73 73 66 75 6c 6c 79 2c 20 61 6e 64 20 74  cessfully, and t
29730 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
29740 6e 6f 74 0a 20 20 20 20 2a 2a 20 6f 70 65 72 61  not.    ** opera
29750 74 69 6e 67 20 69 6e 20 64 69 72 65 63 74 2d 6d  ting in direct-m
29760 6f 64 65 2c 20 6d 61 6b 65 20 70 61 67 65 20 31  ode, make page 1
29770 20 77 72 69 74 61 62 6c 65 2e 0a 20 20 20 20 2a   writable..    *
29780 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  /.    if( rc==SQ
29790 4c 49 54 45 5f 4f 4b 20 26 26 20 21 69 73 44 69  LITE_OK && !isDi
297a0 72 65 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63  rect ){.      rc
297b0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57   = sqlite3PagerW
297c0 72 69 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20  rite(pPgHdr);.  
297d0 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 72 63 3d    }..    if( rc=
297e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
297f0 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74      /* Increment
29800 20 74 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20   the value just 
29810 72 65 61 64 20 61 6e 64 20 77 72 69 74 65 20 69  read and write i
29820 74 20 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32  t back to byte 2
29830 34 2e 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 6e  4. */.      chan
29840 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71 6c  ge_counter = sql
29850 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75 38  ite3Get4byte((u8
29860 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  *)pPager->dbFile
29870 56 65 72 73 29 3b 0a 20 20 20 20 20 20 63 68 61  Vers);.      cha
29880 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
29890 20 20 20 20 20 70 75 74 33 32 62 69 74 73 28 28       put32bits((
298a0 28 63 68 61 72 2a 29 70 50 67 48 64 72 2d 3e 70  (char*)pPgHdr->p
298b0 44 61 74 61 29 2b 32 34 2c 20 63 68 61 6e 67 65  Data)+24, change
298c0 5f 63 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20  _counter);..    
298d0 20 20 2f 2a 20 49 66 20 72 75 6e 6e 69 6e 67 20    /* If running 
298e0 69 6e 20 64 69 72 65 63 74 20 6d 6f 64 65 2c 20  in direct mode, 
298f0 77 72 69 74 65 20 74 68 65 20 63 6f 6e 74 65 6e  write the conten
29900 74 73 20 6f 66 20 70 61 67 65 20 31 20 74 6f 20  ts of page 1 to 
29910 74 68 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  the file. */.   
29920 20 20 20 69 66 28 20 69 73 44 69 72 65 63 74 20     if( isDirect 
29930 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
29940 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 70 50   void *zBuf = pP
29950 67 48 64 72 2d 3e 70 44 61 74 61 3b 0a 20 20 20  gHdr->pData;.   
29960 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
29970 67 65 72 2d 3e 64 62 46 69 6c 65 53 69 7a 65 3e  ger->dbFileSize>
29980 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  0 );.        rc 
29990 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
299a0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75  (pPager->fd, zBu
299b0 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
299c0 69 7a 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ize, 0);.      }
299d0 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 65 76  ..      /* If ev
299e0 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
299f0 20 73 65 74 20 74 68 65 20 63 68 61 6e 67 65 43   set the changeC
29a00 6f 75 6e 74 44 6f 6e 65 20 66 6c 61 67 2e 20 2a  ountDone flag. *
29a10 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  /.      if( rc==
29a20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29a30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
29a40 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
29a50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29a60 0a 20 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  .    /* Release 
29a70 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
29a80 63 65 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  ce. */.    sqlit
29a90 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
29aa0 48 64 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hdr);.  }.  retu
29ab0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
29ac0 53 79 6e 63 20 74 68 65 20 70 61 67 65 72 20 66  Sync the pager f
29ad0 69 6c 65 20 74 6f 20 64 69 73 6b 2e 20 54 68 69  ile to disk. Thi
29ae0 73 20 69 73 20 61 20 6e 6f 2d 6f 70 20 66 6f 72  s is a no-op for
29af0 20 69 6e 2d 6d 65 6d 6f 72 79 20 66 69 6c 65 73   in-memory files
29b00 0a 2a 2a 20 6f 72 20 70 61 67 65 73 20 77 69 74  .** or pages wit
29b10 68 20 74 68 65 20 50 61 67 65 72 2e 6e 6f 53 79  h the Pager.noSy
29b20 6e 63 20 66 6c 61 67 20 73 65 74 2e 0a 2a 2a 0a  nc flag set..**.
29b30 2a 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c  ** If successful
29b40 2c 20 6f 72 20 63 61 6c 6c 65 64 20 6f 6e 20 61  , or called on a
29b50 20 70 61 67 65 72 20 66 6f 72 20 77 68 69 63 68   pager for which
29b60 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2c 20   it is a no-op, 
29b70 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  this.** function
29b80 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
29b90 4f 4b 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  OK. Otherwise, a
29ba0 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
29bb0 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
29bc0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
29bd0 53 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  Sync(Pager *pPag
29be0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 20 20  er){.  int rc;  
29bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
29c10 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20  eturn code */.  
29c20 69 66 28 20 4d 45 4d 44 42 20 7c 7c 20 70 50 61  if( MEMDB || pPa
29c30 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20  ger->noSync ){. 
29c40 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
29c50 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
29c60 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
29c70 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  nc(pPager->fd, p
29c80 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
29c90 73 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  s);.  }.  return
29ca0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
29cb0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
29cc0 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
29cd0 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
29ce0 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
29cf0 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
29d00 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
29d10 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
29d20 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
29d30 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
29d40 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
29d50 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
29d60 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
29d70 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
29d80 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
29d90 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
29da0 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
29db0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
29dc0 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
29dd0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 54 68 65 20  :.**.**   * The 
29de0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
29df0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20 69 73 20  ange-counter is 
29e00 75 70 64 61 74 65 64 2c 0a 2a 2a 20 20 20 2a 20  updated,.**   * 
29e10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
29e20 79 6e 63 65 64 20 28 75 6e 6c 65 73 73 20 74 68  ynced (unless th
29e30 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
29e40 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20 75  ptimization is u
29e50 73 65 64 29 2c 0a 2a 2a 20 20 20 2a 20 61 6c 6c  sed),.**   * all
29e60 20 64 69 72 74 79 20 70 61 67 65 73 20 61 72 65   dirty pages are
29e70 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
29e80 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 0a  database file, .
29e90 2a 2a 20 20 20 2a 20 74 68 65 20 64 61 74 61 62  **   * the datab
29ea0 61 73 65 20 66 69 6c 65 20 69 73 20 74 72 75 6e  ase file is trun
29eb0 63 61 74 65 64 20 28 69 66 20 72 65 71 75 69 72  cated (if requir
29ec0 65 64 29 2c 20 61 6e 64 0a 2a 2a 20 20 20 2a 20  ed), and.**   * 
29ed0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
29ee0 65 20 73 79 6e 63 65 64 2e 20 0a 2a 2a 0a 2a 2a  e synced. .**.**
29ef0 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
29f00 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20  that remains to 
29f10 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
29f20 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 66 69 6e  action is to fin
29f30 61 6c 69 7a 65 20 0a 2a 2a 20 28 64 65 6c 65 74  alize .** (delet
29f40 65 2c 20 74 72 75 6e 63 61 74 65 20 6f 72 20 7a  e, truncate or z
29f50 65 72 6f 20 74 68 65 20 66 69 72 73 74 20 70 61  ero the first pa
29f60 72 74 20 6f 66 29 20 74 68 65 20 6a 6f 75 72 6e  rt of) the journ
29f70 61 6c 20 66 69 6c 65 20 28 6f 72 20 0a 2a 2a 20  al file (or .** 
29f80 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
29f90 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
29fa0 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a  f specified)..**
29fb0 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66  .** Note that if
29fc0 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20   zMaster==NULL, 
29fd0 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76  this does not ov
29fe0 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69 6f  erwrite a previo
29ff0 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73  us value.** pass
2a000 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33  ed to an sqlite3
2a010 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65  PagerCommitPhase
2a020 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  One() call..**.*
2a030 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70  * If the final p
2a040 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e  arameter - noSyn
2a050 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65  c - is true, the
2a060 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
2a070 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73  ile itself.** is
2a080 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65   not synced. The
2a090 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c   caller must cal
2a0a0 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  l sqlite3PagerSy
2a0b0 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f  nc() directly to
2a0c0 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74  .** sync the dat
2a0d0 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
2a0e0 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74  e calling Commit
2a0f0 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65  PhaseTwo() to de
2a100 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  lete the.** jour
2a110 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73  nal file in this
2a120 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   case..*/.int sq
2a130 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
2a140 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65  PhaseOne(.  Page
2a150 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20  r *pPager,      
2a160 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2a170 61 67 65 72 20 6f 62 6a 65 63 74 20 2a 2f 0a 20  ager object */. 
2a180 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
2a190 73 74 65 72 2c 20 20 20 20 20 20 20 20 20 20 20  ster,           
2a1a0 20 2f 2a 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c   /* If not NULL,
2a1b0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
2a1c0 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  nal name */.  in
2a1d0 74 20 6e 6f 53 79 6e 63 20 20 20 20 20 20 20 20  t noSync        
2a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a1f0 20 54 72 75 65 20 74 6f 20 6f 6d 69 74 20 74 68   True to omit th
2a200 65 20 78 53 79 6e 63 20 6f 6e 20 74 68 65 20 64  e xSync on the d
2a210 62 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 69  b file */.){.  i
2a220 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
2a230 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  K;             /
2a240 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f  * Return code */
2a250 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
2a260 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
2a270 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72  eturn pPager->er
2a280 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 50 41  rCode;.  }..  PA
2a290 47 45 52 54 52 41 43 45 28 28 22 44 41 54 41 42  GERTRACE(("DATAB
2a2a0 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
2a2b0 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 53 69  s zMaster=%s nSi
2a2c0 7a 65 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20  ze=%d\n", .     
2a2d0 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
2a2e0 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61  me, zMaster, pPa
2a2f0 67 65 72 2d 3e 64 62 53 69 7a 65 29 29 3b 0a 0a  ger->dbSize));..
2a300 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
2a310 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c  an in-memory db,
2a320 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76   or no pages hav
2a330 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
2a340 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20  o, or this.  ** 
2a350 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72  function has alr
2a360 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64  eady been called
2a370 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  , it is a no-op.
2a380 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4d 45 4d 44  .  */.  if( MEMD
2a390 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62 4d  B && pPager->dbM
2a3a0 6f 64 69 66 69 65 64 20 29 7b 0a 20 20 20 20 73  odified ){.    s
2a3b0 71 6c 69 74 65 33 42 61 63 6b 75 70 52 65 73 74  qlite3BackupRest
2a3c0 61 72 74 28 70 50 61 67 65 72 2d 3e 70 42 61 63  art(pPager->pBac
2a3d0 6b 75 70 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  kup);.  }else if
2a3e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
2a3f0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
2a400 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
2a410 69 65 64 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 54  ied ){..    /* T
2a420 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 6c 6f  he following blo
2a430 63 6b 20 75 70 64 61 74 65 73 20 74 68 65 20 63  ck updates the c
2a440 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2e 20 45  hange-counter. E
2a450 78 61 63 74 6c 79 20 68 6f 77 20 69 74 0a 20 20  xactly how it.  
2a460 20 20 2a 2a 20 64 6f 65 73 20 74 68 69 73 20 64    ** does this d
2a470 65 70 65 6e 64 73 20 6f 6e 20 77 68 65 74 68 65  epends on whethe
2a480 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
2a490 6d 69 63 2d 75 70 64 61 74 65 20 6f 70 74 69 6d  mic-update optim
2a4a0 69 7a 61 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 77  ization.    ** w
2a4b0 61 73 20 65 6e 61 62 6c 65 64 20 61 74 20 63 6f  as enabled at co
2a4c0 6d 70 69 6c 65 20 74 69 6d 65 2c 20 61 6e 64 20  mpile time, and 
2a4d0 69 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  if this transact
2a4e0 69 6f 6e 20 6d 65 65 74 73 20 74 68 65 20 0a 20  ion meets the . 
2a4f0 20 20 20 2a 2a 20 72 75 6e 74 69 6d 65 20 63 72     ** runtime cr
2a500 69 74 65 72 69 61 20 74 6f 20 75 73 65 20 74 68  iteria to use th
2a510 65 20 6f 70 65 72 61 74 69 6f 6e 3a 20 0a 20 20  e operation: .  
2a520 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 2a    **.    **    *
2a530 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65 6d   The file-system
2a540 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61 74   supports the at
2a550 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65  omic-write prope
2a560 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20 20  rty for.    **  
2a570 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73 69      blocks of si
2a580 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61 6e  ze page-size, an
2a590 64 20 0a 20 20 20 20 2a 2a 20 20 20 20 2a 20 54  d .    **    * T
2a5a0 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
2a5b0 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
2a5c0 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
2a5d0 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  on, and.    **  
2a5e0 20 20 2a 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    * Exactly one 
2a5f0 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
2a600 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
2a610 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
2a620 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
2a630 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d   ** If the optim
2a640 69 7a 61 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  ization was not 
2a650 65 6e 61 62 6c 65 64 20 61 74 20 63 6f 6d 70 69  enabled at compi
2a660 6c 65 20 74 69 6d 65 2c 20 74 68 65 6e 20 74 68  le time, then th
2a670 65 0a 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 69  e.    ** pager_i
2a680 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2a690 72 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  r() function is 
2a6a0 63 61 6c 6c 65 64 20 74 6f 20 75 70 64 61 74 65  called to update
2a6b0 20 74 68 65 20 63 68 61 6e 67 65 0a 20 20 20 20   the change.    
2a6c0 2a 2a 20 63 6f 75 6e 74 65 72 20 69 6e 20 27 69  ** counter in 'i
2a6d0 6e 64 69 72 65 63 74 2d 6d 6f 64 65 27 2e 20 49  ndirect-mode'. I
2a6e0 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
2a6f0 6f 6e 20 69 73 20 63 6f 6d 70 69 6c 65 64 20 69  on is compiled i
2a700 6e 20 62 75 74 0a 20 20 20 20 2a 2a 20 69 73 20  n but.    ** is 
2a710 6e 6f 74 20 61 70 70 6c 69 63 61 62 6c 65 20 74  not applicable t
2a720 6f 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  o this transacti
2a730 6f 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  on, call sqlite3
2a740 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 29 0a  JournalCreate().
2a750 20 20 20 20 2a 2a 20 74 6f 20 6d 61 6b 65 20 73      ** to make s
2a760 75 72 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ure the journal 
2a770 66 69 6c 65 20 68 61 73 20 61 63 74 75 61 6c 6c  file has actuall
2a780 79 20 62 65 65 6e 20 63 72 65 61 74 65 64 2c 20  y been created, 
2a790 74 68 65 6e 20 63 61 6c 6c 0a 20 20 20 20 2a 2a  then call.    **
2a7a0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2a7b0 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
2a7c0 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
2a7d0 2d 63 6f 75 6e 74 65 72 20 69 6e 20 69 6e 64 69  -counter in indi
2a7e0 72 65 63 74 0a 20 20 20 20 2a 2a 20 6d 6f 64 65  rect.    ** mode
2a7f0 2e 20 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  . .    **.    **
2a800 20 4f 74 68 65 72 77 69 73 65 2c 20 69 66 20 74   Otherwise, if t
2a810 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
2a820 69 73 20 62 6f 74 68 20 65 6e 61 62 6c 65 64 20  is both enabled 
2a830 61 6e 64 20 61 70 70 6c 69 63 61 62 6c 65 2c 0a  and applicable,.
2a840 20 20 20 20 2a 2a 20 74 68 65 6e 20 63 61 6c 6c      ** then call
2a850 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
2a860 67 65 63 6f 75 6e 74 65 72 28 29 20 74 6f 20 75  gecounter() to u
2a870 70 64 61 74 65 20 74 68 65 20 63 68 61 6e 67 65  pdate the change
2a880 2d 63 6f 75 6e 74 65 72 0a 20 20 20 20 2a 2a 20  -counter.    ** 
2a890 69 6e 20 27 64 69 72 65 63 74 27 20 6d 6f 64 65  in 'direct' mode
2a8a0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2a8b0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
2a8c0 77 69 6c 6c 20 6e 65 76 65 72 20 62 65 0a 20 20  will never be.  
2a8d0 20 20 2a 2a 20 63 72 65 61 74 65 64 20 66 6f 72    ** created for
2a8e0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
2a8f0 6e 2e 0a 20 20 20 20 2a 2f 0a 23 69 66 64 65 66  n..    */.#ifdef
2a900 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
2a910 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
2a920 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
2a930 61 73 73 65 72 74 28 20 69 73 4f 70 65 6e 28 70  assert( isOpen(p
2a940 50 61 67 65 72 2d 3e 6a 66 64 29 20 7c 7c 20 70  Pager->jfd) || p
2a950 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
2a960 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
2a970 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20  LMODE_OFF );.   
2a980 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20 26 26   if( !zMaster &&
2a990 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d 3e   isOpen(pPager->
2a9a0 6a 66 64 29 20 0a 20 20 20 20 20 26 26 20 70 50  jfd) .     && pP
2a9b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
2a9c0 3d 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65  ==jrnlBufferSize
2a9d0 28 70 50 61 67 65 72 29 20 0a 20 20 20 20 20 26  (pPager) .     &
2a9e0 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  & pPager->dbSize
2a9f0 3e 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  >=pPager->dbFile
2aa00 53 69 7a 65 0a 20 20 20 20 20 26 26 20 28 30 3d  Size.     && (0=
2aa10 3d 28 70 50 67 20 3d 20 73 71 6c 69 74 65 33 50  =(pPg = sqlite3P
2aa20 63 61 63 68 65 44 69 72 74 79 4c 69 73 74 28 70  cacheDirtyList(p
2aa30 50 61 67 65 72 2d 3e 70 50 43 61 63 68 65 29 29  Pager->pPCache))
2aa40 20 7c 7c 20 30 3d 3d 70 50 67 2d 3e 70 44 69 72   || 0==pPg->pDir
2aa50 74 79 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ty).    ){.     
2aa60 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64   /* Update the d
2aa70 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f  b file change co
2aa80 75 6e 74 65 72 20 76 69 61 20 74 68 65 20 64 69  unter via the di
2aa90 72 65 63 74 2d 77 72 69 74 65 20 6d 65 74 68 6f  rect-write metho
2aaa0 64 2e 20 54 68 65 20 0a 20 20 20 20 20 20 2a 2a  d. The .      **
2aab0 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 6c 6c 20   following call 
2aac0 77 69 6c 6c 20 6d 6f 64 69 66 79 20 74 68 65 20  will modify the 
2aad0 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
2aae0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65  entation of page
2aaf0 20 31 20 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20   1 .      ** to 
2ab00 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70 64 61  include the upda
2ab10 74 65 64 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ted change count
2ab20 65 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74  er and then writ
2ab30 65 20 70 61 67 65 20 31 20 0a 20 20 20 20 20 20  e page 1 .      
2ab40 2a 2a 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  ** directly to t
2ab50 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
2ab60 2e 20 42 65 63 61 75 73 65 20 6f 66 20 74 68 65  . Because of the
2ab70 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 0a 20   atomic-write . 
2ab80 20 20 20 20 20 2a 2a 20 70 72 6f 70 65 72 74 79       ** property
2ab90 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c   of the host fil
2aba0 65 2d 73 79 73 74 65 6d 2c 20 74 68 69 73 20 69  e-system, this i
2abb0 73 20 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f  s safe..      */
2abc0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
2abd0 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
2abe0 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
2abf0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ac00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
2ac10 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
2ac20 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
2ac30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2ac40 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  K ){.        rc 
2ac50 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61  = pager_incr_cha
2ac60 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65  ngecounter(pPage
2ac70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  r, 0);.      }. 
2ac80 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 72     }.#else.    r
2ac90 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
2aca0 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
2acb0 67 65 72 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  ger, 0);.#endif.
2acc0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2acd0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2ace0 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2acf0 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  it;..    /* If t
2ad00 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  his transaction 
2ad10 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74  has made the dat
2ad20 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74  abase smaller, t
2ad30 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20  hen all pages.  
2ad40 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63 61    ** being disca
2ad50 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75 6e  rded by the trun
2ad60 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 77  cation must be w
2ad70 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
2ad80 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
2ad90 65 2e 20 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79  e. This can only
2ada0 20 68 61 70 70 65 6e 20 69 6e 20 61 75 74 6f 2d   happen in auto-
2adb0 76 61 63 75 75 6d 20 6d 6f 64 65 2e 0a 20 20 20  vacuum mode..   
2adc0 20 2a 2a 0a 20 20 20 20 2a 2a 20 42 65 66 6f 72   **.    ** Befor
2add0 65 20 72 65 61 64 69 6e 67 20 74 68 65 20 70 61  e reading the pa
2ade0 67 65 73 20 77 69 74 68 20 70 61 67 65 20 6e 75  ges with page nu
2adf0 6d 62 65 72 73 20 6c 61 72 67 65 72 20 74 68 61  mbers larger tha
2ae00 6e 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 63 75  n the .    ** cu
2ae10 72 72 65 6e 74 20 76 61 6c 75 65 20 6f 66 20 50  rrent value of P
2ae20 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 73 65 74  ager.dbSize, set
2ae30 20 64 62 53 69 7a 65 20 62 61 63 6b 20 74 6f 20   dbSize back to 
2ae40 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 2a 2a  the value.    **
2ae50 20 74 68 61 74 20 69 74 20 74 6f 6f 6b 20 61 74   that it took at
2ae60 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
2ae70 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 4f  e transaction. O
2ae80 74 68 65 72 77 69 73 65 2c 20 74 68 65 0a 20 20  therwise, the.  
2ae90 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
2aea0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2aeb0 72 65 74 75 72 6e 20 7a 65 72 6f 65 64 20 70 61  return zeroed pa
2aec0 67 65 73 20 69 6e 73 74 65 61 64 20 6f 66 20 0a  ges instead of .
2aed0 20 20 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 64      ** reading d
2aee0 61 74 61 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ata from the dat
2aef0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
2af00 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2af10 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
2af20 4d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  M.    if( pPager
2af30 2d 3e 64 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  ->dbSize<pPager-
2af40 3e 64 62 4f 72 69 67 53 69 7a 65 0a 20 20 20 20  >dbOrigSize.    
2af50 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
2af60 6e 61 6c 4d 6f 64 65 21 3d 50 41 47 45 52 5f 4a  nalMode!=PAGER_J
2af70 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 0a  OURNALMODE_OFF .
2af80 20 20 20 20 29 7b 0a 20 20 20 20 20 20 50 67 6e      ){.      Pgn
2af90 6f 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  o i;            
2afa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2afb0 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
2afc0 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
2afd0 20 20 20 20 20 63 6f 6e 73 74 20 50 67 6e 6f 20       const Pgno 
2afe0 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
2aff0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 20 2f  _PGNO(pPager); /
2b000 2a 20 50 65 6e 64 69 6e 67 20 6c 6f 63 6b 20 70  * Pending lock p
2b010 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  age */.      con
2b020 73 74 20 50 67 6e 6f 20 64 62 53 69 7a 65 20 3d  st Pgno dbSize =
2b030 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
2b040 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
2b050 73 65 20 69 6d 61 67 65 20 73 69 7a 65 20 2a 2f  se image size */
2b060 20 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e   .      pPager->
2b070 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
2b080 3e 64 62 4f 72 69 67 53 69 7a 65 3b 0a 20 20 20  >dbOrigSize;.   
2b090 20 20 20 66 6f 72 28 20 69 3d 64 62 53 69 7a 65     for( i=dbSize
2b0a0 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 64  +1; i<=pPager->d
2b0b0 62 4f 72 69 67 53 69 7a 65 3b 20 69 2b 2b 20 29  bOrigSize; i++ )
2b0c0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 73  {.        if( !s
2b0d0 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74  qlite3BitvecTest
2b0e0 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
2b0f0 6e 61 6c 2c 20 69 29 20 26 26 20 69 21 3d 69 53  nal, i) && i!=iS
2b100 6b 69 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20  kip ){.         
2b110 20 50 67 48 64 72 20 2a 70 50 61 67 65 3b 20 20   PgHdr *pPage;  
2b120 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
2b130 67 65 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge to journal */
2b140 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2b150 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
2b160 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67  pPager, i, &pPag
2b170 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
2b180 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
2b190 29 20 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68  ) goto commit_ph
2b1a0 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 20 20  ase_one_exit;.  
2b1b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2b1c0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70  ite3PagerWrite(p
2b1d0 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Page);.         
2b1e0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
2b1f0 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
2b200 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
2b210 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f  ITE_OK ) goto co
2b220 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65  mmit_phase_one_e
2b230 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
2b240 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 70 50       } .      pP
2b250 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 64  ager->dbSize = d
2b260 62 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 23 65 6e  bSize;.    }.#en
2b270 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
2b280 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
2b290 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
2b2a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
2b2b0 20 49 66 20 61 20 6d 61 73 74 65 72 20 0a 20 20   If a master .  
2b2c0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
2b2d0 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65 61  e name has alrea
2b2e0 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
2b2f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
2b300 69 6c 65 2c 20 0a 20 20 20 20 2a 2a 20 6f 72 20  ile, .    ** or 
2b310 69 66 20 7a 4d 61 73 74 65 72 20 69 73 20 4e 55  if zMaster is NU
2b320 4c 4c 20 28 6e 6f 20 6d 61 73 74 65 72 20 6a 6f  LL (no master jo
2b330 75 72 6e 61 6c 29 2c 20 74 68 65 6e 20 74 68 69  urnal), then thi
2b340 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f  s call is a no-o
2b350 70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  p..    */.    rc
2b360 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f   = writeMasterJo
2b370 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d  urnal(pPager, zM
2b380 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  aster);.    if( 
2b390 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
2b3a0 67 6f 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73  goto commit_phas
2b3b0 65 5f 6f 6e 65 5f 65 78 69 74 3b 0a 0a 20 20 20  e_one_exit;..   
2b3c0 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
2b3d0 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
2b3e0 65 20 61 74 6f 6d 69 63 2d 75 70 64 61 74 65 20  e atomic-update 
2b3f0 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 69 73 20  optimization is 
2b400 62 65 69 6e 67 0a 20 20 20 20 2a 2a 20 75 73 65  being.    ** use
2b410 64 2c 20 74 68 69 73 20 63 61 6c 6c 20 77 69 6c  d, this call wil
2b420 6c 20 6e 6f 74 20 63 72 65 61 74 65 20 74 68 65  l not create the
2b430 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 72   journal file or
2b440 20 70 65 72 66 6f 72 6d 20 61 6e 79 0a 20 20 20   perform any.   
2b450 20 2a 2a 20 72 65 61 6c 20 49 4f 2e 0a 20 20 20   ** real IO..   
2b460 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73 79 6e   */.    rc = syn
2b470 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
2b480 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2b490 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63  LITE_OK ) goto c
2b4a0 6f 6d 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f  ommit_phase_one_
2b4b0 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 57 72  exit;..    /* Wr
2b4c0 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
2b4d0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
2b4e0 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
2b4f0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74   rc = pager_writ
2b500 65 5f 70 61 67 65 6c 69 73 74 28 73 71 6c 69 74  e_pagelist(sqlit
2b510 65 33 50 63 61 63 68 65 44 69 72 74 79 4c 69 73  e3PcacheDirtyLis
2b520 74 28 70 50 61 67 65 72 2d 3e 70 50 43 61 63 68  t(pPager->pPCach
2b530 65 29 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  e));.    if( rc!
2b540 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b550 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
2b560 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f  SQLITE_IOERR_BLO
2b570 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 67 6f  CKED );.      go
2b580 74 6f 20 63 6f 6d 6d 69 74 5f 70 68 61 73 65 5f  to commit_phase_
2b590 6f 6e 65 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  one_exit;.    }.
2b5a0 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63 68      sqlite3Pcach
2b5b0 65 43 6c 65 61 6e 41 6c 6c 28 70 50 61 67 65 72  eCleanAll(pPager
2b5c0 2d 3e 70 50 43 61 63 68 65 29 3b 0a 0a 20 20 20  ->pPCache);..   
2b5d0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
2b5e0 6f 6e 20 64 69 73 6b 20 69 73 20 6e 6f 74 20 74  on disk is not t
2b5f0 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61 73 20  he same size as 
2b600 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6d 61  the database ima
2b610 67 65 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20  ge,.    ** then 
2b620 75 73 65 20 70 61 67 65 72 5f 74 72 75 6e 63 61  use pager_trunca
2b630 74 65 20 74 6f 20 67 72 6f 77 20 6f 72 20 73 68  te to grow or sh
2b640 72 69 6e 6b 20 74 68 65 20 66 69 6c 65 20 68 65  rink the file he
2b650 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  re..    */.    i
2b660 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
2b670 65 21 3d 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  e!=pPager->dbFil
2b680 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 50  eSize ){.      P
2b690 67 6e 6f 20 6e 4e 65 77 20 3d 20 70 50 61 67 65  gno nNew = pPage
2b6a0 72 2d 3e 64 62 53 69 7a 65 20 2d 20 28 70 50 61  r->dbSize - (pPa
2b6b0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 41 47  ger->dbSize==PAG
2b6c0 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
2b6d0 72 29 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r));.      asser
2b6e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2b6f0 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
2b700 45 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  E );.      rc = 
2b710 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
2b720 50 61 67 65 72 2c 20 6e 4e 65 77 29 3b 0a 20 20  Pager, nNew);.  
2b730 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
2b740 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 63 6f 6d  TE_OK ) goto com
2b750 6d 69 74 5f 70 68 61 73 65 5f 6f 6e 65 5f 65 78  mit_phase_one_ex
2b760 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  it;.    }..    /
2b770 2a 20 46 69 6e 61 6c 6c 79 2c 20 73 79 6e 63 20  * Finally, sync 
2b780 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b790 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
2b7a0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 26 26  Pager->noSync &&
2b7b0 20 21 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20   !noSync ){.    
2b7c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
2b7d0 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
2b7e0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
2b7f0 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
2b800 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
2b810 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
2b820 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
2b830 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
2b840 45 44 3b 0a 20 20 7d 0a 0a 63 6f 6d 6d 69 74 5f  ED;.  }..commit_
2b850 70 68 61 73 65 5f 6f 6e 65 5f 65 78 69 74 3a 0a  phase_one_exit:.
2b860 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
2b870 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 20 29  _IOERR_BLOCKED )
2b880 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 69  {.    /* pager_i
2b890 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
2b8a0 72 28 29 20 6d 61 79 20 61 74 74 65 6d 70 74 20  r() may attempt 
2b8b0 74 6f 20 6f 62 74 61 69 6e 20 61 6e 20 65 78 63  to obtain an exc
2b8c0 6c 75 73 69 76 65 0a 20 20 20 20 2a 2a 20 6c 6f  lusive.    ** lo
2b8d0 63 6b 20 74 6f 20 73 70 69 6c 6c 20 74 68 65 20  ck to spill the 
2b8e0 63 61 63 68 65 20 61 6e 64 20 72 65 74 75 72 6e  cache and return
2b8f0 20 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 2e 20   IOERR_BLOCKED. 
2b900 42 75 74 20 73 69 6e 63 65 20 0a 20 20 20 20 2a  But since .    *
2b910 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 63 68  * there is no ch
2b920 61 6e 63 65 20 74 68 65 20 63 61 63 68 65 20 69  ance the cache i
2b930 73 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 2c 20  s inconsistent, 
2b940 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 62 65 74  it is.    ** bet
2b950 74 65 72 20 74 6f 20 72 65 74 75 72 6e 20 53 51  ter to return SQ
2b960 4c 49 54 45 5f 42 55 53 59 2e 0a 20 20 20 20 2a  LITE_BUSY..    *
2b970 2a 2f 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  */.    rc = SQLI
2b980 54 45 5f 42 55 53 59 3b 0a 20 20 7d 0a 20 20 72  TE_BUSY;.  }.  r
2b990 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
2b9a0 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 66 75  .** When this fu
2b9b0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
2b9c0 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  , the database f
2b9d0 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 6f 6d  ile has been com
2b9e0 70 6c 65 74 65 6c 79 0a 2a 2a 20 75 70 64 61 74  pletely.** updat
2b9f0 65 64 20 74 6f 20 72 65 66 6c 65 63 74 20 74 68  ed to reflect th
2ba00 65 20 63 68 61 6e 67 65 73 20 6d 61 64 65 20 62  e changes made b
2ba10 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  y the current tr
2ba20 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 0a 2a 2a  ansaction and.**
2ba30 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
2ba40 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
2ba50 65 20 73 74 69 6c 6c 20 65 78 69 73 74 73 20 69  e still exists i
2ba60 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73 74 65  n the file-syste
2ba70 6d 20 0a 2a 2a 20 74 68 6f 75 67 68 2c 20 61 6e  m .** though, an
2ba80 64 20 69 66 20 61 20 66 61 69 6c 75 72 65 20 6f  d if a failure o
2ba90 63 63 75 72 73 20 61 74 20 74 68 69 73 20 70 6f  ccurs at this po
2baa0 69 6e 74 20 69 74 20 77 69 6c 6c 20 65 76 65 6e  int it will even
2bab0 74 75 61 6c 6c 79 0a 2a 2a 20 62 65 20 75 73 65  tually.** be use
2bac0 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e  d as a hot-journ
2bad0 61 6c 20 61 6e 64 20 74 68 65 20 63 75 72 72 65  al and the curre
2bae0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 72  nt transaction r
2baf0 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a  olled back..**.*
2bb00 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2bb10 66 69 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f  finalizes the jo
2bb20 75 72 6e 61 6c 20 66 69 6c 65 2c 20 65 69 74 68  urnal file, eith
2bb30 65 72 20 62 79 20 64 65 6c 65 74 69 6e 67 2c 20  er by deleting, 
2bb40 0a 2a 2a 20 74 72 75 6e 63 61 74 69 6e 67 20 6f  .** truncating o
2bb50 72 20 70 61 72 74 69 61 6c 6c 79 20 7a 65 72 6f  r partially zero
2bb60 69 6e 67 20 69 74 2c 20 73 6f 20 74 68 61 74 20  ing it, so that 
2bb70 69 74 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  it cannot be use
2bb80 64 20 0a 2a 2a 20 66 6f 72 20 68 6f 74 2d 6a 6f  d .** for hot-jo
2bb90 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2e 20  urnal rollback. 
2bba0 4f 6e 63 65 20 74 68 69 73 20 69 73 20 64 6f 6e  Once this is don
2bbb0 65 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  e the transactio
2bbc0 6e 20 69 73 0a 2a 2a 20 69 72 72 65 76 6f 63 61  n is.** irrevoca
2bbd0 62 6c 79 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a  bly committed..*
2bbe0 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72 6f 72  *.** If an error
2bbf0 20 6f 63 63 75 72 73 2c 20 61 6e 20 49 4f 20 65   occurs, an IO e
2bc00 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
2bc10 75 72 6e 65 64 20 61 6e 64 20 74 68 65 20 70 61  urned and the pa
2bc20 67 65 72 0a 2a 2a 20 6d 6f 76 65 73 20 69 6e 74  ger.** moves int
2bc30 6f 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  o the error stat
2bc40 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 53 51  e. Otherwise, SQ
2bc50 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
2bc60 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
2bc70 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
2bc80 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
2bc90 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
2bca0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20  = SQLITE_OK;    
2bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2bcc0 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
2bcd0 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 70 72 6f  .  /* Do not pro
2bce0 63 65 65 64 20 69 66 20 74 68 65 20 70 61 67 65  ceed if the page
2bcf0 72 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  r is already in 
2bd00 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2e  the error state.
2bd10 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
2bd20 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
2bd30 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2bd40 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20  errCode;.  }..  
2bd50 2f 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  /* This function
2bd60 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 63   should not be c
2bd70 61 6c 6c 65 64 20 69 66 20 74 68 65 20 70 61 67  alled if the pag
2bd80 65 72 20 69 73 20 6e 6f 74 20 69 6e 20 61 74 20  er is not in at 
2bd90 6c 65 61 73 74 0a 20 20 2a 2a 20 50 41 47 45 52  least.  ** PAGER
2bda0 5f 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2e  _RESERVED state.
2bdb0 20 41 6e 64 20 69 6e 64 65 65 64 20 53 51 4c 69   And indeed SQLi
2bdc0 74 65 20 6e 65 76 65 72 20 64 6f 65 73 20 74 68  te never does th
2bdd0 69 73 2e 20 42 75 74 20 69 74 20 69 73 0a 20 20  is. But it is.  
2bde0 2a 2a 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20  ** nice to have 
2bdf0 74 68 69 73 20 64 65 66 65 6e 73 69 76 65 20 62  this defensive b
2be00 6c 6f 63 6b 20 68 65 72 65 20 61 6e 79 77 61 79  lock here anyway
2be10 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4e 45 56  ..  */.  if( NEV
2be20 45 52 28 70 50 61 67 65 72 2d 3e 73 74 61 74 65  ER(pPager->state
2be30 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 29  <PAGER_RESERVED)
2be40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
2be50 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
2be60 0a 0a 20 20 2f 2a 20 41 6e 20 6f 70 74 69 6d 69  ..  /* An optimi
2be70 7a 61 74 69 6f 6e 2e 20 49 66 20 74 68 65 20 64  zation. If the d
2be80 61 74 61 62 61 73 65 20 77 61 73 20 6e 6f 74 20  atabase was not 
2be90 61 63 74 75 61 6c 6c 79 20 6d 6f 64 69 66 69 65  actually modifie
2bea0 64 20 64 75 72 69 6e 67 0a 20 20 2a 2a 20 74 68  d during.  ** th
2beb0 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  is transaction, 
2bec0 74 68 65 20 70 61 67 65 72 20 69 73 20 72 75 6e  the pager is run
2bed0 6e 69 6e 67 20 69 6e 20 65 78 63 6c 75 73 69 76  ning in exclusiv
2bee0 65 2d 6d 6f 64 65 20 61 6e 64 20 69 73 0a 20 20  e-mode and is.  
2bef0 2a 2a 20 75 73 69 6e 67 20 70 65 72 73 69 73 74  ** using persist
2bf00 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 2c 20 74 68  ent journals, th
2bf10 65 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  en this function
2bf20 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
2bf30 2a 0a 20 20 2a 2a 20 54 68 65 20 73 74 61 72 74  *.  ** The start
2bf40 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2bf50 66 69 6c 65 20 63 75 72 72 65 6e 74 6c 79 20 63  file currently c
2bf60 6f 6e 74 61 69 6e 73 20 61 20 73 69 6e 67 6c 65  ontains a single
2bf70 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 68   journal .  ** h
2bf80 65 61 64 65 72 20 77 69 74 68 20 74 68 65 20 6e  eader with the n
2bf90 52 65 63 20 66 69 65 6c 64 20 73 65 74 20 74 6f  Rec field set to
2bfa0 20 30 2e 20 49 66 20 73 75 63 68 20 61 20 6a 6f   0. If such a jo
2bfb0 75 72 6e 61 6c 20 69 73 20 75 73 65 64 20 61 73  urnal is used as
2bfc0 0a 20 20 2a 2a 20 61 20 68 6f 74 2d 6a 6f 75 72  .  ** a hot-jour
2bfd0 6e 61 6c 20 64 75 72 69 6e 67 20 68 6f 74 2d 6a  nal during hot-j
2bfe0 6f 75 72 6e 61 6c 20 72 6f 6c 6c 62 61 63 6b 2c  ournal rollback,
2bff0 20 30 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20   0 changes will 
2c000 62 65 20 6d 61 64 65 0a 20 20 2a 2a 20 74 6f 20  be made.  ** to 
2c010 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2c020 65 2e 20 53 6f 20 74 68 65 72 65 20 69 73 20 6e  e. So there is n
2c030 6f 20 6e 65 65 64 20 74 6f 20 7a 65 72 6f 20 74  o need to zero t
2c040 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20 2a 2a  he journal .  **
2c050 20 68 65 61 64 65 72 2e 20 53 69 6e 63 65 20 74   header. Since t
2c060 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 65  he pager is in e
2c070 78 63 6c 75 73 69 76 65 20 6d 6f 64 65 2c 20 74  xclusive mode, t
2c080 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64 0a  here is no need.
2c090 20 20 2a 2a 20 74 6f 20 64 72 6f 70 20 61 6e 79    ** to drop any
2c0a0 20 6c 6f 63 6b 73 20 65 69 74 68 65 72 2e 0a 20   locks either.. 
2c0b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
2c0c0 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20  ->dbModified==0 
2c0d0 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  && pPager->exclu
2c0e0 73 69 76 65 4d 6f 64 65 20 0a 20 20 20 26 26 20  siveMode .   && 
2c0f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
2c100 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode==PAGER_JOURN
2c110 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20  ALMODE_PERSIST. 
2c120 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
2c130 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
2c140 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
2c150 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20  SZ(pPager) );.  
2c160 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2c170 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52  OK;.  }..  PAGER
2c180 54 52 41 43 45 28 28 22 43 4f 4d 4d 49 54 20 25  TRACE(("COMMIT %
2c190 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
2c1a0 61 67 65 72 29 29 29 3b 0a 20 20 61 73 73 65 72  ager)));.  asser
2c1b0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
2c1c0 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 7c  ==PAGER_SYNCED |
2c1d0 7c 20 4d 45 4d 44 42 20 7c 7c 20 21 70 50 61 67  | MEMDB || !pPag
2c1e0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 29  er->dbModified )
2c1f0 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65  ;.  rc = pager_e
2c200 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
2c210 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
2c220 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 72 65 74  etMaster);.  ret
2c230 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28  urn pager_error(
2c240 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a  pPager, rc);.}..
2c250 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61  /*.** Rollback a
2c260 6c 6c 20 63 68 61 6e 67 65 73 2e 20 54 68 65 20  ll changes. The 
2c270 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
2c280 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
2c290 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 0a 2a 2a 20  RED mode..**.** 
2c2a0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 70 65  This function pe
2c2b0 72 66 6f 72 6d 73 20 74 77 6f 20 74 61 73 6b 73  rforms two tasks
2c2c0 3a 0a 2a 2a 0a 2a 2a 20 20 20 31 29 20 49 74 20  :.**.**   1) It 
2c2d0 72 6f 6c 6c 73 20 62 61 63 6b 20 74 68 65 20 6a  rolls back the j
2c2e0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 72 65 73  ournal file, res
2c2f0 74 6f 72 69 6e 67 20 61 6c 6c 20 64 61 74 61 62  toring all datab
2c300 61 73 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a  ase file and .**
2c310 20 20 20 20 20 20 69 6e 2d 6d 65 6d 6f 72 79 20        in-memory 
2c320 63 61 63 68 65 20 70 61 67 65 73 20 74 6f 20 74  cache pages to t
2c330 68 65 20 73 74 61 74 65 20 74 68 65 79 20 77 65  he state they we
2c340 72 65 20 69 6e 20 77 68 65 6e 20 74 68 65 20 74  re in when the t
2c350 72 61 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 20 20  ransaction.**   
2c360 20 20 20 77 61 73 20 6f 70 65 6e 65 64 2c 20 61     was opened, a
2c370 6e 64 0a 2a 2a 20 20 20 32 29 20 49 74 20 66 69  nd.**   2) It fi
2c380 6e 61 6c 69 7a 65 73 20 74 68 65 20 6a 6f 75 72  nalizes the jour
2c390 6e 61 6c 20 66 69 6c 65 2c 20 73 6f 20 74 68 61  nal file, so tha
2c3a0 74 20 69 74 20 69 73 20 6e 6f 74 20 75 73 65 64  t it is not used
2c3b0 20 66 6f 72 20 68 6f 74 0a 2a 2a 20 20 20 20 20   for hot.**     
2c3c0 20 72 6f 6c 6c 62 61 63 6b 20 61 74 20 61 6e 79   rollback at any
2c3d0 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20 66 75   point in the fu
2c3e0 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 73 75 62 6a  ture..**.** subj
2c3f0 65 63 74 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ect to the follo
2c400 77 69 6e 67 20 71 75 61 6c 69 66 69 63 61 74 69  wing qualificati
2c410 6f 6e 73 3a 0a 2a 2a 0a 2a 2a 20 2a 20 49 66 20  ons:.**.** * If 
2c420 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
2c430 20 69 73 20 6e 6f 74 20 79 65 74 20 6f 70 65 6e   is not yet open
2c440 20 77 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   when this funct
2c450 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 2c 0a 2a  ion is called,.*
2c460 2a 20 20 20 74 68 65 6e 20 6f 6e 6c 79 20 28 32  *   then only (2
2c470 29 20 69 73 20 70 65 72 66 6f 72 6d 65 64 2e 20  ) is performed. 
2c480 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65  In this case the
2c490 72 65 20 69 73 20 6e 6f 20 6a 6f 75 72 6e 61 6c  re is no journal
2c4a0 20 66 69 6c 65 0a 2a 2a 20 20 20 74 6f 20 72 6f   file.**   to ro
2c4b0 6c 6c 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 2a  ll back..**.** *
2c4c0 20 49 66 20 69 6e 20 61 6e 20 65 72 72 6f 72 20   If in an error 
2c4d0 73 74 61 74 65 20 6f 74 68 65 72 20 74 68 61 6e  state other than
2c4e0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2c 20 74 68   SQLITE_FULL, th
2c4f0 65 6e 20 74 61 73 6b 20 28 31 29 20 69 73 20 0a  en task (1) is .
2c500 2a 2a 20 20 20 70 65 72 66 6f 72 6d 65 64 2e 20  **   performed. 
2c510 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 74  If successful, t
2c520 61 73 6b 20 28 32 29 2e 20 52 65 67 61 72 64 6c  ask (2). Regardl
2c530 65 73 73 20 6f 66 20 74 68 65 20 6f 75 74 63 6f  ess of the outco
2c540 6d 65 0a 2a 2a 20 20 20 6f 66 20 65 69 74 68 65  me.**   of eithe
2c550 72 2c 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  r, the error sta
2c560 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
2c570 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
2c580 20 63 61 6c 6c 65 72 0a 2a 2a 20 20 20 28 69 2e   caller.**   (i.
2c590 65 2e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45  e. either SQLITE
2c5a0 5f 49 4f 45 52 52 20 6f 72 20 53 51 4c 49 54 45  _IOERR or SQLITE
2c5b0 5f 43 4f 52 52 55 50 54 29 2e 0a 2a 2a 0a 2a 2a  _CORRUPT)..**.**
2c5c0 20 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20   * If the pager 
2c5d0 69 73 20 69 6e 20 50 41 47 45 52 5f 52 45 53 45  is in PAGER_RESE
2c5e0 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
2c5f0 20 61 74 74 65 6d 70 74 20 28 31 29 2e 20 57 68   attempt (1). Wh
2c600 65 74 68 65 72 0a 2a 2a 20 20 20 6f 72 20 6e 6f  ether.**   or no
2c610 74 20 28 31 29 20 69 73 20 73 75 63 63 75 73 73  t (1) is succuss
2c620 66 75 6c 2c 20 61 6c 73 6f 20 61 74 74 65 6d 70  ful, also attemp
2c630 74 20 28 32 29 2e 20 49 66 20 73 75 63 63 65 73  t (2). If succes
2c640 73 66 75 6c 2c 20 72 65 74 75 72 6e 0a 2a 2a 20  sful, return.** 
2c650 20 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 4f 74 68    SQLITE_OK. Oth
2c660 65 72 77 69 73 65 2c 20 65 6e 74 65 72 20 74 68  erwise, enter th
2c670 65 20 65 72 72 6f 72 20 73 74 61 74 65 20 61 6e  e error state an
2c680 64 20 72 65 74 75 72 6e 20 74 68 65 20 66 69 72  d return the fir
2c690 73 74 20 0a 2a 2a 20 20 20 65 72 72 6f 72 20 63  st .**   error c
2c6a0 6f 64 65 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  ode encountered.
2c6b0 20 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69   .**.**   In thi
2c6c0 73 20 63 61 73 65 20 74 68 65 72 65 20 69 73 20  s case there is 
2c6d0 6e 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74  no chance that t
2c6e0 68 65 20 64 61 74 61 62 61 73 65 20 77 61 73 20  he database was 
2c6f0 77 72 69 74 74 65 6e 20 74 6f 2e 20 0a 2a 2a 20  written to. .** 
2c700 20 20 53 6f 20 69 73 20 73 61 66 65 20 74 6f 20    So is safe to 
2c710 66 69 6e 61 6c 69 7a 65 20 74 68 65 20 6a 6f 75  finalize the jou
2c720 72 6e 61 6c 20 66 69 6c 65 20 65 76 65 6e 20 69  rnal file even i
2c730 66 20 74 68 65 20 70 6c 61 79 62 61 63 6b 20 0a  f the playback .
2c740 2a 2a 20 20 20 28 6f 70 65 72 61 74 69 6f 6e 20  **   (operation 
2c750 31 29 20 66 61 69 6c 65 64 2e 20 48 6f 77 65 76  1) failed. Howev
2c760 65 72 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  er the pager mus
2c770 74 20 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f  t enter the erro
2c780 72 20 73 74 61 74 65 0a 2a 2a 20 20 20 61 73 20  r state.**   as 
2c790 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
2c7a0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
2c7b0 63 68 65 20 61 72 65 20 6e 6f 77 20 73 75 73 70  che are now susp
2c7c0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 2a 20 46 69 6e  ect..**.** * Fin
2c7d0 61 6c 6c 79 2c 20 69 66 20 69 6e 20 50 41 47 45  ally, if in PAGE
2c7e0 52 5f 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  R_EXCLUSIVE stat
2c7f0 65 2c 20 74 68 65 6e 20 61 74 74 65 6d 70 74 20  e, then attempt 
2c800 28 31 29 2e 20 4f 6e 6c 79 0a 2a 2a 20 20 20 61  (1). Only.**   a
2c810 74 74 65 6d 70 74 20 28 32 29 20 69 66 20 28 31  ttempt (2) if (1
2c820 29 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2e  ) is successful.
2c830 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
2c840 4b 20 69 66 20 73 75 63 63 65 73 73 66 75 6c 2c  K if successful,
2c850 0a 2a 2a 20 20 20 6f 74 68 65 72 77 69 73 65 20  .**   otherwise 
2c860 65 6e 74 65 72 20 74 68 65 20 65 72 72 6f 72 20  enter the error 
2c870 73 74 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e  state and return
2c880 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64 65 20   the error code 
2c890 66 72 6f 6d 20 74 68 65 20 0a 2a 2a 20 20 20 66  from the .**   f
2c8a0 61 69 6c 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  ailing operation
2c8b0 2e 0a 2a 2a 0a 2a 2a 20 20 20 49 6e 20 74 68 69  ..**.**   In thi
2c8c0 73 20 63 61 73 65 20 74 68 65 20 64 61 74 61 62  s case the datab
2c8d0 61 73 65 20 66 69 6c 65 20 6d 61 79 20 68 61 76  ase file may hav
2c8e0 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  e been written t
2c8f0 6f 2e 20 53 6f 20 69 66 20 74 68 65 0a 2a 2a 20  o. So if the.** 
2c900 20 20 70 6c 61 79 62 61 63 6b 20 6f 70 65 72 61    playback opera
2c910 74 69 6f 6e 20 64 69 64 20 6e 6f 74 20 73 75 63  tion did not suc
2c920 63 65 65 64 20 69 74 20 77 6f 75 6c 64 20 6e 6f  ceed it would no
2c930 74 20 62 65 20 73 61 66 65 20 74 6f 20 66 69 6e  t be safe to fin
2c940 61 6c 69 7a 65 0a 2a 2a 20 20 20 74 68 65 20 6a  alize.**   the j
2c950 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 74 20  ournal file. It 
2c960 6e 65 65 64 73 20 74 6f 20 62 65 20 6c 65 66 74  needs to be left
2c970 20 69 6e 20 74 68 65 20 66 69 6c 65 2d 73 79 73   in the file-sys
2c980 74 65 6d 20 73 6f 20 74 68 61 74 0a 2a 2a 20 20  tem so that.**  
2c990 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63   some other proc
2c9a0 65 73 73 20 63 61 6e 20 75 73 65 20 69 74 20 74  ess can use it t
2c9b0 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  o restore the da
2c9c0 74 61 62 61 73 65 20 73 74 61 74 65 20 28 62 79  tabase state (by
2c9d0 0a 2a 2a 20 20 20 68 6f 74 2d 6a 6f 75 72 6e 61  .**   hot-journa
2c9e0 6c 20 72 6f 6c 6c 62 61 63 6b 29 2e 0a 2a 2f 0a  l rollback)..*/.
2c9f0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2ca00 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a  Rollback(Pager *
2ca10 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
2ca20 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20  c = SQLITE_OK;  
2ca30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ca40 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a  /* Return code *
2ca50 2f 0a 20 20 50 41 47 45 52 54 52 41 43 45 28 28  /.  PAGERTRACE((
2ca60 22 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  "ROLLBACK %d\n",
2ca70 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
2ca80 29 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  ));.  if( !pPage
2ca90 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 7c 7c  r->dbModified ||
2caa0 20 21 69 73 4f 70 65 6e 28 70 50 61 67 65 72 2d   !isOpen(pPager-
2cab0 3e 6a 66 64 29 20 29 7b 0a 20 20 20 20 72 63 20  >jfd) ){.    rc 
2cac0 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
2cad0 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
2cae0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
2caf0 72 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  r);.  }else if( 
2cb00 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
2cb10 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
2cb20 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
2cb30 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
2cb40 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
2cb50 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20  EXCLUSIVE ){.   
2cb60 20 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63     pager_playbac
2cb70 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  k(pPager, 0);.  
2cb80 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 70 50 61    }.    rc = pPa
2cb90 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
2cba0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70  }else{.    if( p
2cbb0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
2cbc0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
2cbd0 20 20 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20        int rc2;. 
2cbe0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
2cbf0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c  playback(pPager,
2cc00 20 30 29 3b 0a 20 20 20 20 20 20 72 63 32 20 3d   0);.      rc2 =
2cc10 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
2cc20 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
2cc30 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
2cc40 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
2cc50 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2cc60 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b 0a        rc = rc2;.
2cc70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2cc80 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  e{.      rc = pa
2cc90 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
2cca0 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a  ger, 0);.    }..
2ccb0 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
2ccc0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
2ccd0 64 62 53 69 7a 65 56 61 6c 69 64 20 3d 20 30 3b  dbSizeValid = 0;
2cce0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49  .    }..    /* I
2ccf0 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
2cd00 73 20 64 75 72 69 6e 67 20 61 20 52 4f 4c 4c 42  s during a ROLLB
2cd10 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e 6f 20 6c  ACK, we can no l
2cd20 6f 6e 67 65 72 20 74 72 75 73 74 20 74 68 65 20  onger trust the 
2cd30 70 61 67 65 72 0a 20 20 20 20 2a 2a 20 63 61 63  pager.    ** cac
2cd40 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67 65  he. So call page
2cd50 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68 65  r_error() on the
2cd60 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b 65   way out to make
2cd70 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 20 20   any error .    
2cd80 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20  ** persistent.. 
2cd90 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70     */.    rc = p
2cda0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
2cdb0 72 2c 20 72 63 29 3b 0a 20 20 7d 0a 20 20 72 65  r, rc);.  }.  re
2cdc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
2cdd0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
2cde0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
2cdf0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
2ce00 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
2ce10 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
2ce20 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
2ce30 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
2ce40 2e 0a 2a 2f 0a 75 38 20 73 71 6c 69 74 65 33 50  ..*/.u8 sqlite3P
2ce50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
2ce60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2ce70 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2ce80 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
2ce90 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
2cea0 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
2ceb0 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
2cec0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
2ced0 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
2cee0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2cef0 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63 61  eturn sqlite3Pca
2cf00 63 68 65 52 65 66 43 6f 75 6e 74 28 70 50 61 67  cheRefCount(pPag
2cf10 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 7d 0a  er->pPCache);.}.
2cf20 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
2cf30 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
2cf40 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 73 70  rences to the sp
2cf50 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f  ecified page..*/
2cf60 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
2cf70 72 50 61 67 65 52 65 66 63 6f 75 6e 74 28 44 62  rPageRefcount(Db
2cf80 50 61 67 65 20 2a 70 50 61 67 65 29 7b 0a 20 20  Page *pPage){.  
2cf90 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 50 63  return sqlite3Pc
2cfa0 61 63 68 65 50 61 67 65 52 65 66 63 6f 75 6e 74  achePageRefcount
2cfb0 28 70 50 61 67 65 29 3b 0a 7d 0a 0a 23 69 66 64  (pPage);.}..#ifd
2cfc0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
2cfd0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2cfe0 65 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65  e is used for te
2cff0 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
2d000 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20  is only..*/.int 
2d010 2a 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61  *sqlite3PagerSta
2d020 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
2d030 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
2d040 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
2d050 73 71 6c 69 74 65 33 50 63 61 63 68 65 52 65 66  sqlite3PcacheRef
2d060 43 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e 70 50  Count(pPager->pP
2d070 43 61 63 68 65 29 3b 0a 20 20 61 5b 31 5d 20 3d  Cache);.  a[1] =
2d080 20 73 71 6c 69 74 65 33 50 63 61 63 68 65 50 61   sqlite3PcachePa
2d090 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 2d 3e  gecount(pPager->
2d0a0 70 50 43 61 63 68 65 29 3b 0a 20 20 61 5b 32 5d  pPCache);.  a[2]
2d0b0 20 3d 20 73 71 6c 69 74 65 33 50 63 61 63 68 65   = sqlite3Pcache
2d0c0 47 65 74 43 61 63 68 65 73 69 7a 65 28 70 50 61  GetCachesize(pPa
2d0d0 67 65 72 2d 3e 70 50 43 61 63 68 65 29 3b 0a 20  ger->pPCache);. 
2d0e0 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
2d0f0 64 62 53 69 7a 65 56 61 6c 69 64 20 3f 20 28 69  dbSizeValid ? (i
2d100 6e 74 29 20 70 50 61 67 65 72 2d 3e 64 62 53 69  nt) pPager->dbSi
2d110 7a 65 20 3a 20 2d 31 3b 0a 20 20 61 5b 34 5d 20  ze : -1;.  a[4] 
2d120 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b  = pPager->state;
2d130 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72  .  a[5] = pPager
2d140 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36  ->errCode;.  a[6
2d150 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74  ] = pPager->nHit
2d160 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65  ;.  a[7] = pPage
2d170 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d  r->nMiss;.  a[8]
2d180 20 3d 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74   = 0;  /* Used t
2d190 6f 20 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76  o be pPager->nOv
2d1a0 66 6c 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70  fl */.  a[9] = p
2d1b0 50 61 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20  Pager->nRead;.  
2d1c0 61 5b 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e  a[10] = pPager->
2d1d0 6e 57 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e  nWrite;.  return
2d1e0 20 61 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   a;.}.#endif../*
2d1f0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
2d200 69 66 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e  if this is an in
2d210 2d 6d 65 6d 6f 72 79 20 70 61 67 65 72 2e 0a 2a  -memory pager..*
2d220 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2d230 65 72 49 73 4d 65 6d 64 62 28 50 61 67 65 72 20  erIsMemdb(Pager 
2d240 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2d250 72 6e 20 4d 45 4d 44 42 3b 0a 7d 0a 0a 2f 2a 0a  rn MEMDB;.}../*.
2d260 2a 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  ** Check that th
2d270 65 72 65 20 61 72 65 20 61 74 20 6c 65 61 73 74  ere are at least
2d280 20 6e 53 61 76 65 70 6f 69 6e 74 20 73 61 76 65   nSavepoint save
2d290 70 6f 69 6e 74 73 20 6f 70 65 6e 2e 20 49 66 20  points open. If 
2d2a0 74 68 65 72 65 20 61 72 65 0a 2a 2a 20 63 75 72  there are.** cur
2d2b0 72 65 6e 74 6c 79 20 6c 65 73 73 20 74 68 61 6e  rently less than
2d2c0 20 6e 53 61 76 65 70 6f 69 6e 74 73 20 6f 70 65   nSavepoints ope
2d2d0 6e 2c 20 74 68 65 6e 20 6f 70 65 6e 20 6f 6e 65  n, then open one
2d2e0 20 6f 72 20 6d 6f 72 65 20 73 61 76 65 70 6f 69   or more savepoi
2d2f0 6e 74 73 0a 2a 2a 20 74 6f 20 6d 61 6b 65 20 75  nts.** to make u
2d300 70 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  p the difference
2d310 2e 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  . If the number 
2d320 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20 69 73  of savepoints is
2d330 20 61 6c 72 65 61 64 79 0a 2a 2a 20 65 71 75 61   already.** equa
2d340 6c 20 74 6f 20 6e 53 61 76 65 70 6f 69 6e 74 2c  l to nSavepoint,
2d350 20 74 68 65 6e 20 74 68 69 73 20 66 75 6e 63 74   then this funct
2d360 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ion is a no-op..
2d370 2a 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72  **.** If a memor
2d380 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
2d390 6c 73 2c 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  ls, SQLITE_NOMEM
2d3a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49 66   is returned. If
2d3b0 20 61 6e 20 65 72 72 6f 72 20 0a 2a 2a 20 6f 63   an error .** oc
2d3c0 63 75 72 73 20 77 68 69 6c 65 20 6f 70 65 6e 69  curs while openi
2d3d0 6e 67 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e  ng the sub-journ
2d3e0 61 6c 20 66 69 6c 65 2c 20 74 68 65 6e 20 61 6e  al file, then an
2d3f0 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20 69   IO error code i
2d400 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 2e 20 4f  s.** returned. O
2d410 74 68 65 72 77 69 73 65 2c 20 53 51 4c 49 54 45  therwise, SQLITE
2d420 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  _OK..*/.int sqli
2d430 74 65 33 50 61 67 65 72 4f 70 65 6e 53 61 76 65  te3PagerOpenSave
2d440 70 6f 69 6e 74 28 50 61 67 65 72 20 2a 70 50 61  point(Pager *pPa
2d450 67 65 72 2c 20 69 6e 74 20 6e 53 61 76 65 70 6f  ger, int nSavepo
2d460 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
2d470 20 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20   SQLITE_OK;     
2d480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d490 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
2d4a0 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 75 72 72 65   */.  int nCurre
2d4b0 6e 74 20 3d 20 70 50 61 67 65 72 2d 3e 6e 53 61  nt = pPager->nSa
2d4c0 76 65 70 6f 69 6e 74 3b 20 20 20 20 20 20 20 20  vepoint;        
2d4d0 2f 2a 20 43 75 72 72 65 6e 74 20 6e 75 6d 62 65  /* Current numbe
2d4e0 72 20 6f 66 20 73 61 76 65 70 6f 69 6e 74 73 20  r of savepoints 
2d4f0 2a 2f 0a 0a 20 20 69 66 28 20 6e 53 61 76 65 70  */..  if( nSavep
2d500 6f 69 6e 74 3e 6e 43 75 72 72 65 6e 74 20 26 26  oint>nCurrent &&
2d510 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
2d520 6e 61 6c 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  nal ){.    int i
2d530 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
2d540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d550 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
2d560 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 20 20 50  ariable */.    P
2d570 61 67 65 72 53 61 76 65 70 6f 69 6e 74 20 2a 61  agerSavepoint *a
2d580 4e 65 77 3b 20 20 20 20 20 20 20 20 20 20 20 20  New;            
2d590 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20 50 61         /* New Pa
2d5a0 67 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61  ger.aSavepoint a
2d5b0 72 72 61 79 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20  rray */..    /* 
2d5c0 45 69 74 68 65 72 20 74 68 65 72 65 20 69 73 20  Either there is 
2d5d0 6e 6f 20 61 63 74 69 76 65 20 6a 6f 75 72 6e 61  no active journa
2d5e0 6c 20 6f 72 20 74 68 65 20 73 75 62 2d 6a 6f 75  l or the sub-jou
2d5f0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 6f 72 20  rnal is open or 
2d600 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72  .    ** the jour
2d610 6e 61 6c 20 69 73 20 61 6c 77 61 79 73 20 73 74  nal is always st
2d620 6f 72 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 2a  ored in memory *
2d630 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
2d640 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e 74  ager->nSavepoint
2d650 3d 3d 30 20 7c 7c 20 69 73 4f 70 65 6e 28 70 50  ==0 || isOpen(pP
2d660 61 67 65 72 2d 3e 73 6a 66 64 29 20 7c 7c 0a 20  ager->sjfd) ||. 
2d670 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
2d680 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d 3d  r->journalMode==
2d690 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
2d6a0 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 0a 20 20 20  E_MEMORY );..   
2d6b0 20 2f 2a 20 47 72 6f 77 20 74 68 65 20 50 61 67   /* Grow the Pag
2d6c0 65 72 2e 61 53 61 76 65 70 6f 69 6e 74 20 61 72  er.aSavepoint ar
2d6d0 72 61 79 20 75 73 69 6e 67 20 72 65 61 6c 6c 6f  ray using reallo
2d6e0 63 28 29 2e 20 52 65 74 75 72 6e 20 53 51 4c 49  c(). Return SQLI
2d6f0 54 45 5f 4e 4f 4d 45 4d 0a 20 20 20 20 2a 2a 20  TE_NOMEM.    ** 
2d700 69 66 20 74 68 65 20 61 6c 6c 6f 63 61 74 69 6f  if the allocatio
2d710 6e 20 66 61 69 6c 73 2e 20 4f 74 68 65 72 77 69  n fails. Otherwi
2d720 73 65 2c 20 7a 65 72 6f 20 74 68 65 20 6e 65 77  se, zero the new
2d730 20 70 6f 72 74 69 6f 6e 20 69 6e 20 63 61 73 65   portion in case
2d740 20 61 20 0a 20 20 20 20 2a 2a 20 6d 61 6c 6c 6f   a .    ** mallo
2d750 63 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  c failure occurs
2d760 20 77 68 69 6c 65 20 70 6f 70 75 6c 61 74 69 6e   while populatin
2d770 67 20 69 74 20 69 6e 20 74 68 65 20 66 6f 72 28  g it in the for(
2d780 2e 2e 2e 29 20 6c 6f 6f 70 20 62 65 6c 6f 77 2e  ...) loop below.
2d790 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 4e 65 77  .    */.    aNew
2d7a0 20 3d 20 28 50 61 67 65 72 53 61 76 65 70 6f 69   = (PagerSavepoi
2d7b0 6e 74 20 2a 29 73 71 6c 69 74 65 33 52 65 61 6c  nt *)sqlite3Real
2d7c0 6c 6f 63 28 0a 20 20 20 20 20 20 20 20 70 50 61  loc(.        pPa
2d7d0 67 65 72 2d 3e 61 53 61 76 65 70 6f 69 6e 74 2c  ger->aSavepoint,
2d7e0 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53 61 76   sizeof(PagerSav
2d7f0 65 70 6f 69 6e 74 29 2a 6e 53 61 76 65 70 6f 69  epoint)*nSavepoi
2d800 6e 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66  nt.    );.    if
2d810 28 20 21 61 4e 65 77 20 29 7b 0a 20 20 20 20 20  ( !aNew ){.     
2d820 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e   return SQLITE_N
2d830 4f 4d 45 4d 3b 0a 20 20 20 20 7d 0a 20 20 20 20  OMEM;.    }.    
2d840 6d 65 6d 73 65 74 28 26 61 4e 65 77 5b 6e 43 75  memset(&aNew[nCu
2d850 72 72 65 6e 74 5d 2c 20 30 2c 20 28 6e 53 61 76  rrent], 0, (nSav
2d860 65 70 6f 69 6e 74 2d 6e 43 75 72 72 65 6e 74 29  epoint-nCurrent)
2d870 20 2a 20 73 69 7a 65 6f 66 28 50 61 67 65 72 53   * sizeof(PagerS
2d880 61 76 65 70 6f 69 6e 74 29 29 3b 0a 20 20 20 20  avepoint));.    
2d890 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f 69  pPager->aSavepoi
2d8a0 6e 74 20 3d 20 61 4e 65 77 3b 0a 20 20 20 20 70  nt = aNew;.    p
2d8b0 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f 69 6e  Pager->nSavepoin
2d8c0 74 20 3d 20 6e 53 61 76 65 70 6f 69 6e 74 3b 0a  t = nSavepoint;.
2d8d0 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65  .    /* Populate
2d8e0 20 74 68 65 20 50 61 67 65 72 53 61 76 65 70 6f   the PagerSavepo
2d8f0 69 6e 74 20 73 74 72 75 63 74 75 72 65 73 20 6a  int structures j
2d900 75 73 74 20 61 6c 6c 6f 63 61 74 65 64 2e 20 2a  ust allocated. *
2d910 2f 0a 20 20 20 20 66 6f 72 28 69 69 3d 6e 43 75  /.    for(ii=nCu
2d920 72 72 65 6e 74 3b 20 69 69 3c 6e 53 61 76 65 70  rrent; ii<nSavep
2d930 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
2d940 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2d950 72 2d 3e 64 62 53 69 7a 65 56 61 6c 69 64 20 29  r->dbSizeValid )
2d960 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d  ;.      aNew[ii]
2d970 2e 6e 4f 72 69 67 20 3d 20 70 50 61 67 65 72 2d  .nOrig = pPager-
2d980 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20 20 69  >dbSize;.      i
2d990 66 28 20 69 73 4f 70 65 6e 28 70 50 61 67 65 72  f( isOpen(pPager
2d9a0 2d 3e 6a 66 64 29 20 26 26 20 70 50 61 67 65 72  ->jfd) && pPager
2d9b0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20 29  ->journalOff>0 )
2d9c0 7b 0a 20 20 20 20 20 20 20 20 61 4e 65 77 5b 69  {.        aNew[i
2d9d0 69 5d 2e 69 4f 66 66 73 65 74 20 3d 20 70 50 61  i].iOffset = pPa
2d9e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
2d9f0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2da00 20 20 20 20 20 20 61 4e 65 77 5b 69 69 5d 2e 69        aNew[ii].i
2da10 4f 66 66 73 65 74 20 3d 20 4a 4f 55 52 4e 41 4c  Offset = JOURNAL
2da20 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b  _HDR_SZ(pPager);
2da30 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2da40 4e 65 77 5b 69 69 5d 2e 69 53 75 62 52 65 63 20  New[ii].iSubRec 
2da50 3d 20 70 50 61 67 65 72 2d 3e 6e 53 75 62 52 65  = pPager->nSubRe
2da60 63 3b 0a 20 20 20 20 20 20 61 4e 65 77 5b 69 69  c;.      aNew[ii
2da70 5d 2e 70 49 6e 53 61 76 65 70 6f 69 6e 74 20 3d  ].pInSavepoint =
2da80 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
2da90 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
2daa0 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
2dab0 21 61 4e 65 77 5b 69 69 5d 2e 70 49 6e 53 61 76  !aNew[ii].pInSav
2dac0 65 70 6f 69 6e 74 20 29 7b 0a 20 20 20 20 20 20  epoint ){.      
2dad0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
2dae0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
2daf0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 70 65     }..    /* Ope
2db00 6e 20 74 68 65 20 73 75 62 2d 6a 6f 75 72 6e 61  n the sub-journa
2db10 6c 2c 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  l, if it is not 
2db20 61 6c 72 65 61 64 79 20 6f 70 65 6e 65 64 2e 20  already opened. 
2db30 2a 2f 0a 20 20 20 20 72 63 20 3d 20 6f 70 65 6e  */.    rc = open
2db40 53 75 62 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  SubJournal(pPage
2db50 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
2db60 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
2db70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
2db80 63 61 6c 6c 65 64 20 74 6f 20 72 6f 6c 6c 62 61  called to rollba
2db90 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20 28 63  ck or release (c
2dba0 6f 6d 6d 69 74 29 20 61 20 73 61 76 65 70 6f 69  ommit) a savepoi
2dbb0 6e 74 2e 0a 2a 2a 20 54 68 65 20 73 61 76 65 70  nt..** The savep
2dbc0 6f 69 6e 74 20 74 6f 20 72 65 6c 65 61 73 65 20  oint to release 
2dbd0 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 6e 65 65 64  or rollback need
2dbe0 20 6e 6f 74 20 62 65 20 74 68 65 20 6d 6f 73 74   not be the most
2dbf0 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 63 72   recently .** cr
2dc00 65 61 74 65 64 20 73 61 76 65 70 6f 69 6e 74 2e  eated savepoint.
2dc10 0a 2a 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  .**.** Parameter
2dc20 20 6f 70 20 69 73 20 61 6c 77 61 79 73 20 65 69   op is always ei
2dc30 74 68 65 72 20 53 41 56 45 50 4f 49 4e 54 5f 52  ther SAVEPOINT_R
2dc40 4f 4c 4c 42 41 43 4b 20 6f 72 20 53 41 56 45 50  OLLBACK or SAVEP
2dc50 4f 49 4e 54 5f 52 45 4c 45 41 53 45 2e 0a 2a 2a  OINT_RELEASE..**
2dc60 20 49 66 20 69 74 20 69 73 20 53 41 56 45 50 4f   If it is SAVEPO
2dc70 49 4e 54 5f 52 45 4c 45 41 53 45 2c 20 74 68 65  INT_RELEASE, the
2dc80 6e 20 72 65 6c 65 61 73 65 20 61 6e 64 20 64 65  n release and de
2dc90 73 74 72 6f 79 20 74 68 65 20 73 61 76 65 70 6f  stroy the savepo
2dca0 69 6e 74 20 77 69 74 68 0a 2a 2a 20 69 6e 64 65  int with.** inde
2dcb0 78 20 69 53 61 76 65 70 6f 69 6e 74 2e 20 49 66  x iSavepoint. If
2dcc0 20 69 74 20 69 73 20 53 41 56 45 50 4f 49 4e 54   it is SAVEPOINT
2dcd0 5f 52 4f 4c 4c 42 41 43 4b 2c 20 74 68 65 6e 20  _ROLLBACK, then 
2dce0 72 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  rollback all cha
2dcf0 6e 67 65 73 0a 2a 2a 20 74 68 61 74 20 68 61 76  nges.** that hav
2dd00 65 20 6f 63 63 75 72 65 64 20 73 69 6e 63 65 20  e occured since 
2dd10 74 68 65 20 73 70 65 63 69 66 69 65 64 20 73 61  the specified sa
2dd20 76 65 70 6f 69 6e 74 20 77 61 73 20 63 72 65 61  vepoint was crea
2dd30 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73  ted..**.** The s
2dd40 61 76 65 70 6f 69 6e 74 20 74 6f 20 72 6f 6c 6c  avepoint to roll
2dd50 62 61 63 6b 20 6f 72 20 72 65 6c 65 61 73 65 20  back or release 
2dd60 69 73 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  is identified by
2dd70 20 70 61 72 61 6d 65 74 65 72 20 0a 2a 2a 20 69   parameter .** i
2dd80 53 61 76 65 70 6f 69 6e 74 2e 20 41 20 76 61 6c  Savepoint. A val
2dd90 75 65 20 6f 66 20 30 20 6d 65 61 6e 73 20 74 6f  ue of 0 means to
2dda0 20 6f 70 65 72 61 74 65 20 6f 6e 20 74 68 65 20   operate on the 
2ddb0 6f 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f  outermost savepo
2ddc0 69 6e 74 0a 2a 2a 20 28 74 68 65 20 66 69 72 73  int.** (the firs
2ddd0 74 20 63 72 65 61 74 65 64 29 2e 20 41 20 76 61  t created). A va
2dde0 6c 75 65 20 6f 66 20 28 50 61 67 65 72 2e 6e 53  lue of (Pager.nS
2ddf0 61 76 65 70 6f 69 6e 74 2d 31 29 20 6d 65 61 6e  avepoint-1) mean
2de00 73 20 6f 70 65 72 61 74 65 0a 2a 2a 20 6f 6e 20  s operate.** on 
2de10 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c  the most recentl
2de20 79 20 63 72 65 61 74 65 64 20 73 61 76 65 70 6f  y created savepo
2de30 69 6e 74 2e 20 49 66 20 69 53 61 76 65 70 6f 69  int. If iSavepoi
2de40 6e 74 20 69 73 20 67 72 65 61 74 65 72 20 74 68  nt is greater th
2de50 61 6e 0a 2a 2a 20 28 50 61 67 65 72 2e 6e 53 61  an.** (Pager.nSa
2de60 76 65 70 6f 69 6e 74 2d 31 29 2c 20 74 68 65 6e  vepoint-1), then
2de70 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   this function i
2de80 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
2de90 20 49 66 20 61 20 6e 65 67 61 74 69 76 65 20 76   If a negative v
2dea0 61 6c 75 65 20 69 73 20 70 61 73 73 65 64 20 74  alue is passed t
2deb0 6f 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  o this function,
2dec0 20 74 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e   then the curren
2ded0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
2dee0 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
2def0 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65   This is differe
2df00 6e 74 20 74 6f 20 63 61 6c 6c 69 6e 67 20 0a 2a  nt to calling .*
2df10 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
2df20 6c 6c 62 61 63 6b 28 29 20 62 65 63 61 75 73 65  llback() because
2df30 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   this function d
2df40 6f 65 73 20 6e 6f 74 20 74 65 72 6d 69 6e 61 74  oes not terminat
2df50 65 0a 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63  e.** the transac
2df60 74 69 6f 6e 20 6f 72 20 75 6e 6c 6f 63 6b 20 74  tion or unlock t
2df70 68 65 20 64 61 74 61 62 61 73 65 2c 20 69 74 20  he database, it 
2df80 6a 75 73 74 20 72 65 73 74 6f 72 65 73 20 74 68  just restores th
2df90 65 20 0a 2a 2a 20 63 6f 6e 74 65 6e 74 73 20 6f  e .** contents o
2dfa0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
2dfb0 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
2dfc0 74 61 74 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 6e 20  tate. .**.** In 
2dfd0 61 6e 79 20 63 61 73 65 2c 20 61 6c 6c 20 73 61  any case, all sa
2dfe0 76 65 70 6f 69 6e 74 73 20 77 69 74 68 20 61 6e  vepoints with an
2dff0 20 69 6e 64 65 78 20 67 72 65 61 74 65 72 20 74   index greater t
2e000 68 61 6e 20 69 53 61 76 65 70 6f 69 6e 74 20 0a  han iSavepoint .
2e010 2a 2a 20 61 72 65 20 64 65 73 74 72 6f 79 65 64  ** are destroyed
2e020 2e 20 49 66 20 74 68 69 73 20 69 73 20 61 20 72  . If this is a r
2e030 65 6c 65 61 73 65 20 6f 70 65 72 61 74 69 6f 6e  elease operation
2e040 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f   (op==SAVEPOINT_
2e050 52 45 4c 45 41 53 45 29 2c 0a 2a 2a 20 74 68 65  RELEASE),.** the
2e060 6e 20 73 61 76 65 70 6f 69 6e 74 20 69 53 61 76  n savepoint iSav
2e070 65 70 6f 69 6e 74 20 69 73 20 61 6c 73 6f 20 64  epoint is also d
2e080 65 73 74 72 6f 79 65 64 2e 0a 2a 2a 0a 2a 2a 20  estroyed..**.** 
2e090 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 6d 61  This function ma
2e0a0 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  y return SQLITE_
2e0b0 4e 4f 4d 45 4d 20 69 66 20 61 20 6d 65 6d 6f 72  NOMEM if a memor
2e0c0 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69  y allocation fai
2e0d0 6c 73 2c 0a 2a 2a 20 6f 72 20 61 6e 20 49 4f 20  ls,.** or an IO 
2e0e0 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20 61 6e  error code if an
2e0f0 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
2e100 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 20 62   while rolling b
2e110 61 63 6b 20 61 20 0a 2a 2a 20 73 61 76 65 70 6f  ack a .** savepo
2e120 69 6e 74 2e 20 49 66 20 6e 6f 20 65 72 72 6f 72  int. If no error
2e130 73 20 6f 63 63 75 72 2c 20 53 51 4c 49 54 45 5f  s occur, SQLITE_
2e140 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  OK is returned..
2e150 2a 2f 20 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  */ .int sqlite3P
2e160 61 67 65 72 53 61 76 65 70 6f 69 6e 74 28 50 61  agerSavepoint(Pa
2e170 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2e180 20 6f 70 2c 20 69 6e 74 20 69 53 61 76 65 70 6f   op, int iSavepo
2e190 69 6e 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  int){.  int rc =
2e1a0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 61   SQLITE_OK;..  a
2e1b0 73 73 65 72 74 28 20 6f 70 3d 3d 53 41 56 45 50  ssert( op==SAVEP
2e1c0 4f 49 4e 54 5f 52 45 4c 45 41 53 45 20 7c 7c 20  OINT_RELEASE || 
2e1d0 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
2e1e0 4c 4c 42 41 43 4b 20 29 3b 0a 20 20 61 73 73 65  LLBACK );.  asse
2e1f0 72 74 28 20 69 53 61 76 65 70 6f 69 6e 74 3e 3d  rt( iSavepoint>=
2e200 30 20 7c 7c 20 6f 70 3d 3d 53 41 56 45 50 4f 49  0 || op==SAVEPOI
2e210 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 29 3b 0a 0a  NT_ROLLBACK );..
2e220 20 20 69 66 28 20 69 53 61 76 65 70 6f 69 6e 74    if( iSavepoint
2e230 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70 6f  <pPager->nSavepo
2e240 69 6e 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69  int ){.    int i
2e250 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  i;            /*
2e260 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
2e270 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4e  le */.    int nN
2e280 65 77 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ew;          /* 
2e290 4e 75 6d 62 65 72 20 6f 66 20 72 65 6d 61 69 6e  Number of remain
2e2a0 69 6e 67 20 73 61 76 65 70 6f 69 6e 74 73 20 61  ing savepoints a
2e2b0 66 74 65 72 20 74 68 69 73 20 6f 70 2e 20 2a 2f  fter this op. */
2e2c0 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
2e2d0 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 73 61 76  out how many sav
2e2e0 65 70 6f 69 6e 74 73 20 77 69 6c 6c 20 73 74 69  epoints will sti
2e2f0 6c 6c 20 62 65 20 61 63 74 69 76 65 20 61 66 74  ll be active aft
2e300 65 72 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 6f  er this.    ** o
2e310 70 65 72 61 74 69 6f 6e 2e 20 53 74 6f 72 65 20  peration. Store 
2e320 74 68 69 73 20 76 61 6c 75 65 20 69 6e 20 6e 4e  this value in nN
2e330 65 77 2e 20 54 68 65 6e 20 66 72 65 65 20 72 65  ew. Then free re
2e340 73 6f 75 72 63 65 73 20 61 73 73 6f 63 69 61 74  sources associat
2e350 65 64 20 0a 20 20 20 20 2a 2a 20 77 69 74 68 20  ed .    ** with 
2e360 61 6e 79 20 73 61 76 65 70 6f 69 6e 74 73 20 74  any savepoints t
2e370 68 61 74 20 61 72 65 20 64 65 73 74 72 6f 79 65  hat are destroye
2e380 64 20 62 79 20 74 68 69 73 20 6f 70 65 72 61 74  d by this operat
2e390 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
2e3a0 6e 4e 65 77 20 3d 20 69 53 61 76 65 70 6f 69 6e  nNew = iSavepoin
2e3b0 74 20 2b 20 28 6f 70 3d 3d 53 41 56 45 50 4f 49  t + (op==SAVEPOI
2e3c0 4e 54 5f 52 4f 4c 4c 42 41 43 4b 29 3b 0a 20 20  NT_ROLLBACK);.  
2e3d0 20 20 66 6f 72 28 69 69 3d 6e 4e 65 77 3b 20 69    for(ii=nNew; i
2e3e0 69 3c 70 50 61 67 65 72 2d 3e 6e 53 61 76 65 70  i<pPager->nSavep
2e3f0 6f 69 6e 74 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  oint; ii++){.   
2e400 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
2e410 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
2e420 61 53 61 76 65 70 6f 69 6e 74 5b 69 69 5d 2e 70  aSavepoint[ii].p
2e430 49 6e 53 61 76 65 70 6f 69 6e 74 29 3b 0a 20 20  InSavepoint);.  
2e440 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
2e450 6e 53 61 76 65 70 6f 69 6e 74 20 3d 20 6e 4e 65  nSavepoint = nNe
2e460 77 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  w;..    /* If th
2e470 69 73 20 69 73 20 61 20 72 6f 6c 6c 62 61 63 6b  is is a rollback
2e480 20 6f 70 65 72 61 74 69 6f 6e 2c 20 70 6c 61 79   operation, play
2e490 62 61 63 6b 20 74 68 65 20 73 70 65 63 69 66 69  back the specifi
2e4a0 65 64 20 73 61 76 65 70 6f 69 6e 74 2e 0a 20 20  ed savepoint..  
2e4b0 20 20 2a 2a 20 49 66 20 74 68 69 73 20 69 73 20    ** If this is 
2e4c0 61 20 74 65 6d 70 2d 66 69 6c 65 2c 20 69 74 20  a temp-file, it 
2e4d0 69 73 20 70 6f 73 73 69 62 6c 65 20 74 68 61 74  is possible that
2e4e0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
2e4f0 65 20 68 61 73 0a 20 20 20 20 2a 2a 20 6e 6f 74  e has.    ** not
2e500 20 79 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64   yet been opened
2e510 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  . In this case t
2e520 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
2e530 6f 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 20  o changes to.   
2e540 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
2e550 20 66 69 6c 65 2c 20 73 6f 20 74 68 65 20 70 6c   file, so the pl
2e560 61 79 62 61 63 6b 20 6f 70 65 72 61 74 69 6f 6e  ayback operation
2e570 20 63 61 6e 20 62 65 20 73 6b 69 70 70 65 64 2e   can be skipped.
2e580 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2e590 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f 52 4f  op==SAVEPOINT_RO
2e5a0 4c 4c 42 41 43 4b 20 26 26 20 69 73 4f 70 65 6e  LLBACK && isOpen
2e5b0 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 20 29 7b  (pPager->jfd) ){
2e5c0 0a 20 20 20 20 20 20 50 61 67 65 72 53 61 76 65  .      PagerSave
2e5d0 70 6f 69 6e 74 20 2a 70 53 61 76 65 70 6f 69 6e  point *pSavepoin
2e5e0 74 20 3d 20 28 6e 4e 65 77 3d 3d 30 29 3f 30 3a  t = (nNew==0)?0:
2e5f0 26 70 50 61 67 65 72 2d 3e 61 53 61 76 65 70 6f  &pPager->aSavepo
2e600 69 6e 74 5b 6e 4e 65 77 2d 31 5d 3b 0a 20 20 20  int[nNew-1];.   
2e610 20 20 20 72 63 20 3d 20 70 61 67 65 72 50 6c 61     rc = pagerPla
2e620 79 62 61 63 6b 53 61 76 65 70 6f 69 6e 74 28 70  ybackSavepoint(p
2e630 50 61 67 65 72 2c 20 70 53 61 76 65 70 6f 69 6e  Pager, pSavepoin
2e640 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
2e650 28 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45  (rc!=SQLITE_DONE
2e660 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
2e670 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
2e680 72 65 6c 65 61 73 65 20 6f 66 20 74 68 65 20 6f  release of the o
2e690 75 74 65 72 6d 6f 73 74 20 73 61 76 65 70 6f 69  utermost savepoi
2e6a0 6e 74 2c 20 74 72 75 6e 63 61 74 65 20 0a 20 20  nt, truncate .  
2e6b0 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 6a 6f 75    ** the sub-jou
2e6c0 72 6e 61 6c 20 74 6f 20 7a 65 72 6f 20 62 79 74  rnal to zero byt
2e6d0 65 73 20 69 6e 20 73 69 7a 65 2e 20 2a 2f 0a 20  es in size. */. 
2e6e0 20 20 20 69 66 28 20 6e 4e 65 77 3d 3d 30 20 26     if( nNew==0 &
2e6f0 26 20 6f 70 3d 3d 53 41 56 45 50 4f 49 4e 54 5f  & op==SAVEPOINT_
2e700 52 45 4c 45 41 53 45 20 26 26 20 69 73 4f 70 65  RELEASE && isOpe
2e710 6e 28 70 50 61 67 65 72 2d 3e 73 6a 66 64 29 20  n(pPager->sjfd) 
2e720 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
2e730 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
2e740 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2e750 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
2e760 50 61 67 65 72 2d 3e 73 6a 66 64 2c 20 30 29 3b  Pager->sjfd, 0);
2e770 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
2e780 53 75 62 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  SubRec = 0;.    
2e790 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
2e7a0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
2e7b0 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
2e7c0 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  name of the data
2e7d0 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
2e7e0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
2e7f0 33 50 61 67 65 72 46 69 6c 65 6e 61 6d 65 28 50  3PagerFilename(P
2e800 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2e810 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2e820 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a  zFilename;.}../*
2e830 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 56  .** Return the V
2e840 46 53 20 73 74 72 75 63 74 75 72 65 20 66 6f 72  FS structure for
2e850 20 74 68 65 20 70 61 67 65 72 2e 0a 2a 2f 0a 63   the pager..*/.c
2e860 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f 76 66 73  onst sqlite3_vfs
2e870 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 56 66   *sqlite3PagerVf
2e880 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
2e890 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2e8a0 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a  r->pVfs;.}../*.*
2e8b0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 69 6c  * Return the fil
2e8c0 65 20 68 61 6e 64 6c 65 20 66 6f 72 20 74 68 65  e handle for the
2e8d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
2e8e0 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74  ssociated.** wit
2e8f0 68 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68  h the pager.  Th
2e900 69 73 20 6d 69 67 68 74 20 72 65 74 75 72 6e 20  is might return 
2e910 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 69 6c 65  NULL if the file
2e920 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79 65 74 20   has.** not yet 
2e930 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a  been opened..*/.
2e940 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 71  sqlite3_file *sq
2e950 6c 69 74 65 33 50 61 67 65 72 46 69 6c 65 28 50  lite3PagerFile(P
2e960 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
2e970 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
2e980 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fd;.}../*.** Ret
2e990 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
2e9a0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
2e9b0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
2e9c0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
2e9d0 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
2e9e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
2e9f0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
2ea00 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
2ea10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
2ea20 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
2ea30 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
2ea40 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
2ea50 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
2ea60 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
2ea70 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
2ea80 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
2ea90 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
2eaa0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2eab0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
2eac0 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  oSync;.}..#ifdef
2ead0 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
2eae0 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  C./*.** Set the 
2eaf0 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
2eb00 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
2eb10 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
2eb20 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
2eb30 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
2eb40 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
2eb50 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
2eb60 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
2eb70 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
2eb80 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
2eb90 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
2eba0 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
2ebb0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
2ebc0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
2ebd0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
2ebe0 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74  e the page pPg t
2ebf0 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
2ec00 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  in the file..**.
2ec10 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
2ec20 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
2ec30 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  o the page previ
2ec40 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
2ec50 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20  .** pgno (which 
2ec60 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20  we call pPgOld) 
2ec70 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65  though that page
2ec80 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
2ec90 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20  e.** in cache.  
2eca0 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76  If the page prev
2ecb0 69 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61  iously located a
2ecc0 74 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c  t pgno is not al
2ecd0 72 65 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20  ready.** in the 
2ece0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2ecf0 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20  , it is not put 
2ed00 74 68 65 72 65 20 62 79 20 62 79 20 74 68 69 73  there by by this
2ed10 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20   routine..**.** 
2ed20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  References to th
2ed30 65 20 70 61 67 65 20 70 50 67 20 72 65 6d 61 69  e page pPg remai
2ed40 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e  n valid. Updatin
2ed50 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61  g any.** meta-da
2ed60 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  ta associated wi
2ed70 74 68 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74  th pPg (i.e. dat
2ed80 61 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20  a stored in the 
2ed90 6e 45 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20  nExtra bytes.** 
2eda0 61 6c 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20  allocated along 
2edb0 77 69 74 68 20 74 68 65 20 70 61 67 65 29 20 69  with the page) i
2edc0 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
2edd0 6c 69 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c  lity of the call
2ede0 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e  er..**.** A tran
2edf0 73 61 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  saction must be 
2ee00 61 63 74 69 76 65 20 77 68 65 6e 20 74 68 69 73  active when this
2ee10 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
2ee20 65 64 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62  ed. It used to b
2ee30 65 0a 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68  e.** required th
2ee40 61 74 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74  at a statement t
2ee50 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e  ransaction was n
2ee60 6f 74 20 61 63 74 69 76 65 2c 20 62 75 74 20 74  ot active, but t
2ee70 68 69 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a  his restriction.
2ee80 2a 2a 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f  ** has been remo
2ee90 76 65 64 20 28 43 52 45 41 54 45 20 49 4e 44 45  ved (CREATE INDE
2eea0 58 20 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20  X needs to move 
2eeb0 61 20 70 61 67 65 20 77 68 65 6e 20 61 20 73 74  a page when a st
2eec0 61 74 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73  atement.** trans
2eed0 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
2eee0 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  )..**.** If the 
2eef0 66 6f 75 72 74 68 20 61 72 67 75 6d 65 6e 74 2c  fourth argument,
2ef00 20 69 73 43 6f 6d 6d 69 74 2c 20 69 73 20 6e 6f   isCommit, is no
2ef10 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69  n-zero, then thi
2ef20 73 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 0a  s page is being.
2ef30 2a 2a 20 6d 6f 76 65 64 20 61 73 20 70 61 72 74  ** moved as part
2ef40 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 20 72   of a database r
2ef50 65 6f 72 67 61 6e 69 7a 61 74 69 6f 6e 20 6a 75  eorganization ju
2ef60 73 74 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  st before the tr
2ef70 61 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 69 73  ansaction .** is
2ef80 20 62 65 69 6e 67 20 63 6f 6d 6d 69 74 74 65 64   being committed
2ef90 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
2efa0 69 74 20 69 73 20 67 75 61 72 61 6e 74 65 65 64  it is guaranteed
2efb0 20 74 68 61 74 20 74 68 65 20 64 61 74 61 62 61   that the databa
2efc0 73 65 20 70 61 67 65 20 0a 2a 2a 20 70 50 67 20  se page .** pPg 
2efd0 72 65 66 65 72 73 20 74 6f 20 77 69 6c 6c 20 6e  refers to will n
2efe0 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ot be written to
2eff0 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
2f000 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  is transaction..
2f010 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
2f020 69 6f 6e 20 6d 61 79 20 72 65 74 75 72 6e 20 53  ion may return S
2f030 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 6f 72 20 61  QLITE_NOMEM or a
2f040 6e 20 49 4f 20 65 72 72 6f 72 20 63 6f 64 65 20  n IO error code 
2f050 69 66 20 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 6f  if an error.** o
2f060 63 63 75 72 73 2e 20 4f 74 68 65 72 77 69 73 65  ccurs. Otherwise
2f070 2c 20 69 74 20 72 65 74 75 72 6e 73 20 53 51 4c  , it returns SQL
2f080 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 69 6e 74 20 73  ITE_OK..*/.int s
2f090 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
2f0a0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
2f0b0 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
2f0c0 50 67 6e 6f 20 70 67 6e 6f 2c 20 69 6e 74 20 69  Pgno pgno, int i
2f0d0 73 43 6f 6d 6d 69 74 29 7b 0a 20 20 50 67 48 64  sCommit){.  PgHd
2f0e0 72 20 2a 70 50 67 4f 6c 64 3b 20 20 20 20 20 20  r *pPgOld;      
2f0f0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
2f100 70 61 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77  page being overw
2f110 72 69 74 74 65 6e 2e 20 2a 2f 0a 20 20 50 67 6e  ritten. */.  Pgn
2f120 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d  o needSyncPgno =
2f130 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6c 64   0;       /* Old
2f140 20 76 61 6c 75 65 20 6f 66 20 70 50 67 2d 3e 70   value of pPg->p
2f150 67 6e 6f 2c 20 69 66 20 73 79 6e 63 20 69 73 20  gno, if sync is 
2f160 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 69 6e  required */.  in
2f170 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
2f180 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2f190 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20  turn code */..  
2f1a0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
2f1b0 66 3e 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  f>0 );..  /* If 
2f1c0 74 68 65 20 70 61 67 65 20 62 65 69 6e 67 20 6d  the page being m
2f1d0 6f 76 65 64 20 69 73 20 64 69 72 74 79 20 61 6e  oved is dirty an
2f1e0 64 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 20 73  d has not been s
2f1f0 61 76 65 64 20 62 79 20 74 68 65 20 6c 61 74 65  aved by the late
2f200 73 74 0a 20 20 2a 2a 20 73 61 76 65 70 6f 69 6e  st.  ** savepoin
2f210 74 2c 20 74 68 65 6e 20 73 61 76 65 20 74 68 65  t, then save the
2f220 20 63 75 72 72 65 6e 74 20 63 6f 6e 74 65 6e 74   current content
2f230 73 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 6e  s of the page in
2f240 74 6f 20 74 68 65 20 0a 20 20 2a 2a 20 73 75 62  to the .  ** sub
2f250 2d 6a 6f 75 72 6e 61 6c 20 6e 6f 77 2e 20 54 68  -journal now. Th
2f260 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 74  is is required t
2f270 6f 20 68 61 6e 64 6c 65 20 74 68 65 20 66 6f 6c  o handle the fol
2f280 6c 6f 77 69 6e 67 20 73 63 65 6e 61 72 69 6f 3a  lowing scenario:
2f290 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 42 45 47  .  **.  **   BEG
2f2a0 49 4e 3b 0a 20 20 2a 2a 20 20 20 20 20 3c 6a 6f  IN;.  **     <jo
2f2b0 75 72 6e 61 6c 20 70 61 67 65 20 58 2c 20 74 68  urnal page X, th
2f2c0 65 6e 20 6d 6f 64 69 66 79 20 69 74 20 69 6e 20  en modify it in 
2f2d0 6d 65 6d 6f 72 79 3e 0a 20 20 2a 2a 20 20 20 20  memory>.  **    
2f2e0 20 53 41 56 45 50 4f 49 4e 54 20 6f 6e 65 3b 0a   SAVEPOINT one;.
2f2f0 20 20 2a 2a 20 20 20 20 20 20 20 3c 4d 6f 76 65    **       <Move
2f300 20 70 61 67 65 20 58 20 74 6f 20 6c 6f 63 61 74   page X to locat
2f310 69 6f 6e 20 59 3e 0a 20 20 2a 2a 20 20 20 20 20  ion Y>.  **     
2f320 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 3b  ROLLBACK TO one;
2f330 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 70 61  .  **.  ** If pa
2f340 67 65 20 58 20 77 65 72 65 20 6e 6f 74 20 77 72  ge X were not wr
2f350 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 75 62  itten to the sub
2f360 2d 6a 6f 75 72 6e 61 6c 20 68 65 72 65 2c 20 69  -journal here, i
2f370 74 20 77 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a  t would not.  **
2f380 20 62 65 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   be possible to 
2f390 72 65 73 74 6f 72 65 20 69 74 73 20 63 6f 6e 74  restore its cont
2f3a0 65 6e 74 73 20 77 68 65 6e 20 74 68 65 20 22 52  ents when the "R
2f3b0 4f 4c 4c 42 41 43 4b 20 54 4f 20 6f 6e 65 22 0a  OLLBACK TO one".
2f3c0 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 77    ** statement w
2f3d0 65 72 65 20 69 73 20 70 72 6f 63 65 73 73 65 64  ere is processed
2f3e0 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 73 75 62 6a  ..  **.  ** subj
2f3f0 6f 75 72 6e 61 6c 50 61 67 65 28 29 20 6d 61 79  ournalPage() may
2f400 20 6e 65 65 64 20 74 6f 20 61 6c 6c 6f 63 61 74   need to allocat
2f410 65 20 73 70 61 63 65 20 74 6f 20 73 74 6f 72 65  e space to store
2f420 20 70 50 67 2d 3e 70 67 6e 6f 20 69 6e 74 6f 0a   pPg->pgno into.
2f430 20 20 2a 2a 20 6f 6e 65 20 6f 72 20 6d 6f 72 65    ** one or more
2f440 20 73 61 76 65 70 6f 69 6e 74 20 62 69 74 76 65   savepoint bitve
2f450 63 73 2e 20 54 68 69 73 20 69 73 20 74 68 65 20  cs. This is the 
2f460 72 65 61 73 6f 6e 20 74 68 69 73 20 66 75 6e 63  reason this func
2f470 74 69 6f 6e 0a 20 20 2a 2a 20 6d 61 79 20 72 65  tion.  ** may re
2f480 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
2f490 4d 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  M..  */.  if( pP
2f4a0 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52 5f 44  g->flags&PGHDR_D
2f4b0 49 52 54 59 20 0a 20 20 20 26 26 20 73 75 62 6a  IRTY .   && subj
2f4c0 52 65 71 75 69 72 65 73 50 61 67 65 28 70 50 67  RequiresPage(pPg
2f4d0 29 0a 20 20 20 26 26 20 53 51 4c 49 54 45 5f 4f  ).   && SQLITE_O
2f4e0 4b 21 3d 28 72 63 20 3d 20 73 75 62 6a 6f 75 72  K!=(rc = subjour
2f4f0 6e 61 6c 50 61 67 65 28 70 50 67 29 29 0a 20 20  nalPage(pPg)).  
2f500 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
2f510 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52  ;.  }..  PAGERTR
2f520 41 43 45 28 28 22 4d 4f 56 45 20 25 64 20 70 61  ACE(("MOVE %d pa
2f530 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d  ge %d (needSync=
2f540 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c  %d) moves to %d\
2f550 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52  n", .      PAGER
2f560 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
2f570 3e 70 67 6e 6f 2c 20 28 70 50 67 2d 3e 66 6c 61  >pgno, (pPg->fla
2f580 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2f590 4e 43 29 3f 31 3a 30 2c 20 70 67 6e 6f 29 29 3b  NC)?1:0, pgno));
2f5a0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56  .  IOTRACE(("MOV
2f5b0 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70  E %p %d %d\n", p
2f5c0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2f5d0 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 2f 2a 20 49  , pgno))..  /* I
2f5e0 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65  f the journal ne
2f5f0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 28 29  eds to be sync()
2f600 65 64 20 62 65 66 6f 72 65 20 70 61 67 65 20 70  ed before page p
2f610 50 67 2d 3e 70 67 6e 6f 20 63 61 6e 0a 20 20 2a  Pg->pgno can.  *
2f620 2a 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 2c  * be written to,
2f630 20 73 74 6f 72 65 20 70 50 67 2d 3e 70 67 6e 6f   store pPg->pgno
2f640 20 69 6e 20 6c 6f 63 61 6c 20 76 61 72 69 61 62   in local variab
2f650 6c 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  le needSyncPgno.
2f660 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 74 68  .  **.  ** If th
2f670 65 20 69 73 43 6f 6d 6d 69 74 20 66 6c 61 67 20  e isCommit flag 
2f680 69 73 20 73 65 74 2c 20 74 68 65 72 65 20 69 73  is set, there is
2f690 20 6e 6f 20 6e 65 65 64 20 74 6f 20 72 65 6d 65   no need to reme
2f6a0 6d 62 65 72 20 74 68 61 74 0a 20 20 2a 2a 20 74  mber that.  ** t
2f6b0 68 65 20 6a 6f 75 72 6e 61 6c 20 6e 65 65 64 73  he journal needs
2f6c0 20 74 6f 20 62 65 20 73 79 6e 63 28 29 65 64 20   to be sync()ed 
2f6d0 62 65 66 6f 72 65 20 64 61 74 61 62 61 73 65 20  before database 
2f6e0 70 61 67 65 20 70 50 67 2d 3e 70 67 6e 6f 20 0a  page pPg->pgno .
2f6f0 20 20 2a 2a 20 63 61 6e 20 62 65 20 77 72 69 74    ** can be writ
2f700 74 65 6e 20 74 6f 2e 20 54 68 65 20 63 61 6c 6c  ten to. The call
2f710 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 70  er has already p
2f720 72 6f 6d 69 73 65 64 20 6e 6f 74 20 74 6f 20 77  romised not to w
2f730 72 69 74 65 20 74 6f 20 69 74 2e 0a 20 20 2a 2f  rite to it..  */
2f740 0a 20 20 69 66 28 20 28 70 50 67 2d 3e 66 6c 61  .  if( (pPg->fla
2f750 67 73 26 50 47 48 44 52 5f 4e 45 45 44 5f 53 59  gs&PGHDR_NEED_SY
2f760 4e 43 29 20 26 26 20 21 69 73 43 6f 6d 6d 69 74  NC) && !isCommit
2f770 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63   ){.    needSync
2f780 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  Pgno = pPg->pgno
2f790 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 61  ;.    assert( pa
2f7a0 67 65 49 6e 4a 6f 75 72 6e 61 6c 28 70 50 67 29  geInJournal(pPg)
2f7b0 20 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3e 70 50   || pPg->pgno>pP
2f7c0 61 67 65 72 2d 3e 64 62 4f 72 69 67 53 69 7a 65  ager->dbOrigSize
2f7d0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2f7e0 70 50 67 2d 3e 66 6c 61 67 73 26 50 47 48 44 52  pPg->flags&PGHDR
2f7f0 5f 44 49 52 54 59 20 29 3b 0a 20 20 20 20 61 73  _DIRTY );.    as
2f800 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
2f810 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20  edSync );.  }.. 
2f820 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
2f830 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65   contains a page
2f840 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
2f850 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69  r pgno, remove i
2f860 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20  t.  ** from its 
2f870 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
2f880 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
2f890 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
2f8a0 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
2f8b0 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
2f8c0 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
2f8d0 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
2f8e0 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
2f8f0 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
2f900 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
2f910 70 50 67 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 50  pPg->flags &= ~P
2f920 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b 0a  GHDR_NEED_SYNC;.
2f930 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72    pPgOld = pager
2f940 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
2f950 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28  pgno);.  assert(
2f960 20 21 70 50 67 4f 6c 64 20 7c 7c 20 70 50 67 4f   !pPgOld || pPgO
2f970 6c 64 2d 3e 6e 52 65 66 3d 3d 31 20 29 3b 0a 20  ld->nRef==1 );. 
2f980 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20   if( pPgOld ){. 
2f990 20 20 20 70 50 67 2d 3e 66 6c 61 67 73 20 7c 3d     pPg->flags |=
2f9a0 20 28 70 50 67 4f 6c 64 2d 3e 66 6c 61 67 73 26   (pPgOld->flags&
2f9b0 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 29  PGHDR_NEED_SYNC)
2f9c0 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
2f9d0 50 63 61 63 68 65 4d 6f 76 65 28 70 50 67 2c 20  PcacheMove(pPg, 
2f9e0 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
2f9f0 4f 6c 64 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Old ){.    sqlit
2fa00 65 33 50 63 61 63 68 65 44 72 6f 70 28 70 50 67  e3PcacheDrop(pPg
2fa10 4f 6c 64 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  Old);.  }..  sql
2fa20 69 74 65 33 50 63 61 63 68 65 4d 61 6b 65 44 69  ite3PcacheMakeDi
2fa30 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67  rty(pPg);.  pPag
2fa40 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
2fa50 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
2fa60 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
2fa70 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
2fa80 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
2fa90 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
2faa0 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
2fab0 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
2fac0 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
2fad0 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
2fae0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
2faf0 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
2fb00 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
2fb10 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
2fb20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
2fb30 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
2fb40 20 0a 20 20 20 20 2a 2a 20 22 69 73 20 6a 6f 75   .    ** "is jou
2fb50 72 6e 61 6c 65 64 22 20 62 69 74 76 65 63 20 66  rnaled" bitvec f
2fb60 6c 61 67 20 68 61 73 20 62 65 65 6e 20 73 65 74  lag has been set
2fb70 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
2fb80 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 0a 20  be remedied by. 
2fb90 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 20 74 68     ** loading th
2fba0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
2fbb0 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
2fbc0 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
2fbd0 72 2e 6e 65 65 64 53 79 6e 63 20 0a 20 20 20 20  r.needSync .    
2fbe0 2a 2a 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  ** flag..    **.
2fbf0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74      ** If the at
2fc00 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68  tempt to load th
2fc10 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
2fc20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73  page-cache fails
2fc30 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f  , (due.    ** to
2fc40 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
2fc50 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61  O failure), clea
2fc60 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65  r the bit in the
2fc70 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20   pInJournal[].  
2fc80 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65    ** array. Othe
2fc90 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61  rwise, if the pa
2fca0 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64  ge is loaded and
2fcb0 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69   written again i
2fcc0 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72  n.    ** this tr
2fcd0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
2fce0 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  y be written to 
2fcf0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2fd00 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  e before.    ** 
2fd10 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74  it is synced int
2fd20 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
2fd30 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74  le. This way, it
2fd40 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20   may end up in. 
2fd50 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
2fd60 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75  l file twice, bu
2fd70 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
2fd80 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a  problem..    **.
2fd90 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
2fda0 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
2fdb0 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
2fdc0 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
2fdd0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
2fde0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
2fdf0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
2fe00 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
2fe10 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64      PgHdr *pPgHd
2fe20 72 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  r;.    assert( p
2fe30 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
2fe40 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2fe50 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
2fe60 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
2fe70 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20  , &pPgHdr);.    
2fe80 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2fe90 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  K ){.      if( p
2fea0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
2feb0 6c 20 26 26 20 6e 65 65 64 53 79 6e 63 50 67 6e  l && needSyncPgn
2fec0 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 4f 72 69  o<=pPager->dbOri
2fed0 67 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  gSize ){.       
2fee0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 6c   sqlite3BitvecCl
2fef0 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  ear(pPager->pInJ
2ff00 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e 63  ournal, needSync
2ff10 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Pgno);.      }. 
2ff20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
2ff30 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
2ff40 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
2ff50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2ff60 65 72 2d 3e 6e 6f 53 79 6e 63 3d 3d 30 20 26 26  er->noSync==0 &&
2ff70 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 20 20 70   !MEMDB );.    p
2ff80 50 67 48 64 72 2d 3e 66 6c 61 67 73 20 7c 3d 20  PgHdr->flags |= 
2ff90 50 47 48 44 52 5f 4e 45 45 44 5f 53 59 4e 43 3b  PGHDR_NEED_SYNC;
2ffa0 0a 20 20 20 20 73 71 6c 69 74 65 33 50 63 61 63  .    sqlite3Pcac
2ffb0 68 65 4d 61 6b 65 44 69 72 74 79 28 70 50 67 48  heMakeDirty(pPgH
2ffc0 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  dr);.    sqlite3
2ffd0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
2ffe0 72 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  r);.  }..  retur
2fff0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
30000 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  endif../*.** Ret
30010 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
30020 20 74 68 65 20 64 61 74 61 20 66 6f 72 20 74 68   the data for th
30030 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67 65  e specified page
30040 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
30050 65 33 50 61 67 65 72 47 65 74 44 61 74 61 28 44  e3PagerGetData(D
30060 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 61  bPage *pPg){.  a
30070 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
30080 3e 30 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65  >0 || pPg->pPage
30090 72 2d 3e 6d 65 6d 44 62 20 29 3b 0a 20 20 72 65  r->memDb );.  re
300a0 74 75 72 6e 20 70 50 67 2d 3e 70 44 61 74 61 3b  turn pPg->pData;
300b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
300c0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
300d0 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20 62  e Pager.nExtra b
300e0 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22 20  ytes of "extra" 
300f0 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61  space .** alloca
30100 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
30110 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61 67  he specified pag
30120 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  e..*/.void *sqli
30130 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72 61  te3PagerGetExtra
30140 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
30150 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
30160 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
30170 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f 70  return (pPager?p
30180 50 67 2d 3e 70 45 78 74 72 61 3a 30 29 3b 0a 7d  Pg->pExtra:0);.}
30190 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74 20  ../*.** Get/set 
301a0 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65  the locking-mode
301b0 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e   for this pager.
301c0 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64 65   Parameter eMode
301d0 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a 20   must be one.** 
301e0 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  of PAGER_LOCKING
301f0 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47 45  MODE_QUERY, PAGE
30200 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f  R_LOCKINGMODE_NO
30210 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47 45  RMAL or .** PAGE
30220 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
30230 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65 20  CLUSIVE. If the 
30240 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f 74  parameter is not
30250 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a 2a   _QUERY, then.**
30260 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
30270 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  e is set to the 
30280 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64 2e  value specified.
30290 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
302a0 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69 74  ned value is eit
302b0 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  her PAGER_LOCKIN
302c0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a  GMODE_NORMAL or.
302d0 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  ** PAGER_LOCKING
302e0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c 20  MODE_EXCLUSIVE, 
302f0 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20 63  indicating the c
30300 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c 79  urrent (possibly
30310 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f 63   updated).** loc
30320 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e  king-mode..*/.in
30330 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
30340 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72 20  ckingMode(Pager 
30350 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d 6f  *pPager, int eMo
30360 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 65  de){.  assert( e
30370 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
30380 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20 20  INGMODE_QUERY.  
30390 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
303a0 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
303b0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20  GMODE_NORMAL.   
303c0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
303d0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
303e0 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
303f0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
30400 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55  R_LOCKINGMODE_QU
30410 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72  ERY<0 );.  asser
30420 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  t( PAGER_LOCKING
30430 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26  MODE_NORMAL>=0 &
30440 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  & PAGER_LOCKINGM
30450 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d 30  ODE_EXCLUSIVE>=0
30460 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
30470 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74  =0 && !pPager->t
30480 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 70  empFile ){.    p
30490 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
304a0 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
304b0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
304c0 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c  int)pPager->excl
304d0 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  usiveMode;.}../*
304e0 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
304f0 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72  journal-mode for
30500 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
30510 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
30520 74 20 62 65 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 0a  t be one of:.**.
30530 2a 2a 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52  **    PAGER_JOUR
30540 4e 41 4c 4d 4f 44 45 5f 51 55 45 52 59 0a 2a 2a  NALMODE_QUERY.**
30550 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
30560 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 0a 2a 2a 20  LMODE_DELETE.** 
30570 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c     PAGER_JOURNAL
30580 4d 4f 44 45 5f 54 52 55 4e 43 41 54 45 0a 2a 2a  MODE_TRUNCATE.**
30590 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
305a0 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 2a 2a  LMODE_PERSIST.**
305b0 20 20 20 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41      PAGER_JOURNA
305c0 4c 4d 4f 44 45 5f 4f 46 46 0a 2a 2a 20 20 20 20  LMODE_OFF.**    
305d0 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
305e0 45 5f 4d 45 4d 4f 52 59 0a 2a 2a 0a 2a 2a 20 49  E_MEMORY.**.** I
305f0 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20  f the parameter 
30600 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74  is not _QUERY, t
30610 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d  hen the journal-
30620 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
30630 68 65 0a 2a 2a 20 76 61 6c 75 65 20 73 70 65 63  he.** value spec
30640 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ified..**.** The
30650 20 72 65 74 75 72 6e 65 64 20 69 6e 64 69 63 61   returned indica
30660 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  te the current (
30670 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
30680 29 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a  ) journal-mode..
30690 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
306a0 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50  gerJournalMode(P
306b0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
306c0 74 20 65 4d 6f 64 65 29 7b 0a 20 20 69 66 28 20  t eMode){.  if( 
306d0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 61 73  !MEMDB ){.    as
306e0 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47  sert( eMode==PAG
306f0 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51  ER_JOURNALMODE_Q
30700 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20 20  UERY.           
30710 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47     || eMode==PAG
30720 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44  ER_JOURNALMODE_D
30730 45 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 20  ELETE.          
30740 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41      || eMode==PA
30750 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
30760 54 52 55 4e 43 41 54 45 0a 20 20 20 20 20 20 20  TRUNCATE.       
30770 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d         || eMode=
30780 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
30790 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 20  DE_PERSIST.     
307a0 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64           || eMod
307b0 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e==PAGER_JOURNAL
307c0 4d 4f 44 45 5f 4f 46 46 20 0a 20 20 20 20 20 20  MODE_OFF .      
307d0 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65          || eMode
307e0 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
307f0 4f 44 45 5f 4d 45 4d 4f 52 59 20 29 3b 0a 20 20  ODE_MEMORY );.  
30800 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
30810 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45 52  JOURNALMODE_QUER
30820 59 3c 30 20 29 3b 0a 20 20 20 20 69 66 28 20 65  Y<0 );.    if( e
30830 4d 6f 64 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20  Mode>=0 ){.     
30840 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
30850 4d 6f 64 65 20 3d 20 28 75 38 29 65 4d 6f 64 65  Mode = (u8)eMode
30860 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
30870 20 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65     assert( eMode
30880 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ==PAGER_JOURNALM
30890 4f 44 45 5f 51 55 45 52 59 20 29 3b 0a 20 20 20  ODE_QUERY );.   
308a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
308b0 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f 75  (int)pPager->jou
308c0 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a  rnalMode;.}../*.
308d0 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20 73  ** Get/set the s
308e0 69 7a 65 2d 6c 69 6d 69 74 20 75 73 65 64 20 66  ize-limit used f
308f0 6f 72 20 70 65 72 73 69 73 74 65 6e 74 20 6a 6f  or persistent jo
30900 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a  urnal files..*/.
30910 69 36 34 20 73 71 6c 69 74 65 33 50 61 67 65 72  i64 sqlite3Pager
30920 4a 6f 75 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74  JournalSizeLimit
30930 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
30940 69 36 34 20 69 4c 69 6d 69 74 29 7b 0a 20 20 69  i64 iLimit){.  i
30950 66 28 20 69 4c 69 6d 69 74 3e 3d 2d 31 20 29 7b  f( iLimit>=-1 ){
30960 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
30970 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 20 3d 20  rnalSizeLimit = 
30980 69 4c 69 6d 69 74 3b 0a 20 20 7d 0a 20 20 72 65  iLimit;.  }.  re
30990 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6a 6f 75  turn pPager->jou
309a0 72 6e 61 6c 53 69 7a 65 4c 69 6d 69 74 3b 0a 7d  rnalSizeLimit;.}
309b0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
309c0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
309d0 70 50 61 67 65 72 2d 3e 70 42 61 63 6b 75 70 20  pPager->pBackup 
309e0 76 61 72 69 61 62 6c 65 2e 20 54 68 65 20 62 61  variable. The ba
309f0 63 6b 75 70 20 6d 6f 64 75 6c 65 0a 2a 2a 20 69  ckup module.** i
30a00 6e 20 62 61 63 6b 75 70 2e 63 20 6d 61 69 6e 74  n backup.c maint
30a10 61 69 6e 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  ains the content
30a20 20 6f 66 20 74 68 69 73 20 76 61 72 69 61 62 6c   of this variabl
30a30 65 2e 20 54 68 69 73 20 6d 6f 64 75 6c 65 0a 2a  e. This module.*
30a40 2a 20 75 73 65 73 20 69 74 20 6f 70 61 71 75 65  * uses it opaque
30a50 6c 79 20 61 73 20 61 6e 20 61 72 67 75 6d 65 6e  ly as an argumen
30a60 74 20 74 6f 20 73 71 6c 69 74 65 33 42 61 63 6b  t to sqlite3Back
30a70 75 70 52 65 73 74 61 72 74 28 29 20 61 6e 64 0a  upRestart() and.
30a80 2a 2a 20 73 71 6c 69 74 65 33 42 61 63 6b 75 70  ** sqlite3Backup
30a90 55 70 64 61 74 65 28 29 20 6f 6e 6c 79 2e 0a 2a  Update() only..*
30aa0 2f 0a 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70  /.sqlite3_backup
30ab0 20 2a 2a 73 71 6c 69 74 65 33 50 61 67 65 72 42   **sqlite3PagerB
30ac0 61 63 6b 75 70 50 74 72 28 50 61 67 65 72 20 2a  ackupPtr(Pager *
30ad0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
30ae0 6e 20 26 70 50 61 67 65 72 2d 3e 70 42 61 63 6b  n &pPager->pBack
30af0 75 70 3b 0a 7d 0a 0a 23 65 6e 64 69 66 20 2f 2a  up;.}..#endif /*
30b00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53   SQLITE_OMIT_DIS
30b10 4b 49 4f 20 2a 2f 0a                             KIO */.